类构造函数初始化列表

类构造函数初始化列表
类类型的数据成员在进入构造函数函数体前已经完成初始化,
所以如果在构造函数里对类类型成员赋值:
1、调用默认构造函数;
2、调用赋值操作符。
如果采用构造函数初始化列表进行初始化:
1、调用拷贝构造函数。

示例如下:
构造函数赋值
class  Object
{
public:
    Object() 
{cout<<"Object Default"<<endl;}
    Object(
const Object&{cout<<"Object Copy"<<endl;}
    Object
& operator =(const Object&{cout<<"Object Assignment"<<endl; return *this;}
    
~Object() {cout<<"Object Destructor"<<endl;}
}
;

class  Container
{
public:
    Container(
const Object &obj)
    
{
            cout<<"Container Construct"<<endl;
        
//assignment in constructor
        c = obj;
    }


    
~Container() {cout<<"Container Destruct"<<endl;}

private:
    Object c;
}
;

int  main( int  argc,  char   * argv[])
{
    Object obj;
    Container b(obj);

    
return 0;
}
结果:
Object Default              //第一个object的构造
Object Default              //在进入Container的构造函数前,object已经构造
Container Construct      //container开始构造
Object Assignment       //调用object的赋值操作符
Container Destruct 
Object Destructor
Object Destructor

构造函数初始化列表
    Container( const  Object  & obj)
        :c(obj)        
// initialization
     {
        cout
<<"Container Construct"<<endl;
    }
结果:
Object Default               //第一个object构造
Object Copy                 //调用拷贝构造函数初始化类成员
Container Construct      //container开始构造
Container Destruct
Object Destructor
Object Destructor

推荐使用构造函数初始化列表,因为比在构造函数内赋值少了一次赋值操作,但对内置数据类型区别不大。
其初始化顺序按照声明顺序,并非在初始化列表中的顺序。

以下几种情况必须使用初始化列表:
1、父类或类类型成员没有提供默认构造函数。
     因为在构造函数执行前,父类或类类型成员必须先被构造。
2、const或引用成员。
     因为它们都不能被赋值。



你可能感兴趣的:(类构造函数初始化列表)