《C++类设计常用的指导原则》

下面介绍一些C++类设计常用的指导原则:
13.8.1 编译器生成的成员函数
1.默认构造函数
(1) 默认构造函数要么没有参数,要么参数都有默认值。如果未定义任何构造函数,编译器将定义默认构造函数,让你能够创建对象,或者调用基类默认构造函数及本身是对象的成员所属类的默认构造函数。
(2) 派生类构造函数的成员初始化列表没有显式调用基类构造函数,编译器将使用基类默认构造函数构造派生类的基类对象,避免基类因为没有构造函数导致编译错误。
(3) 若定义了某种构造函数,编译器将不会定义默认构造函数,若需要则必须自己提供默认函数。
(4) 提供构造函数动机之一是确保对象总能被正确初始化,如果类包含指针成员则必须初始化这些成员,因此最好提供显式默认构造函数将所有初始成员初始化为合理值。
2.复制构造函数
复制构造函数接受其所属类的对象作为参数,在下面情况将使用复制构造函数
(1) 将新对象初始化为一同类对象;
(2) 按值将对象传递给函数;
(3) 函数按值返回对象;
(4) 编译器生成临时对象;
如果程序没使用复制构造函数,编译器提供原型(不提供定义),新对象每个成员都被初始化为原始对象相应成员的值,如果成员为类对象,则初始化该成员是,将使用相应的类的复制构造函数。
类中成员使用new使用初始化的成员指针通常要求执行深度复制,或者类可能包含需要修改的的静态变量,此时需要定义自己的复制构造函数。
3.赋值运算符
默认的赋值运算符用于处理同类对象之间的赋值,默认赋值为成员赋值,如果成员为类对象,则默认成员赋值将使用相应类的赋值运算符,如需要显示定义复制构造函数,也需要显式定义赋值运算符。Star类赋值运算符原型如下:
Star &Star::operator=(const Star &);
赋值运算符函数返回一个Star对象引用,baseDMA类演示了一个典型显示赋值运算符函数,编译器不会生成将一种类型赋给另一种类型的赋值运算符,如果希望能将字符串赋值给Star对象,则方法之一是显示定义下面的运算符:
Star & Star::operator=(const char*){…};
另一种法是使用转换函数将字符串转为Star对象,然后赋值。第一种方法较快,需要代码多,第二种方法可能导致编译器混乱。

猜你喜欢

转载自blog.csdn.net/HuYingJie_1995/article/details/88090091