构造函数

一、注意:

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}{ }   这里有默认初始值

2explicit 构造函数

应使所有的单参数构造函数为explicit,以避免后台类型转换;

3、区别   (与构造函数体内初始化数据成员的区别)

1)存在const数据成员(对象被创建以后,该成员无法被修改),只能在初始化列表中初始化;

2)数据成员本身就是一个类类型,且没有0作为参数的构造函数,那么。。。;

当C++创建某个对象时,必须在调用构造函数之前创建对象的数据成员;

如果类的数据成员本身就是个对象,那么在创建这些数据成员时,必须为其调用构造函数;(如果其构造函数调用失败,会导致数据成员对象生成失败);

当在构造函数体内给某个对象赋值时,并没有真正创建这个对象,而只是改变对象的值;??

3)构造函数初始化器ctor-initializer允许在创建数据成员时执行初始化;而且效率高;

4)初始化顺序:按照类定义中声明的顺序而不是初始器列表的顺序;

5)初始化时,可以调用类中的其它函数???

8、赋值构造函数

 

posted @ 2018-12-18 22:45  kuaqi  阅读(398)  评论(0编辑  收藏  举报