大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
类类型的数据成员在进入构造函数函数体前已经完成初始化,
所以如果在构造函数里对类类型成员赋值:
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或引用成员。
     因为它们都不能被赋值。



posted on 2009-05-25 15:22 大胖 阅读(216) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理