类设计的回顾

1、编译器生成的成员函数

(1)、默认构造函数

        默认构造函数要么没有参数,要么所以的参数都有默认值。如果没有定义任何构造函数,编译器将定义默认构造函数,让您能够创建对象。例如,假设Star是一个类,则下述代码需要使用默认构造函数:

Star rigel;

Star pleiades[6];

       自动生成的默认构造函数的另一项功能是,调用基类的默认构造函数以及调用本身是对象的成员所属类的默认构造函数。

       另外,如果派生类构造函数的成员初始化列表中没有显示调用基类构造函数,则编译器将使用基类的默认构造函数来构造派生类对象的基类部分。在这种情况下,如果基类没有构造函数,将导致编译阶段错误。

        如果定义了某种构造函数,编译器将不会定义默认构造函数。在这种情况下,如果需要默认构造函数,则必须自己提供。

        提供构造函数的动机之一是确保对象总能被正确的初始化。另外,如果类包含指针成员,则必须初始化这些成员。因此,最好提供一个显示默认构造函数,将所有的类数据成员都初始化为合理的值。

(2)、复制构造函数

复制构造函数接受其所属类的对象作为参数,例如,Star类的复制构造函数的原型如下:

Star(const Star &)

在下述情况下,将使用复制构造函数:

(1)、将新对象初始化为一个同类对象;

(2)、按值将对象传递给函数;

(3)、函数按值返回对象;

(4)、编译器生成临时对象;

        如果程序没有使用(显示或隐式)复制构造函数,编译器将提供原型,但不提供函数定义;否则,程序将定义一个执行成员初始化的复制构造函数。也就是说,新对象的每个成员都被初始化为原始对象相应成员的值。如果成员为类对象,则初始化该成员时,将使用相应类的复制构造函数。

        在某些情况下,成员初始化是不合适的。例如,使用new初始化的成员指针通常要求执行深复制,或者类可能包含需要修改的静态变量。在上述情况下,需定义自己的复制构造函数。

3、赋值运算符

        默认的复制运算符用于处理同符号对象之间的赋值。不要将赋值与初始化混淆了。如果语句创建新的对象,则使用初始化;如果语句修改已有对象的值,则是赋值;

        默认赋值为成员赋值。如果成员为类对象,则默认成员赋值将使用相应类的赋值运算符。如果需要显示定义赋值构造函数,则基于相同的原因,也需要显示定义赋值运算符。Star类的赋值运算符的原型如下:

Star & Star::operator=(const Star &);

        赋值运算符函数返回一个Star对象引用。

        编译器不会生成将一种类型赋值给另一个类型的赋值运算符。如果需要需显示定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值