#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;
}