一、const
1、放在成员函数列表的后面
2、const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修饰
Date* const this---->const Date* const this
3、所有不修改的成员函数都需要加,可以检查出将‘==’写成‘=’导致的错误
二、取地址运算符重载
取地址运算符重载分为普通取地址重载和const取地址重载,一般这两个编译器自动生成的就够我们使用了,不需要显示实现。除非有坏心思,不想让别人取到当前类的地址,就可以自己实现并胡乱返回一个地址
下面是这两个函数(一般不用写)
那么就来说说怎么使坏吧,下面呢是正常地址
如果我们这样做
那么
就会返回一个错误的地址了,就可以整蛊同学/事了。
三、类型转换
2构造一个A的临时对象,再用这个临时对象拷贝构造aa2,编译器遇到连续构造+拷贝构造————>优化为直接拷贝
四、再探构造函数
1、初始化列表以一个冒号开始,接着是以一个逗号分隔的数据成员列表,每个成员变量后面跟着一个放在括号中的初始值或表达式
下面这两个必须在初始化列表中,还有一个是没有合适默认构造函数可用。其他的可以函数体也可以初始化列表,两者也可以同时出现
2、
每个成员变量在初始化列表中只能出现一次
3、有的的变量也可以不初始化
结果就是
4、再看下面这个图
这依然是声明,不是定义,后面的1是缺省值 ,给初始化列表使用
5、尽可能使用初始化列表
每个成员都要走初始化列表
1>在初始化列表初始化的成员
2>没有在初始化列表的成员
a.声明的地方有缺省值用缺省值
b.没有缺省值
x.内置类型:不确定,看编译器,大概率随机值
y.自定义类型:调用默认构造,没有默认构造就编译报错
3>引用const没有默认构造自定义 必须在初始化列表初始化
6、初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的先后顺序无关。建议声明顺序和在初始化列表的顺序保持一致 。看下面这个题
这段代码先声明了_a2,先走,_a2(_a1),而此时_a1还未初始化,所以是随机值,再走,_a1(a),a是1则_a1的值为1
trying to do better!!!