C++构造函数

Bit*_*map 1 c++

可能重复:
构造函数中这个奇怪的冒号成员语法是什么?

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

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

unsigned int param () const
{
 return param_;
}

private:
  unsigned int param_;
};
Run Code Online (Sandbox Code Playgroud)

构造函数定义myclass (unsigned int param) : param_ (param)是什么: 代码的含义和好处?

Alo*_*ave 11

myclass (unsigned int param) : param_ (param)
Run Code Online (Sandbox Code Playgroud)

此构造在C++中称为成员初始化列表.

会将您的成员初始化param_为值param.


内部构造函数中的Initializing和Assignment有什么区别?&有
什么好处?

使用初始化程序列表初始化成员并在构造函数体内为其指定值之间存在差异.

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

如果使用赋值,则首先使用默认构造函数初始化字段,然后使用实际值重新分配(通过赋值运算符).

如您所见,在后者中存在创建和分配的额外开销,这对于用户定义的类可能是相当大的.

对于整数数据类型(您使用它)或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;
}
Run Code Online (Sandbox Code Playgroud)

MyClass2 没有默认构造函数,因此必须通过成员初始化列表初始化它.