【问题标题】:C++, What does the colon after a constructor mean? [duplicate]C++,构造函数后的冒号是什么意思? [复制]
【发布时间】:2010-05-07 01:27:57
【问题描述】:

可能的重复:
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) 叫什么?

跟继承有关系吗?

【问题讨论】:

标签: c++


【解决方案1】:

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

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

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

对于案例 #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 在 cmets 部分所指出的,这也是初始化作为类成员的引用的唯一方法。

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

【讨论】:

  • 要清楚 - 除了初始化 const 成员之外,它是初始化引用成员的唯一方法,无论 const 与否(因为对引用的赋值是对引用的赋值指)。
  • 我们可以做这样的事情吗Demo():m_val(NULL) 我正在这样做,但它给了我错误,知道我做错了什么吗?
  • @Smashery : 关于That is the only time that you can change a const member variable : 类似*const_cast&lt;int*&gt;(&amp;m_val)+=5; 的东西可以用来覆盖常量和波动性
  • ctor 中的 @Smashery m_val = val; 毫无意义,即使 int& m_val 不是 const。如果您不使用参考资料,您的解释会很清楚。
  • @Smashery 这并不比令人困惑的问题更令人怀疑:在外壳、弓形或花括号中会使用什么?经常看到,例如:class Vector { Vector(int s) :elem{new double[s]}, sz{s} { } ... }
【解决方案2】:

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

【讨论】:

  • 这很有帮助,谢谢!
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 以下代码表明您对 = 的评论是错误的。使用初始化列表,将根据初始化列表设置值。使用赋值:class cl { public: cl() { cout
    【解决方案5】:

    这意味着len没有使用默认构造函数设置。而demo 类正在构建中。例如:

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

    在将其设置为 1 之前,会先在 foo 中放置一个值。这样会稍微快一些且效率更高。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2011-03-31
        • 2020-03-27
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 2018-11-21
        • 1970-01-01
        • 2017-05-29
        相关资源
        最近更新 更多