C++,构造函数后的冒号是什么意思?

bco*_*lan 191 c++

可能重复:
构造函数中的冒号后的变量
C++构造函数语法问题(noob)

我这里有一些C++代码:

class demo 
{
private:
    unsigned char len, *dat;

public:
    demo(unsigned char le = 5, unsigned char default) : len(le) 
    { 
        dat = new char[len];                                      
        for (int i = 0; i <= le; i++)                             
            dat[i] = default;
    }

    void ~demo(void) 
    {                                            
        delete [] *dat;                                           
    }
};

class newdemo : public demo 
{
private:
    int *dat1;

public:
    newdemo(void) : demo(0, 0)
    {
     *dat1 = 0;                                                   
     return 0;                                                    
    }
};
Run Code Online (Sandbox Code Playgroud)

我的问题是,有什么: len(le): demo(0, 0)被称为?

它与继承有关吗?

Sma*_*ery 259

正如其他人所说,这是一个初始化列表.您可以将它用于两件事:

  1. 调用基类构造函数
  2. 在构造函数体执行之前初始化成员变量.

对于案例#1,我假设您了解继承(如果不是这种情况,请在评论中告诉我).所以你只是调用基类的构造函数.

对于案例#2,可能会问:"为什么不在构造函数的主体中初始化它?" 初始化列表的重要性对于const成员来说尤为明显.例如,看一下这种情况,我想m_val根据构造函数参数进行初始化:

class Demo
{
    Demo(int& val) 
     {
         m_val = val;
     }
private:
    const int& m_val;
};
Run Code Online (Sandbox Code Playgroud)

根据C++规范,这是非法的.我们不能const在构造函数中更改变量的值,因为它被标记为const.所以你可以使用初始化列表:

class Demo
{
    Demo(int& val) : m_val(val)
     {
     }
private:
    const int& m_val;
};
Run Code Online (Sandbox Code Playgroud)

这是您唯一可以更改const成员变量的时间.正如Michael在评论部分中指出的那样,它也是初始化作为类成员的引用的唯一方法.

除了使用它初始化const成员变量之外,它似乎已被普遍认为是初始化变量的"方式",因此其他程序员可以清楚地阅读代码.

  • 要清楚 - 除了初始化`const`成员之外,它是初始化引用成员的唯一方法,无论是否为`const`(因为对引用的赋值是对引用引用的赋值). (17认同)

dby*_*rne 25

这称为初始化列表.它用于将参数传递给父类的构造函数.这是一个很好的链接解释它:C++中的初始化列表


Chr*_*ich 6

它被称为初始化列表.它在构造函数体执行之前初始化成员.


Ken*_*oom 6

它被称为初始化列表.初始化列表是如何将参数传递给成员变量的构造函数以及将参数传递给父类的构造函数的方法.

如果您=在构造函数体中使用赋值,则首先调用默认构造函数,然后调用赋值运算符.这有点浪费,有时没有等效的赋值运算符.


归档时间:

查看次数:

155700 次

最近记录:

8 年,1 月 前