可能的重复: 构造函数中冒号后面的变量 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;                                                    
    }
};

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

这和遗传有关吗?


它叫做初始化列表。它在构造函数体执行之前初始化成员。

这叫做初始化列表。它用于将参数传递给父类的构造函数。这里有一个很好的链接解释它:c++中的初始化列表

它叫做初始化列表。初始化列表用于将参数传递给成员变量的构造函数,以及将参数传递给父类的构造函数。

如果在构造函数体中使用=进行赋值,首先调用默认构造函数,然后调用赋值操作符。这有点浪费,而且有时没有等效的赋值操作符。

正如其他人所说,这是一个初始化列表。你可以用它做两件事:

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

对于第1种情况,我假设您了解继承(如果不是这样,请在评论中告诉我)。因此,您只是调用基类的构造函数。

对于第二种情况,可能会有人问:“为什么不直接在构造函数体中初始化它?”初始化列表对于const成员的重要性尤为明显。例如,看一下这种情况,我想基于构造函数参数初始化m_val:

class Demo
{
    Demo(int& val) 
     {
         m_val = val;
     }
private:
    const int& m_val;
};

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

class Demo
{
    Demo(int& val) : m_val(val)
     {
     }
private:
    const int& m_val;
};

这是唯一可以更改const成员变量的时间。正如Michael在评论部分提到的,这也是初始化类成员引用的唯一方法。

除了使用它来初始化const成员变量之外,它似乎已经被普遍接受为初始化变量的“方式”,所以其他阅读你的代码的程序员很清楚。

您正在调用其基类的构造函数demo。

这意味着len不是使用默认构造函数设置的。在构造演示类时。例如:

class Demo{
    int foo;
public:
    Demo(){ foo = 1;}
};

首先在foo中放置一个值,然后将其设置为1。它的速度更快,效率更高。