本文主要讨论C++类定义中的拷贝控制(copy control):拷贝构造函数、赋值操作符和析构函数。
如果文中有错误或遗漏之处,敬请指出,谢谢!输出结果为:(MinGW 2.05和VC6.0)Contructorcopy Contructorcopy Contructorcopy Contructorcopy Contructorcopy Contructor
对于元素为类类型的数组,可以使用数组初始化列表来提供显示元素初始化。此时,使用拷贝初始化来初始化每个元素。根据指定值创建适当类型的元素,然后用拷贝构造函数将该值拷贝到相应元素。当然,同前面一样,是否跳过拷贝构造函数取决于编译器(事实上,大多数编译器跳过了这步)。 拷贝构造函数的形参是一个类类型引用(否则,参数本身就需要过拷贝构造函数了),但一般情况下,我们使用const修饰。并且,一般不应该设置为explicit。 有时需要禁止拷贝类,例如,iostream类就不允许拷贝。这时,应当显示声明拷贝构造函数为private,此时可以不定义该函数。若声明为private且进行了函数定义,则类的友元和成员仍然可以进行拷贝。 注意:声明而不定义成员函数是合法的,但是,使用未定义成员的任何尝试将导致链接失败。 合成的拷贝构造函数 如果我们没有定义拷贝构造函数,则编译器会自动生成一个,把这个自动生成的拷贝构造函数叫合成的拷贝构造函数(Synthesized Copy Constructor)。合成的拷贝构造函数执行逐个成员初始化,将新对象初始化为原对象的副本。如果成员是内置类型,则执行位拷贝;如果成员是类类型,则调用相应的拷贝构造函数;如果成员是数组类型,则分别对每个数组元素进制拷贝。 赋值操作符 赋值操作符的右操作数一般以const引用传递,为了与内置类型的行为一致,常返回该类类型的引用。通常,拷贝构造函数和赋值操作符是同时出现的,定义了一个就应当定义另一个。 赋值操作符一个必须小心的地方时检查自赋值。 析构函数 三法则(rule of three):如果类需要自定义析构函数,则它往往也需要拷贝构造函数和赋值操作符。 合成的析构函数按成员在类中声明次序的逆序来撤销成员。 析构函数与拷贝构造函数或者赋值操作符之间的一个重要区别是:即使我们编写了自己的析构函数,在自定义析构函数运行结束后,合成析构函数仍然将继续运行,它来完成成员数据的撤销工作。