1.定义一个类的时候,我们显式或隐式指定该类的对象在拷贝、移动、赋值和销毁时做什么。
? ?一个类通过以下五种特殊成员函数来控制这些操作:拷贝构造函数、拷贝赋值运算符、析构函数、
? ?移动构造函数和移动赋值运算符。其中后两类是在C++11中新增的。这些操作统称为拷贝控制操作。
? ?这些拷贝控制操作如果用户不显式定义,编译器会帮用户定义,但编译器版本的行为可能就不能如用户所愿了。
2.默认初始化:定义一个变量时(或者说一个对象时),如果没有指定初值,则它会被执行"默认初始化"。
? ?默认值是什么由各个变量的(对象的)类型决定。
3.默认构造函数:控制一个类型的默认初始化的构造函数。
4.合成的默认构造函数:编译器帮用户创建的默认构造函数。它会优先使用类内初始值为对象的各个成员赋初值。
? ?否则会要求对象的各个成员执行其各自的默认初始化。注意,只有在该类型里没有任何其他构造函数时,
? ?编译器才会帮用户创建"合成的默认构造函数"。
5.如果一个构造函数的第一个参数是自身类类型的引用,并且任何额外参数都有默认值,那么这个构造函数是拷贝构造函数。
6.拷贝构造函数的以一个参数往往都是得自身类型的const的引用,而且拷贝构造函数往往都不是explicit的。
7.与默认构造函数不同,即使类中定义了其他构造函数,在没有定义拷贝构造函数时,编译器也会帮用户定义合成拷贝构造函数。
8.那么什么是"拷贝"呢?鄙人认为本书中的"拷贝"一词往往等价于’ = ‘,即使用了’ = ‘的操作就是一次拷贝操作。
? ?所以可以粗略的认为,拷贝初始化就是用’ = ‘来初始化对象的初始化。
? ?直接初始化就是没用’ = ‘来初始化对象的初始化。呵呵。
9.一般情况下,合成拷贝构造函数所做的事情,就是将其参数的非static成员逐一拷贝到正在创建的对象的各个对应成员当中去。
? ?每个成员的类型决定了如何进行拷贝:类类型用其拷贝构造函数进行拷贝;内置类型直接进行拷贝。
? ?数组本来是不能拷贝的,但在这里,是数组的成员可以分解为一个一个的单独元素拷贝过去,
? ?单个元素的拷贝方式则由元素的种类决定。
10.直接初始化和拷贝初始化的区别在现在更加明晰了。直接初始化,其实调用的是该类型的全部构造
? ???函数里与所提供参数最匹配的那个构造函数,而拷贝初始化其实是调用了该类型的拷贝构造函数,
? ???执行它,并在’ = ‘左边和右边的对象类型不同的时候进行类型转化。
11.除了使用’ = '定义变量(对象)时使用了拷贝初始化,在以下4种情况下也使用了拷贝初始化:
? ???1将一个对象作为实参传递给非引用的形参 2从一个返回类型为非应用的函数返回一个对象
? ???3用花括号列表来初始化一个数组中的元素或一个聚合类中的成员
? ???4容器调用insert和push等类似的成员来为容器添加元素时
12.使用emplace的操作来向容器里添加元素时,使用的是直接初始化而不是拷贝初始化。这是C++11新增的操作。
13.在拷贝初始化时,编译器可以忽略和绕开拷贝构造函数,并在实际上执行直接初始化。但是,
? ???这不意味着这个类型的拷贝构造函数可以不存在(比如,它不能是private的)。