C++ DAY7
一、类模板
建立一个通用的类,其类中的类型不确定,用一个虚拟类型替代
template<typename T>
类template ----->表示开始创建模板
typename -->表明后面的符号是数据类型,typename 也可以用class代替
T ----->表示数据类型,可以其他符号代替
使用类模板的时候,需要表明模板参数类型
#include <iostream>using namespace std;//声明创建类模板
template <typename T, typename N>
class A
{
private:T n;N b;
public:A(){}A(T n, N b):n(n),b(b){}void show(){cout << n << endl;cout << b << endl;}
};int main()
{A<string,int> a("zhangsan",1001);//使用类模板的时候,需要表明模板参数类型a.show();A<int, char> b(34,'w');b.show();return 0;
}
二、异常
更优雅的解决代码中的问题和异常,可以发现异常并处理进行分开
#include <iostream>using namespace std;int fun(int a, int b)
{if(b!=0){return a/b;}else{throw -1;}
}int main()
{try{fun(9,0); //把可能出现异常的代码用try包裹起来cout << "hello world" << endl;}catch(int e){if(e == -1){cout << "分母不能为0" << endl;}}return 0;
}
三、auto关键字
用来修饰变量,作为自动类型推导,推导出变量的数据类型
注意
1> 使用auto修饰变量时,必须初始化
2> auto的右值,可以是右值,也可以是表达式,还可以是函数的返回值
3> auto不能直接声明数组
4> auto不能作为函数的形参
5> auto不能修饰非静态成员
主要用于修饰冗长的数据类型,使用在函数模板中,依赖模板参数的变量。
四、lambda表达式
当你需要一个匿名的、临时的、需要获得外界变量的函数时,可以用lambda来完成。
#include <iostream>int main() {int a = 1, b = 2;// 值捕获auto sum1 = [a, b]() { return a + b; };std::cout << "sum1: " << sum1() << std::endl;// 引用捕获,由于是引用,出了作用域也会修改a、b值auto sum2 = [&a, &b]() { return a + b; };std::cout << "sum2: " << sum2() << std::endl;// 混合捕获auto sum3 = [a, &b]() { return a + b; };std::cout << "sum3: " << sum3() << std::endl;// 值捕获,但使用mutable使其可修改 出了作用域后不修改值auto sum4 = [a, b]() mutable { a = a + 1; return a + b; };std::cout << "sum4: " << sum4() << std::endl;// 指定返回类型auto sum5 = [a, b]() -> int { return a + b; };std::cout << "sum5: " << sum5() << std::endl;return 0;
}
五、数据库类型转换
1>隐式类型转换(自动类型转换)
这是C++编译器自动执行的类型转换,通常在表达式中出现时发生。例如,将较小的整数转换为较大的整数类型,将整数提升为浮点数等。
2>显示类型转换(强制类型转换)
通过使用强制类型转换操作符来显示执行类型转换。这种转换可能会导致数据的截断或者精度丢失,因此要小心使用。
(1)静态转换(static_cast)
用于基本数据类型之间的转换
以及父类指针/引用转换为子类指针/引用
还可以用于不同类型的指针之间的转换
double num_double = 3.14;
int num_int = static_cast<int>(num_double); // 显式将double转换为int
(2)动态转换(dynamic_cast)
通常用于多态类之间的指针或引用类型转换,确保类型安全。在运行时进行类型检查,只能用于具有虚函数的类之间的转换
class Base {virtual void foo() {}
};
class Derived : public Base {};Base* base_ptr = new Derived;
Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr); // 显式将基类指针转换为派生类指针
(3)常量转换(const_cast)
用于添加或移除指针或引用的常量性。它可以用来去除const限定符,但要注意潜在的未定义行为
const int a =10; //
int *p;
p = &a; // 合不合法? no//如果能这样使用,那就可以通过指针取值去改const修饰的值了,这就和const修饰相悖了
**************************************const int num_const = 5;
int* num_ptr = const_cast<int*>(&num_const); // 去除const限定符
(4)重新解释转换(reinterpret_cast)
执行低级别的位模式转换,通常用于指针之间的类型转换。它可能导致未定义行为,因此要谨慎使用
int num = 42;
float* float_ptr = reinterpret_cast<float*>(&num); // 重新解释转换
3>c风格类型转换
可以使用C样式转换
int num_int = 10;
double num_double = (double)num_int; // C样式强制类型转换
函数样式转换:C++中使用的类型转换
int num_int = 10;
double num_double = double(num_int); // C++函数样式类型转换
在使用强转的时候要注意潜在问题和错误,保证操作是安全的。
关键字总结
63个关键字,红色(不包括class,class是修改之前的错误)的32个是c中的关键字
1>
asm
1:这是一个用于嵌入汇编语言代码的关键字。它允许你在C++代码中直接插入汇编指令,通常用于执行特定的底层操作。然而,由于现代C++提供了更强大的抽象和跨平台性,通常不建议使用这个关键字。
explicit
2:这个关键字通常用于禁止隐式类型转换的发生。当一个构造函数被声明为explicit时,它将不会在隐式类型转换中被调用,只能在显式构造函数调用中使用。
export
3:在C++中,export关键字用于指示一个模板的定义将在另一个文件中实例化。然而,在实际的C++标准中,export关键字的语法并未最终确认,并且在许多编译器中也未被实现。在C++20中,export被重新引入,但是它的主要用途是与模块化编程相关,而不是之前模板实例化的用法。
goto
4:goto是一个跳转语句,允许你无条件地将程序的控制转移到指定的标签处。然而,由于使用goto会导致代码结构变得混乱和难以维护,现代编程实践通常建议避免使用它。
register
5:在早期的C语言标准中,register关键字用于建议编译器将变量存储在寄存器中,以便提高访问速度。然而,现代编译器已经能够智能地管理寄存器分配,所以使用register关键字通常不再有明显的性能提升,并且在C++17中已被弃用。
volatile
6:volatile关键字用于告诉编译器不要对标记为volatile的变量进行优化,因为这些变量的值可能会在未知的时间被外部因素改变,比如硬件中断或多线程环境中的共享变量。这可以防止编译器对这些变量的读取和写入操作进行优化,以确保程序的行为是可预测的。2> 数据类型相关的关键字
bool、true、false:对于bool类型数据的相关处理,值为true和false
char、wchar_t:char是单字符数据,wchar_t多字符数据
int、short、float、double、long:整数和实数的数据类型
signed、unsigned:定义有符号和无符号数据的说明符
auto:在c语言中,是存储类型,但是在C++中,是类型自动推导,注意事项有两个:
i> 连续定义多个变量时,初始值必须是相同数据类型,否则报错
ii> auto p=&m; 与auto* p = &m;规定是一样
explicit:防止数据隐式转换
typedef:类型重定义
sizeof:求数据类型的字节运算3> 语句相关的关键字
switch、case、default:实现多分支选择结构
do、while、for:循环相关的关键字
break、continue、goto:跳转语句
if、else:选择结构
inline:内联函数
return:函数返回值4> 存储类型相关的关键字
static、const、volatile、register、extern、auto5> 构造数据类型相关
struct、union:结构体和共用体
enum:枚举
class:类6> 访问权限:public、protected、private7> 异常处理:throw、try、catch8> 类中相关使用关键字
this:指代自己的指针
friend:友元
virtual:虚
delete、default:对类的特殊成员函数的相关使用
例如:Test(const Test &) = default; ~Test() = delete;
mutable:取消常属性
using:引入数据,有三种使用方式
i> 使用命名空间的关键字
ii> 相当于类型重定义
iii> 修改子类中从父类继承下来成员的权限
operator:运算符重载关键字9> 类型转换相关的关键字
static_cast、dynamic_cast、const_cast、reinterpret_cast10> 模板相关的关键字:template、typename11> 命名空间相关:using、namespace12> export:导入相关模板类使用13> 内存分配和回收:new、delete
六、C++标准模板库(STL)
标准模板库中使用了大量的函数模板和类模板,来对数据结构和算法的处理。
STL主要由 容器、算法、迭代器组成。
容器:置物之所也
数组、链表、队列、栈、集合。。。
算法:问题之解法也
增、删、改、查
迭代器:是容器和算法之间的粘合剂 (== 指针)
6.1vector
类似于数组、也可称之为单端数组
和普通数组的区别:普通数组是静态空间,vector是动态拓展。
动态拓展:不是在原来空间后续接空间,而是重新申请更大的空间,将原来的数据拷贝到新的空间中。
vector的构造函数
vector v;//无参构造
vector(v.begin(),v.end()); //将区间[begin(),end()),拷贝给本身
vector(const vector& v); //将v拷贝给本身
vector(n, elem) ; //将n个elem拷贝给本身
#include <iostream>
#include <vector>using namespace std;//算法
void printVector(vector<int> &v)
{vector<int>::iterator iter; //定义了这样容器类型的迭代器for(iter = v.begin(); iter != v.end(); iter++){cout << *iter << " ";}cout << endl;
}int main()
{//容器vector<int> v; //无参构造函数v.push_back(10); //尾插v.push_back(20);v.push_back(30);v.push_back(40);//算法printVector(v);vector<int> v2(v.begin(),v.end());printVector(v2);vector<int> v3(6,100);printVector(v3);vector<int> v4 = v3;printVector(v4);vector<int> v5(v2);printVector(v5);return 0;
}
vector的赋值函数
vector &operator = (const vector &v);//将v赋值给本身
assign(beg,end); //将区间[begin(),end())赋值给本身
assign(n, elem); //将n个elem赋值给本
vector容量大小
empty(); //判断容器是否为空
capacity() ; //计算容器的容量大小
size(); //计算容器大小 ---- 容器的元素个数
resize(); //重新设置大小
vector的插入和删除
push_back(); //尾插
pop_back(); //尾删
insert(iterator pos,elem) //在迭代器指向的位置,插入数据
insert(iterator pos,n, elem) //在迭代器指向的位置,插入n个数据
erase(iterator pos); //删除迭代器指向元素
erase(iterator start, iterator end); //删除区间的元素
clear() ; //删除容器中所有的元素
vector的元素提取
at(int idx);
operator[](int idx);
front(); //返回第一个元素
back(); //返回最后一个元素
七、文件操作
由于程序运行时的数据都是历史数据,程序一旦结束,数据就会消失
头文件: #include<fstream>
文件操作的三大类
读文件:ifstream
写文件:ofstream
读写:fstream
7.1写入数据
1.包含头文件
#include
2.创建流对象
ofstream ofs;
3.打开文件
ofs.open("文件名",打开方式);
4.写入数据
ofs
5.关闭文件
ofs.close();
7.2读文件
1.包含头文件
#include
2.创建流对象
ifstream ifs;
3.打开文件
ifs.open("文件名",打开方式);
试编程:
封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象(至少3个)
再把该容器中的对象,保存到文件中。
再把这些学生从文件中读取出来,放入另一个容器中并且遍历输出该容器里的学生。
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
using namespace std;class Stu {
private:int classnum;int grade;string name;
public:Stu() {}Stu(int class_num, int grade, string name) : classnum(class_num), grade(grade), name(name) {}void set(int i, int g) {classnum = i;grade = g;}void name_set(string n) { name = n; }friend void ofs(vector<Stu>& p);
};void ofs(vector<Stu>& p) {ofstream ofs;ofs.open("F:/test.txt", ios::out);for (const auto& student : p) {ofs << student.classnum << ' ' << student.grade << ' ' << student.name << endl;}ofs.close();
}int main() {vector<Stu> p;for (int i = 0, j = 1; i < 2; i++, j++) {Stu student;student.set(i, j);if (0 == i) {student.name_set("lisi");} else if (1 == i) {student.name_set("zhangsan");}p.push_back(student);}ofs(p);return 0;
}
list相关函数
#include <iostream>
#include <list>int main() {// 默认构造函数std::list<int> lst1;// 初始化列表构造函数std::list<int> lst2 = {1, 2, 3};// 拷贝构造函数std::list<int> lst3(lst2);// 填充构造函数std::list<int> lst4(3, 10); // 3个元素,每个元素都是10// 赋值操作lst1 = lst2;// assign函数lst1.assign({4, 5, 6});lst2.assign(3, 7); // 3个元素,每个元素都是7// 输出lst1for (std::list<int>::iterator it = lst1.begin(); it != lst1.end(); ++it) {int x = *it;std::cout << x << ' ';}std::cout<<std::endl;// 输出lst2for (std::list<int>::iterator it = lst2.begin(); it != lst2.end(); ++it) {int x = *it;std::cout << x << ' ';}return 0;
}
相关文章:

C++ DAY7
一、类模板 建立一个通用的类,其类中的类型不确定,用一个虚拟类型替代 template<typename T> 类template ----->表示开始创建模板 typename -->表明后面的符号是数据类型,typename 也可以用class代替 T ----->表示数据类型…...

Vue2 使用插件 Volar 报错:<template v-for> key should be placed on the <template> tag.
目录 问题描述 版本描述 问题定位 问题解决 VS Code 插件地址 问题描述 在 VS Code 上使用插件 Volar 开发 Vue3 项目,然后去改 Vue2 项目时,对没有放在<template v-for> 元素上的 :key,会提示 <template v-for> key should…...

启动线程方法 start ()和 run ()有什么区别
在Java中,线程可以通过调用start()方法或者直接调用run()方法来执行。这两种方式有着重要的区别: start() 方法:当你调用线程的start()方法时,它会使线程进入就绪状态,等待系统调度。系统会为该线程分配资源,并在合适的时机执行线程的run()方法。实际上,start()方法会启…...

Java的全排列模板
c有全排列函数,我们Java没有,所以我们只能自己手写了。 模板一:(不去重) import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class liyunpeng {public static void main(Stri…...

读书笔记——《万物有灵》
前言 上一本书是《走出荒野》,太平洋步道女王提到了这本书《万物有灵》,她同样是看一点撕一点的阅读。我想,在她穿越山河森林,听见鸟鸣溪流的旅行过程中,是不是看这本描写动物有如何聪明的书——《万物有灵》…...

面试现场表现:展示你的编程能力和沟通技巧
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

34亿的mysql表如何优雅的扩字段长度兵并归档重建
业务背景: 该系统有一张表数据量已达到34亿,并且有个字段长度不够,导致很多数据无法插入。因为业务只要保留近2个月数据即可,所以需要接下来需要做2点:1,扩字段长度 2,只保留近2个月的数据。 …...

C#_进程单例模式.秒懂Mutex
什么是Mutex? 可以定义调用线程是否具有互斥性,程序创建者拥有控制权,相反只能引用程序。 参数1:如果是程序创建者,就获得控制权。 参数2:名称,可使用GUID生成。 参数3:out 返回值…...

AcWing 5050. 排序 (每日一题)
题目描述 给定一个长度为 n 的由小写字母构成的字符串。 请你按照 a∼z 的顺序,对字符串内的字符进行重新排序,并输出重新排序后的字符串。 输入格式 第一行包含整数 T ,表示共有 T 组测试数据。 每组数据第一行包含整数 n 。 第二行包…...

【TypeScript】proxy 和 Reflect
proxy (代理) 和 Reflect (反射) 参数一样。 基本用法 let person { name: xx, age: 20} // proxy 支持对象,数组,函数,set,map // 代理对象的常用模式:前面一个对象&…...

STM32f103入门(5)定时器中断
STM32 TIM(定时器/计数器)模块的中断流程如下: 配置TIM寄存器:首先,通过配置TIM相关的寄存器来设置计时器的基本参数,例如预分频系数、计数模式、计数器周期等。 使能TIM中断:使用TIM_ITConfig函…...

Mybatis查询数据
上一篇我们介绍了在pom文件中引入mybatis依赖,配置了mybatis配置文件,通过读取配置文件创建了会话工厂,使用会话工厂创建会话获取连接对象读取到了数据库的基本信息。 如果您需要对上面的内容进行了解,可以参考Mybatis引入与使用…...

【前车之鉴】: 2023最新教程-将java程序打包到maven私服的正确打开方式,详细流程介绍不怕你掌握不了
文章目录 为什么看这篇整体流程1. 注册账号【首次需要】2. 工单申请【新项目必须】3. 项目配置【新项目必须】4. 授权认证【新项目必须】5. 一键发布 最后也很重要 为什么看这篇 一是当前网络上一些博客有遗漏部分,这里做补充,二是网上思路没错ÿ…...
如何理解IaaS、PaaS、SaaS?盘点受欢迎的八大SaaS平台!
如何理解IaaS、PaaS、SaaS?他们各自的优势在哪里?我们又应该如何选择?本篇将带大家深入浅出的了解IaaS、PaaS、SaaS,并为大家盘点2023最受欢迎的SaaS平台。 通过本文你将了解: IaaS、PaaS、SaaS分别是什么我们该如何理…...

立创EDA专业版的原理图上器件有一个虚线框
立创EDA专业版的原理图上器件有一个虚线框解决方法 问题分析: 在使用立创EDA专业版 设计电路原理图时,中途莫名其妙就给我的元件添加了下面图片所示的虚线外框。看着就很别扭的样子,而且工程大了和器件稍微布局比较密的时候就导致整体很难看…...

JUC并发编程--------基础篇
一、多线程的相关知识 栈与栈帧 我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟 机就会为其分配一块栈内存。 每个栈由多个栈帧(Frame)组成…...

秒懂算法2
视频链接 : 希望下次秒懂的是算法题_哔哩哔哩_bilibili P1094 [NOIP2007 普及组] 纪念品分组 原题链接 : [NOIP2007 普及组] 纪念品分组 - 洛谷 思路 : 排序 贪心 双指针首先先对输入进来的数组进行排序(由小到大)运用贪心的思想 : 前后结合,令l1,rn,若a[l]a[r]<w…...

隐秘的角落:Java连接Oracle提示Connection timed out
前言 这个报错相信各位后端开发都不陌生,大体的原因就那么几种: 检查网络连接:确保您的计算机与数据库服务器之间的网络连接正常。尝试通过其他方式验证您的网络连接是否正常。 检查数据库服务器状态:确保数据库服务器正在运行&…...

基于微信小程序的餐厅预订系统的设计与实现(论文+源码)_kaic
摘 要 随着消费升级,越来越多的年轻人已经开始不再看重餐饮等行业的服务,而是追求一种轻松自在的用餐、购物环境。因此,无人餐厅、无人便利店、无人超市等一些科技消费场所应势而生。餐饮企业用工荒已成为不争的事实。服务员行业的低保障、低…...

科技政策 | 四川省科学技术厅关于发布2024年第一批省级科技计划项目申报指南的通知
原创 | 文 BFT机器人 近日,四川省科学技术厅发布了2024年第一批省级科技计划项目申报指南;其中包括自然科学基金项目、重点研发计划、科技成果转移转化引导计划、科技创新基地(平台)和人才计划。 01 自然科学基金项目 实施周期 …...

深入了解Webpack:特性、特点和结合JS混淆加密的实例
Webpack是现代前端开发中最受欢迎的构建工具之一,其强大的特性和灵活性使得开发者能够更有效地管理和优化项目资源。在本文中,我们将深入探讨Webpack的特性和特点,并结合实例演示如何使用Webpack与JS混淆加密相结合。Webpack的特性和特点 1.…...

2023-08-23力扣每日一题
链接: 1782. 统计点对的数目 题意: 给n个点和m条无向边(可重复),q个查询 定义edge[a]为一个点是a的边数量,定义ret[a,b]是edge[a]edge[b]-(a与b的边) q个查询q个答案࿰…...

分发饼干【贪心算法】
分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个…...

为什么网络互联地址设置为30位地址
对于点对点链路,为了节约IPv4地址,一般为其分配/30地址块,这样包含4个地址:最小地址作为网络地址,最大地址作为广播地址,剩余两个可分配地址,分配给链路两端的接口,这是最普遍的方法…...

青少年棒球锦标赛发展·棒球1号位
青少年棒球锦标赛发展 1. 青少年棒球锦标赛简介 青少年棒球锦标赛是一个令人兴奋的国际性比赛,每年都有来自世界各地的优秀青少年棒球选手参加。这个锦标赛旨在提供一个展示青少年棒球选手的技能和才华的平台,同时也是为了推动棒球在全球范围内的普及和…...

Unity实现UI图片面板滚动播放效果第二弹
效果: 场景结构: 特殊物体:panel下面用排列组件horizent layout group放置多个需要显示的面板,用mask遮罩好。 主要思路: 这次是要在最后一个toggle的地方,依然向左滚动回1,这是难点。因此实际…...

Redis的基本操作
文章目录 1.Redis简介2.Redis的常用数据类型3.Redis的常用命令1.字符串操作命令2.哈希操作命令3.列表操作命令4.集合操作命令5.有序集合操作命令6.通用操作命令 4.Springboot配置Redis1.导入SpringDataRedis的Maven坐标2.配置Redis的数据源3.编写配置类,创还能Redis…...

省级智慧农业大数据平台项目规划建设方案[195页Word]
导读:原文《省级智慧农业大数据平台项目规划建设方案[195页Word]》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 1 农业大数据平台项目概述 1.1 建设…...

php图片批量压缩并同时保持清晰度
php图片压缩可以通过GD库来实现。以下是一个使用GD库进行图片压缩的示例代码: // 原始图片路径 $sourceImage path/to/source/image.jpg; // 压缩后保存的路径及文件名 $compressedImage path/to/compressed/image.jpg; // 压缩后的图片质量(1-100&…...

243:vue+Openlayers 更改鼠标滚轮缩放地图大小,每次缩放小一点
第243个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayers项目中设置鼠标滚轮缩放地图大小,每次滑动一格滚轮,设定的值非默认值1。具体的设置方法,参考源代码。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源…...