构造函数参数作为成员初始值,尽量避免使用同一对象的成员
X(int val):j(val),i(val);构造函数的参数作为成员函数参数默认实参和构造函数默认
Sales_data构造函数行为与只接受一个string实参的构造函数
class Sales_data{ public: //定义默认构造函数,令其与只接受一个string实参的构造函数功能相同 Sales_data(std::string s = "") : bookNo(s){} //其他构造函数与之前一致 Sales_data(std::string s,unisgned cnt,double rev): bookNo(s),units_sold(cnt),revence(rev * cnt){} Sales_data(std::istream &is) {read(is,*this);} }
Sales_data(std::istream &is)//构造函数参数显示其接受一个标准的输入流数据,构造函数函数体{read(is,*this)}//标准输入流,类对象的对象地址
构造函数的這种表示形式的含义
Sales_data(std::string s,unsigned cnt,double rev):bookNo(s),units_sold(cnt),revenue(rev * cnt){}
表示构造函数接收std::string,unsigned cnt,double rev3个参数,:后面的表示 构造函数初始化直接使用构造函数的参数;
Sales_data(std::string s = ""):bookNo(s){};同样是类对象成员数据初始化直接使用构造函数的参数;
delegating constructor委托构造函数使用它所属类的其他构造函数执行它自己的初始化或者说它自己的一些或是 全部职责委托给了其他构造函数构造函数成员初始值的列表及函数体类名后面紧跟圆括号括起来的参数列表,
class Sales_Data{ public: //非委托构造函数使用对应的实参初始化成员 Sales_data(std::string s,unsigned cnt,double price):bookNo(s),units_sold(cnt),revenue(cnt * price) {} //其余构造函数全部委托给另外一个构造函数 Sales_data(): Sales_data("",0,0){} Sales_data(std::string s): Sales_data(s,0,0){} Sales_data(std::istream &is) : Sales_data() { read(is,*this); } }
不使用任何初始值定义非静态变量或数组,当对象被默认初始化或值被初始化时自动执行默认构造
试图以如下形式声明一个用默认构造函数初始化的对象,