using std::cout;//全部文件使用的cout来自std std::cout << "hello" << std::endl;//用的地方指定 using namespace std;//把std所有的命名空间全部引入
对const修饰的变量取地址的时候,会分配临时内存(一般来说分配了内存就可以通过指针改,但是这个临时的内存改了没有意义)
const前加入关键字external后也会分配内存,(这里通过指针改会报错)
使用变量初始化const的变量可以通过指针修改
自定义的数据类型也可以通过指针修改
c中的const可以改(针对直接赋值)
编译器看到a就会到文字常量区的符号表找到key值为a的value替代,类似于宏定义,不同的是宏定义是在预处理阶段,const处理是在编译阶段
枚举的增强:c中可以用int表示(含义不清)
int &是引用的数据类型,就是别名;
通过引用,在函数传参的时候可以用引用做形参接收,回避了传指针的麻烦;
引用的本质:int *const p(常指针,内容可变,p值不变)
引用一定要定义的时候初始化,跟const一样
引用的大小和指针一样
int *const p=&a
有关常指针:数组为例
引用作为函数的返回值:
引用作为返回值,不要返回局部变量的引用
如果是在堆上开辟的,或者是static定义的局部变量可以返回
函数可以作为左值(如果函数返回值是指针,他也是返回的是数值,不能作为左值,但是引用可以)
指针引用
const 修饰引用(可以通过指针修改)
编译器自动调用
编译器自动生成空的无参构造和析构
在公共作用域下
构造:没有返回值,也不用写void,跟类名写法一样,可以重载
析构:函数名前加~
拷贝构造函数(就是拷贝一个对象):传的是同类对象的引用,防止修改要加const
调用:
拷贝构造函数的调用时机
构造函数的调用规则
为什么要在类外初始化:
访问方式
单例模式:
全局函数作为友元函数
友元类
同理也可以是指成员函数,作为另一个类的友元;
加运算符:分别利用成员函数,和全局函数
左移运算符重载
递增运算符重载++
前置++:一般放在成员函数,考虑到一直要操作,所以要返回引用,例如:++(++a)
- - 后置++:返回的是临时变量,本体内部已经记录了;临时变量方法调用完会回收,所以不能返回引用;
由于后置++产生了临时副本,所以为了效率考虑,推荐日常使用前置++;
指针运算符重载-智能指针
赋值运算符重载
[]运算符重载
关系运算符重载
函数调用运算符重载
不要重载逻辑与和逻辑或符号:因为没法实现短路的效果
子类默认走父类的无参构造,但是可以利用初始化列表指定要走的父类构造函数(类似于java中的super):
子类不继承父类的构造函数和析构函数,只有父类才知道怎么样构造和析构自己的属性
继承中的同名成员处理
继承中的同名静态成员处理
多继承的语法
菱形继承问题以及解决
使用虚继承处理两份数据的问题(二义性,浪费内存)
虚继承的内部工作原理剖析
-动态联编,通过虚函数实现-
与函数模板的区别:
泛型编程:体现在模板技术;特点是将类型参数化;
类模板中的成员函数创建时机
类模板作为函数参数
类模板碰到继承的问题以及解决
类模板的类外实现
类模板的分文件编写问题以及解决
类模板碰到友元函数
类模板案例—数组类封装
- 自定义类型 支持继承类对象的,指针,引用间的转换;
- 没有继承关系的不支持
动态转换(严谨)
类型转换-常量类型
重新解释类型转换(不安全,不建议用)
异常的基本语法
抛出自定义异常:跟java不一样,不用继承exception的父类
栈解旋
异常的接口声明
异常变量的生命周期
用指针接收,匿名对象走完本行没有变量接收就会回收,指针就变成野指针(接收匿名对象的地址没有用)
异常变量如果抛出有接收的话,在抛出的函数体内创建的对象不会释放(即使是创建在栈上,创建在堆上的更不会),他的生命周期跑到了catch的函数体里;不像函数返回值(会在本函数结束的时候释放栈里的内容),理解:一个抛字,抛出去了就不规我管了。
异常的多态使用
使用C++系统标准异常类
编写自己的异常类(继承系统的)
标准输入流
理解:cin就是键盘的缓冲区(输入的数据现在缓冲区,cin.get就是在这个缓冲区拿);同理cout也有缓冲区,endl会刷新缓冲区,并加上\n换行符;
标准输出流
格式化输出(成员函数法)
文件的读写
-遍历的三种方式:第三种用到里系统的算法要引入algorithm库
queue队列容器:只能访问到队头和队尾,中间的部分访问不到,所以依然不能遍历(没有迭代器);
list容器(物理不连续–双向循环链表)
set容器(自动排序),序列式容器
multiset允许有重复值
对组的声明方式
判断是否插入成功,返回值也是对组pair(set);但是mutilset不反回对组
对于是不能修改里面的元素,所以不能修改排序规则,但是在插入元素之前,可以指定好set的排序规则;
仿函数类似于python中的闭包:
map容器
插入方式:
STL容器使用时机
函数对象(仿函数):本质是一个类
谓词
内建函数对象 引入functional头文件
- 函授对象适配器 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181031210915439.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/2018103121054477.png)
取反适配器
函数指针适配器(上面都是针对函数对象的,这是针对函数的)
- 将函数指针适配成函数对象
成员函数适配器
find(针对对象):找自定义类型,要在自定义类型里面重载==操作符
find_if(针对指针):自己定义条件:可以用适配器,和仿函数
adjacent_find
binary_search:需要有序序列才能用
count
count_if(按条件统计,回调或者仿函数的返回值是bool)
merge:把两个有序的合并
sort:
random_shuffle:随机打乱
reverse
set_intersection
set_union
set_difference:A与B的差集,和B与A的差集不一样