C++,构造函数后面的冒号是什么意思?[副本]

hwazgwia  于 2023-06-25  发布在  其他
关注(0)|答案(6)|浏览(146)

此问题已在此处有答案

13年前就关门了

可能重复:

Variables After the Colon in a Constructor
C++ constructor syntax question (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)叫什么?
是不是跟遗产有关?

koaltpgm

koaltpgm1#

正如其他人所说,它是一个成员初始化列表。你可以用它做两件事:
1.调用基类构造函数
1.在构造函数体执行之前初始化数据成员
对于案例1,我假设您理解继承(如果不是这样,请在注解中告诉我)。所以你只需要调用基类的构造函数。
对于情况#2,可以提出以下问题:“为什么不直接在构造函数体中初始化它呢?成员初始化列表的重要性对于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数据成员之外,它似乎已经被普遍接受为初始化成员的“方式”,因此其他程序员阅读您的代码时会很清楚。

atmip9wb

atmip9wb2#

这被称为初始化列表。它用于向父类的构造函数传递参数。这里有一个很好的链接来解释它:Initialization Lists in C++

4szc88ey

4szc88ey3#

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

mlnl4t2r

mlnl4t2r4#

它被称为初始化列表。初始化器列表是如何将参数传递给成员变量的构造函数,以及如何将参数传递给父类的构造函数。
如果使用=在构造函数体中赋值,首先调用默认构造函数,然后调用赋值运算符。这有点浪费,而且有时没有等效的赋值运算符。

von4xj4u

von4xj4u5#

这意味着len不是使用默认构造函数设置的。而demo类正在被构造。例如:

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

会先在foo中放置一个值,然后再将其设置为1。它稍微快一点,效率也更高。

cidc1ykv

cidc1ykv6#

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

相关问题