C++ 类设计总结回顾------构造函数
1 使用构造函数
C++提供了两种使用构造函数的方式来初始化对象,第一种是显式的调用构造函数:
Stock food = Stock("World Cabbage", 152, 1025);
另一种是隐式的调用构造函数:
Stock food("World Cabbage", 152, 1025);
第二种调用方式更为紧凑,两种调用方式等价。
当构造函数与new一起使用时:
Stock *pf = new Stock("World Cabbage", 152, 1025);
构造函数的调用方式不同于一般的类方法调用,一般的,使用对象调用方法:
food.show();
但是,在构造函数执行完之前,对象时不存在的,因此构造函数被用来创建对象,不能通过对象来调用。
如果编译器支持C++11,则可以使用列表初始化构造函数:
Stock food = {"World Cabbage", 152, 1025};
Stock food{"World Cabbage", 152, 1025};
Stock *pf = new Stock{"World Cabbage", 152, 1025};
2 默认构造函数
在不提供显式初始值的条件下,创建对象时,需要用到默认构造函数:
Stock food;
这条语句没有没有提供任何值,所以不会初始化数据成员。
如果没有显式的定义构造函数,编译器将自动创建一个不执行任何操作的默认构造函数。如果在类中显式的定义了构造函数,那么程序员就必须为类定义一个默认构造函数。
定义默认构造函数的方式有两种:
第一种是为已有的构造函数的所有参数提供一个默认值;第二种是通过函数重载来定义另一个构造函数------一个没有参数的构造函数。只能有一个默认构造函数,所以只能使用上述两种方式中的一种。
3 对象数组
如果想创建同一个类的多个对象。可以创建一个对象数组:
Stock food[4];
这是将调用默认构造函数。
也可以:
const int STKS = ; Stock stocks[STKS] = { Stock(), Stock("NanoSmart",12.5, 20), Stock("NanoSmart",20) }
如果已经定义了构造函数,C++将不会定义默认构造函数,这时如果希望在创建对象时不显式地对它进行初始化,则必须显式的定义默认构造函数。默认构造函数要么没有参数,要么所有的参数都有默认值。如果没有显式的定义任何构造函数,编译器将定义默认构造函数,使能够创建对象。另一项功能是自动生成的默认构造函数能够调用基类的默认构造函数以及调用本身是对象的成员所属类的默认构造函数。(ps:第二个有点拗口,如果class A中有一个成员,这个成员本身也是一个类class B,那么A的默认构造函数能够调用B的默认构造函数)
另外,如果派生类构造函数的成员初始化列表中没有显式的调用基类的构造函数,则编译器将使用基类的默认构造函数来构造派生类对象的基类部分。
提供构造函数的目的之一是确保对象总能够被正确的初始化。另外如果类中包含指针成员,则必须初始化这些成员。因此,最好的做法是显式默认构造函数,将所有的类数据成员都初始化为合理的值