1. 构造函数
1.1构造函数的初始值有时是必须的(比如引用)
1.2 成员初始化的顺序
初始值列表只说明用于初始化成员的值,而不限定初始化的具体执行顺序, 因此构造函数初始化的值的顺序最好与成员声明一致。
class X{int i;int j;public:X(int val):j(val), i(j) {} //构造函数,由于i在j之前被初始化,所以未定义,试图使用未定义的j初始化iX(int val):i(val), j(val) {} //正确};
1.3默认实参和构造函数
class Sales_data{Sales_data(std::string s = "") //等同于Sales_data() = default; }
1.4 委托构造函数delegating constructor
2. 隐式的类类型转换
bine("9-999-9999-9");//错误:需要用户定义的两种转换:bine(string("9-999-9999-9"));//bine(Sales_data("9-999-9999-9"));//ok:隐式转换成string,显式转换成Sales_data
3、explicit关键字阻止"直接初始化"的隐式转换
只对一个实参的构造函数有效, 需要多个实参的构造函数不能用于执行隐式转换。explicit只能用于类内(头文件),不能在类外的定义里面
Sales_data item1(null_book); // 正确:直接初始化Sales_data item2 = null_book; //错误:不能将explicit的构造函数用于拷贝形式初始化过程
4 聚合类
成员都是public的。·没有定义任何构造函数。·没有类内初始值。·没有基类,也没有virtual函数。特殊的初始化语法形式
例如,下面的类是一个聚合类:
struct Data{int ival;string s;};//val1.ival=0;val1.s=string("Anna")Data val1={0,"Anna"};
5 转换构造函数
当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。
class Complex{public:Complex(double x){};