C++中构造函数是特殊的成员函数,只要定义类的新对象就会执行构造函数,构造函数是保证每个对象的数据成员具有合适的初始值。
构造函数特点:
1)构造函数与类同名,不能指定返回类型,且不能声明为const函数,详见const的使用
2)构造函数可以重载,所以可以有多个构造函数
sales_item(void) /*const*/; sales_item(istream &is /*= cin */); sales_item(const string & book ); //must const sales_item(const sales_item &org);3)调用构造函数,使用不同的实参就会调用不同的构造函数,如下
sales_item sales0; sales_item sales1("hello world"); sales_item("hello world"); //也可以 sales_item sales2 = sales_item("123456"); //定义 sales_item sales3(cin);
构造函数的初始化式:
函数后面可以包含一个初始化列表,原型为形参后紧跟一个冒号,然后就是以逗号分开的数据成员列表,初始化值放在圆括号内,如下
sales_item::sales_item(void) : isbn(1,‘0‘), units_sold(0), revenue(0.0), a(0), b(a){}初始化注意之处:
1)构造函数分两阶段进行,初始化阶段和普通的计算阶段(计算阶段就是函数体中的语句)
2)未提供显式初始化的变量使用与初始化变量相同的规则进行初始化,内置或者复合类型依赖与作用域,局部不初始化全局初始化为0,类类型使用默认的构造函数
3)必须提供初始化列表的情况,如下
screen::screen(void)//contents由string默认构造函数初始化 : nConstVar(0)/*contents("")*/,cursor(0),height(0),width(0),access_ctr(0){}const int nConstVar; //必须在直接初始化列表进行初始化,如果在函数体中就会出错,还有就是引用的初始化,如下
sales_item::sales_item(void) : isbn(1,‘0‘), units_sold(0), revenue(0.0), a(0), b(a){}int &b; b一定要显式初始化
4)初始化的次序,最好严格按照初始化顺序初始化,尽可能避免使用成员来初始化,最好统一使用形参来进行初始化
class x { int i; int j; public: x(int val):j(val), i(j){}; };这里我在vs2012编译下通过了,显式初始化次序对这个没有影响,在gcc version 4.4.1使用g++编译同样通过,不知道这个规则当初制定的原因
5)类类型的初始化可以使用该类型的任意构造函数,也可以使用默认的构造函数