Как инициализировать переменную-член const класса с помощью переменной const?

#c #visual-studio #class #constants

#c #visual-студия #класс #константы

Вопрос:

Я должен прочитать строки из файла .txt и хочу инициализировать с его помощью членов моего класса. Первый символ в строке всегда является числом.

 class myClass{

  private:
    const int ID;

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

};
  

Выполнение этого дает мне «Не предоставляет инициализатора для Kontakt::ID» для конструктора и «выражение должно быть изменяемым значением Iv» для this->ID = id;

Комментарии:

1. myClass(const int id) : ID(id) {} ?

2. Используйте список инициализации. Она существует не просто так; для выполнения инициализации . Не используйте тело ctor, которое запускается после инициализации. И кстати; это явное this-> является избыточным.

3. Интересный факт: объект ДОЛЖЕН быть полностью инициализирован перед входом в тело конструктора. Даже если вы можете назначить элемент внутри тела конструктора, он уже был инициализирован. Если вы назначите член позже в теле, вы зря потратите время на инициализацию. Это может быть дорого, поэтому отдайте предпочтение списку инициализаторов. Иногда полезно иметь вспомогательную функцию: myClass() : expensivemember(complexlogic()) {}

4. @JesperJuhl использование this-> перед членами может быть элементом стиля, указывающим, что используется член. Это похоже на наличие соглашения об именовании, например m_name . С современными IDE люди обычно этого не делают, но это не является стилистически неправильным.

Ответ №1:

Для этого вы должны использовать список инициализаторов членов:

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

Ответ №2:

Вы должны инициализировать 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;
}