2011-07-17 41 views
1

可能重复:
What is this weird colon-member syntax in the constructor?C++构造

如果我定义如在C++中以下所示的类:

class myclass 
{ 
public: 
myclass (unsigned int param) : param_ (param) 
{ 
} 

unsigned int param() const 
{ 
return param_; 
} 

private: 
    unsigned int param_; 
}; 

什么构造定义: myclass (unsigned int param) : param_ (param)装置和代码的好处?

回答

11
myclass (unsigned int param) : param_ (param) 

这种结构被称为成员初始化列表在C++中。

初始化您的会员param_的值为param


是什么初始化之间分配的内部构造的区别? &
有什么优势?

初始化使用初始化列表的成员并在构造函数体内为其指定值之间有区别。

当你通过初始化列表初始化字段时,构造函数将被调用一次。

如果您使用赋值,那么这些字段将首先使用默认构造函数进行初始化,然后使用实际值重新分配(通过赋值运算符)。

正如你所看到的那样,在后者中创建&赋值会有额外的开销,这对于用户定义的类可能相当重要。

对于整数数据类型(为此使用它)或POD类成员,没有实际的开销。


当你HAVE TO使用成员初始化列表?
你将有(而被迫)使用,如果一个成员初始化列表:

你的类有一个基准件
你的类有一个const成员或
你的类没有默认构造函数


甲代码示例描绘HAVE TO情况:

class MyClass 
{ 
    public: 
     int &i;  //reference member, has to be Initialized in Member Initializer List 
     int j; 
     const int k; //const member, has to be Initialized in Member Initializer List 

    MyClass(int a, int b, int c):i(a),j(b),k(c) 
    { 

    } 
}; 

class MyClass2:public MyClass 
{ 
    public: 
     int p; 
     int q; 
     MyClass2(int x,int y,int z,int l,int m):MyClass(x,y,z),p(l),q(m) 
     { 
     } 

}; 

int main() 
{ 
    int x = 10; 
    int y = 20; 
    int z = 30; 
    MyClass obj(x,y,z); 

    int l = 40; 
    int m = 50; 
    MyClass2 obj2(x,y,z,l,m); 

    return 0; 
} 

MyClass2没有默认构造函数,因此必须通过成员初始值设定项列表进行初始化。

+0

请停止传播此功能的术语“初始化程序列表”。初始化程序列表不同。 –

+0

请教,什么是“初始化列表”?据我所知,这是正确的术语,并且Google同意... –

+0

@Tomalak:什么是正确的术语? “初始化列表”和“初始化列表”是我听过或看到过的唯一两个。但重要的是,如果你知道不同的话,那就很重要。 –

4

对您的代码的好处是......好吧,什么?!那你的代码。它的好处是它可以做它所说的。相比于什么选择?为了你的代码有所不同?不同的如何?

myclass (unsigned int param) : param_ (param) {} 

冒号和下面的列表是ctor-initializer(做 称之为“初始化列表”,这是一件好事在C++完全不同)。它允许你初始化对象的成员。

请注意,以下内容并不相同;你只分配会员后 - 事实:

myclass (unsigned int param) { 
    param_ = param; 
} 

它不会真正使在这种情况下的差异,与unsigned int,但一旦你开始处理参考成员和const成员,没有默认构造函数的成员,你发现你必须初始化。