类构造函数的形态
以类Stock为例,构造函数原型有以下几种。
implicit default constructor,如果类声明没有提供构造函数,编译器生成一个默认的隐式构造函数,原型如下
Stock(){}; //do noting
explicit default constructor without parameters,程序员可以在类声明中显示定义无参数的默认构造函数,原型如下
Stock(){ /*do whatever you need*/ };
explicit default constructor with parameters all have default values,程序员可以在类声明中显示定义有参数的默认构造函数,但所有的参数必须提供默认值,原型如下
Stock( const char * name = “null”, int val = 10 );
explicit constructor with parameters,程序员可以在类声明中显示定义有参数的重载构造函数,原型如下
Stock( const char * name, int val = 10 ); //参数的默认值都是可选的,但需要遵守默认值的赋值规则
类对象的初始化
类对象的初始化方式跟构造函数的原型相关,因为在创建对象时,程序必然会调用构造函数用于创建对象,根据构造函数原型的不同,初始化方式有一下几种。
- Stock stGoogle; // use default constructor implicitly
- Stock stGoogle = Stock(); // use default constructor explicitly
- Stock * stGoogle = new Stock(); // use default constructor implicitly
- Stock stGoogle = Stock( “google”, 10 ); // use explicit constructor
- Stock stGoogle( “google”, 10 ); // use explicit constructor
- Stock * stGoogle = new Stock( “google”, 10 ); //use explicit constructor
以下是C++11支持的列表初始化方式
- Stock stGoogle = Stock{ “google”, 10 }; // use explicit constructor C++11
- Stock stGoogle{ “google”, 10 }; // use explicit constructor C++11
- Stock * stGoogle = new Stock{ “google”, 10 }; //use explicit constructor C++11
- Stock stGoogle{}; // use default constructor explicitly C++11
类对象数组的初始化
C++设计类特性的时候,尽力满足使用对象类型像使用基本类型一样方便的初衷,因此可以在C++的类管理里,看到对象初始化,对象指针等特点都像基本类型一样维护。而类对象数组也是同样的语法,使用默认构造函数的初始化如下
Stock array[10];
也可以显示的使用带参数的构造函数初始化数组,如
Stock array[10] = { Stock( “google”,1 ), Stock( “yahoo”, 2 ), Stock( “baidu”, 3 ) }; //大括号围起来的逗号分隔的值列表
该次使用显示构造函数初始化数组的前三个成员,剩余的成员仍然使用默认构造函数。编译器处理这种对象数组初始化方式的流程是,首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。因此 ,要创建类对象数组,则这个类必须有默认构造函数。因此实践中,我们可以先使用默认构造函数创建数组,然后在后续的流程里根据需要创建对象并赋值给数组成员,这也是主流的基本类型数组的使用方式。