C++ Primer 有感(复制控制)
1.不管类是否定义了自己的析构函数,编译器都 自动执行类中非static数据成员的析构函数。
2.如果我们没有定义复制构造函数,编译器就会为我们合成一个。合成复制构造函数的行为是,执行逐个成员初始化,将新对象初始化为原对象的副本。
所谓“逐个成员”,指的是编译器将现有对象的每个非static成员,依次复制到正创建的对象。合成复制构造函数直接复制内置类型成员的值,类类型成员使用该类的复制构造函数进行复制。数组成员的复制是一个例外。虽然一般不能复制数组,但如果一个类具有数组成员,则合成复制构造函数键复制数组。复制数组时合成复制构造函数将复制数组的每一个元素。(注意指针类型)
3.复制构造函数的参数一般是const的引用。合成的复制构造函数只完成必要的工作。只包含类类型成员或内置类型(但不包括指针类型)成员的类,无须显式的定义复制构造函数,也可以复制。
4.为防止复制,类必须显式声明其复制构造函数为private。类的友元和成员仍可以进行复制。如果想要连友元和成员总的复制也禁止,就可以声明一个(private)复制构造函数当不对其定义。声明而不定义成员函数时合法的,但是,使用未定义成员的任何尝试将导致链接失败。
注意:不允许复制的类对象只能作为引用传递给函数或从函数返回,它们从不能用作容器的元素。
5.合成赋值操作符它会执行逐个成员 赋值:右操作数对象的每个成员赋值给左操作数对象的对应成员。除数组之外,每个成员用所属类型的常规方式进行赋值。对于数组,给每个数组元素赋值。
6.撤销一个容器(不管是标准库容器还是内置数组)时,也会运行容器中的类类型元素的析构函数。容器中的元素总是按逆序撤销:首先撤销下标为size()-1的元素,然后是下标为size()-2 的元素......直至最后撤销下标为0的元素。
7.不管怎样,编译器总是会为我们合成一个析构函数。合成析构函数按对象创建时的逆序撤销每个非static成员,因此,它按成员在类中声明次序的逆序撤销成员。对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。(撤销内置类型成员或复合类型的成员没有什么影响。尤其是,合成析构函数并不删除指针成员所指向的对象)
8.因为不能指定任何形参,所以不能重载析构函数。虽然可以为一个类定义多个构造函数,但只能提供一个析构函数,应用于类的所有对象。
析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,合成的析构函数仍然运行。即:用户自己定义了析构函数,合成的析构函数仍然运行。且先运行自己定义的析构函数再运行合成的析构函数。