gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:35:55 24 4
gpt4 key购买 nike

这个问题已经在这里有了答案:




已关闭10年。




Possible Duplicates:
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)分别是什么?

与继承有关吗?

最佳答案

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

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

  • 对于情况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成员变量的时间。正如迈克尔在评论部分中指出的那样,这也是初始化作为类成员的引用的唯一方法。

    除了使用它来初始化 const成员变量外,它似乎还被普遍认为是初始化变量的“方式”,因此其他程序员很容易阅读您的代码。

    关于c++ - C++,构造函数后的冒号是什么意思? ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60324868/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com