禁止转换的发生。
引用成员变量,const成员变量,没有默认构造的类型变量必须用初始化列表初始化
每个类都必须有一个拷贝初始化构造函数,如果类中没有说明拷贝构造函数,则编译器系统会自动生成一个缺省拷贝构造函数,作为该类的保护成员
没开空间,相当于缺省值。
初始化列表的顺序是跟声明顺序一致的,也是内存存储的先后顺序。
局部 + static:变量不销毁,只初始化一次
全局 / 函数 + static:只能本文件用
类成员 + static:属于类,所有对象共享
static 一写,就归类管,
所有对象共享,
不占对象空间,
变量要类外初始化,
函数不能碰普通成员。
析构顺序b>a>d>c。
编译器习惯想上找,需要有前置声明
sum为solution服务
匿名对象用作单独的函数调用非常方便,上面是有名对象,下面是匿名对象,匿名对象的生命周期只在当前这一行。
sort默认为是升序,需要在第三个参数调整
后两者直接构造省去了拷贝,是编译器特有的优化行为。
正常先析构aa再析构临时拷贝生成的对象。
省区了临时对象没aa,直接构造临时对象。
省去了ret的构造,直接把aa的内存放到了ret上。
A(int a) // ① 构造 aa
A(const A& aa) // ② 拷贝构造返回值临时对象
~A() // ③ 析构 aa
A& operator=() // ④ 临时对象赋值给 ret
~A() // ⑤ 析构临时对象
Print()
~A() // ⑥ 析构 ret
aa没在f2调用结束后析构,充当了临时对象。