【问题标题】:How to initialize a const member variable of a class with a const variable?如何用 const 变量初始化类的 const 成员变量?
【发布时间】:2019-09-02 09:41:04
【问题描述】:

我必须从 .txt 文件中读取行,并想用它来初始化我的班级成员。一行中的第一个字符始终是一个数字。

class myClass{

  private:
    const int ID;

  public:
    myClass(const int id){
       this->ID =  id;
    }

};

这样做会为构造函数提供“不为 Kontakt::ID 提供初始化程序”和 this->ID = id; 的“表达式必须是可修改的 Ivalue”

【问题讨论】:

  • myClass(const int id) : ID(id) {} ?
  • 使用初始化列表。它的存在是有原因的;进行初始化。不要使用 ctor 主体,它在 初始化之后运行。顺便说一句;明确的this-> 是多余的。
  • 有趣的事实:一个对象必须在进入构造函数的主体之前完全初始化。即使您可以在构造函数的主体内分配一个成员,它也已经被初始化了。如果稍后在正文中分配成员,则浪费了初始化所花费的时间。这可能很昂贵,所以更喜欢初始化列表。有时有一个辅助函数是有益的:myClass() : expensivemember(complexlogic()) {}
  • @JesperJuhl 在成员之前使用this-> 可以是样式的东西,表明使用的是成员。这类似于具有m_name 之类的命名约定。使用现代 IDE,人们通常不会这样做,但这在风格上并没有错。

标签: c++ visual-studio class constants


【解决方案1】:

您必须在member initializer list 中初始化const 类成员。这是一个完整的例子(见online):

class myClass {
  private:
    const int ID;
  public:
    myClass(const int id) : ID(id) {
                         // ^^^^^^
    }

};

int main() {
    myClass x(42);
}

问题是构造函数体中的初始化来不及,在体中的代码执行之前会尝试初始化所有类作用域成员,并且const类成员变量没有默认初始化。

如果你真的想要默认初始化,你可以这样做(online 示例):

class myClass {
  private:
    const int ID = -42; // <<<
  public:
    myClass() = default; // <<<
    myClass(const int id) : ID(id) {
    }

};

int main() {
    myClass x;
}

【讨论】:

    【解决方案2】:

    您必须为此使用member initializer list

    myClass(const int id)
        : ID(id) { }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2013-01-07
      • 2016-08-14
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      相关资源
      最近更新 更多