如何使用常量变量初始化类的常量成员变量?

3

我需要从一个 .txt 文件中读取行,并用它来初始化我的类成员。每一行的第一个字符都是一个数字。

class myClass{

  private:
    const int ID;

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

};

这样做会导致构造函数出现“提供了Kontakt::ID的初始化器”的错误,并且this-> ID = id;会出现“表达式必须是可修改的Ivalue”的错误。

1
我的类(const int id) : ID(id) {} - Borgleader
使用初始化列表。它存在的原因是为了进行初始化。不要使用构造函数体,因为它会在初始化之后运行。顺便说一句,显式的 "this->" 是多余的。 - Jesper Juhl
2
有趣的事实:在进入构造函数体之前,对象必须完全初始化。即使你可以在构造函数体内分配成员,它已经被初始化。如果您稍后在函数体中分配成员,则浪费了初始化的时间。这可能很昂贵,因此最好使用初始化列表。有时候使用辅助函数会很有益:myClass() : expensivemember(complexlogic()) {} - user4581301
@JesperJuhl 在成员前使用 this-> 可能是一种风格,表示所使用的是成员。这类似于使用 m_name 这样的命名约定。在现代 IDE 中,人们通常不这样做,但这并不是风格上的错误。 - user904963
2个回答

3

3
你必须在成员初始化列表中初始化const类成员。这是一个完整的示例(请参见在线):
class myClass {
  private:
    const int ID;
  public:
    myClass(const int id) : ID(id) {
                         // ^^^^^^
    }

};

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

问题在于构造函数体中的初始化太晚了,在执行构造函数体内的代码之前,所有类范围成员都将尝试进行初始化,并且没有const类成员变量的默认初始化。
如果您真的想要默认初始化,可以像这样做(在线示例):
class myClass {
  private:
    const int ID = -42; // <<<
  public:
    myClass() = default; // <<<
    myClass(const int id) : ID(id) {
    }

};

int main() {
    myClass x;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接