一、默认构造函数
默认构造函数要么没有参数,或者所有的参数都有默认值。如果没有定义任何构造函数,编译器将自动生成,这样才可以创建对象。
Simple sigle;
Simple hr[9];
将自动调用默认构造函数。
自动生成的默认构造函数:调用基类的默认构造函数以及调用本身是对象的成员所属类的默认构造函数。
如果派生类构造函数的成员初始化列表,没有显式的调用基类构造函数,则编译器将默认使用基类的构造函数来构造派生类对象的剩余部分。如果基类没有默认构造函数,将导致编译阶段错误。
如果定义了某种构造函数,是某种,定义了一个后,编译器将不在生成默认构造函数。这种情况下,如果还是需要默认构造函数,需要自己定义。默认构造函数是指无参或者所有参数都有默认值得构造函数。
提供构造函数的动机之一是确保了对象总能被正确的初始化。此外,如果类中包含了指针成员,则必须初始化这些成员。因此最好提供一个显式的默认构造函数,以便类中所有的数据成员都可以初始化为合理的值。
二、复制构造函数
复制构造函数接受其所属类的对象作为参数。
Star(const Star&)
使用复制构造函数的情形:
将新对象初始化为一个同类的对象;
按值将对象传递给函数;
函数按值返回对象;
编译器生成临时对象。
如果程序没有显式或者隐式的使用复制构造函数,编译器将提供原型,但不提供函数定义。
如果成员为类对象,则初始化该成员时,将使用相应类的复制构造函数。
很多时候,成员初始化是不适合的。需要自己显式的定义复制构造函数。使用new初始化的成员指针通常要求执行深复制,或者类中包含需要修改的静态变量。比如:引用计数。这种情况下,需要自己定义复制构造函数。
三、赋值运算符
默认的赋值运算符处理同类对象之间的赋值。
赋值与初始化的区别:
语句创建新的对象,则是初始化;如果语句修改了已有对象的值,则是赋值。
Star sirius;
Star alpha = sirius; 初始化
Star dogstar;
dogstar = sirius; 赋值
如果需要显示的定义复制构造函数,则基于相同的原因,也需要显式的定义赋值运算符。
Star& Star::operator=(const Star&);