构造函数
一、注意:
1、构造函数不能被申明成const;
2、直到构造函数完成初始化过程,类成员才能取得const属性,所以可以在构造函数中初始化const对象;
二、默认构造函数;
1、如何定义类的默认构造函数?
Sales_data() = default;
1、初始化 & 默认构造函数,注意区别;
1、默认构造函数可以自己定义!在未定义任何构造函数的情况下,会自动合成一个默认构造函数;(不过如果类内部有自定义的类,难保证其定义了默认构造函数;)
2、默认构造函数与无参构造函数是一回事,术语“默认构造函数”并不是指没有声明任何构造函数,就生成一个构造函数;而是指如果没有参数,构造函数就采用默认值;(这句话好像也没说明白,默认值是?)
3、如果声明了一个默认构造函数或者其他构造函数,编译器就不会再自动生成默认构造函数;
提醒:一旦声明了,就应该定义,不然调用会报错;
而且调用格式应该与声明格式一致;参数列表要一致;
4、调用默认构造函数,在实例化时,应该这样调用默认构造函数:SpreadsheetCell myCell;不可这样:SpreadsheetCell myCell( );
5、堆中对象,可以这样调用默认构造函数:auto smartCellp=make_unique<SpreadsheetCell>();或者 SpreadsheetCell * myCellp=new SpreadsheetCell( );SpreadsheetCell * myCellp=new SpreadsheetCell;delete myCellp;myCell=nullptr;
6、显示删除构造函数
可以定义一个只有静态方法的类,这个类没有任何构造函数,也不想让编译器生成构造函数的话;
class myClass { public: MyClass( ) = delete; };
7、合成默认构造函数(最好自定义默认构造函数)
(1)只有类在类不包含任何构造函数的情况下,才会合成默认构造函数;
(2)只有类包含的内置类型、或复合类型的成员被赋予了类内初始值时,才适合合成默认构造函数;
(3)如果类内成员没有默认构造函数,将无法初始化;必须自定义默认构造函数;
(4)其他
三、构造函数初始化器
1、格式:
Sales_data(const std::string &s, unsigned n, double p): bookNo(s),units_sold(n), revenue(p*n) { 函数体}
Sales_data(const std::string &s, unsigned n, double p): bookNo{s},units_sold{n}, revenue{p*n} { 函数体} C++11中规定的用花括弧代替圆括弧进行初始化;
explicit IntCell(int initialValue = 0): storedValue{ initialValue}{ } 这里有默认初始值
2、explicit 构造函数
应使所有的单参数构造函数为explicit,以避免后台类型转换;
3、区别 (与构造函数体内初始化数据成员的区别)
1)存在const数据成员(对象被创建以后,该成员无法被修改),只能在初始化列表中初始化;
2)数据成员本身就是一个类类型,且没有0作为参数的构造函数,那么。。。;
当C++创建某个对象时,必须在调用构造函数之前创建对象的数据成员;
如果类的数据成员本身就是个对象,那么在创建这些数据成员时,必须为其调用构造函数;(如果其构造函数调用失败,会导致数据成员对象生成失败);
当在构造函数体内给某个对象赋值时,并没有真正创建这个对象,而只是改变对象的值;??
3)构造函数初始化器ctor-initializer允许在创建数据成员时执行初始化;而且效率高;
4)初始化顺序:按照类定义中声明的顺序而不是初始器列表的顺序;
5)初始化时,可以调用类中的其它函数???
8、赋值构造函数