#c
#c
Вопрос:
Почему мы не можем использовать this
в списке инициализации вот так? Оно выдало ошибку, которую не удается найти {
раньше this
.. Но проблема не в области видимости, потому что работает второй код
class Student {
public :
int age;
const int rollNumber;
int amp;x; // age reference variable
Student(int r, int age) : rollNumber(r), this->age(age), x(this -> age) {
//rollNumber = r;
}
«Это» работает:
class Student {
public :
int age;
const int rollNumber;int amp;x;
Student(int r, int age) : rollNumber(r), x(this -> age) {
//rollNumber = r;
}
Я знаю, что мы должны объявлять и инициализировать const
переменные и ссылаться на них одновременно, но я хочу инициализировать их после ввода и передачи моим объектам
Комментарии:
1. Вы уверены, что ваш второй пример работает? Я не вижу объявления для
x
.2. Также обратите внимание, что элементы будут инициализироваться в том порядке, в котором они объявлены в классе; вы должны сохранять списки инициализаторов элементов в том же порядке, чтобы избежать случайного вызова UB.
3. @0x5453 да, это должно было быть объявлено . просто отредактировал это.
Ответ №1:
Короткий ответ: «так было решено, что синтаксис будет таким», но с философской точки зрения вы могли бы сказать, что этого this->age
не существует в списке инициализаторов (поскольку вы еще не создали this
…). Просто:
age(age)
это правильный синтаксис, и из контекста ясно, что age
есть что здесь.
Комментарии:
1. Я понимаю это. Вы сказали, что мы еще не создали
this
(перед областью видимости конструктора в списке инициализации) Но это не должно работать и для ссылочной переменной amp; x тоже. Я думаю, мы можем просто сказать, что так был определен синтаксис! Спасибо2. @sarthakbansal Я согласен, что там есть некоторое несоответствие, но его тоже можно устранить философски (как и большинство вещей :)) — Из контекста,
age
в круглых скобках должен быть аргументage
, поэтому, если бы мы не разрешили только в ссылках явно ссылатьсяthis->member
, мы не смогли бы инициализировать ссылку (ну, мы могли бы, на временный аргумент, что не имеет смысла)! Конечно, это не имело бы смысла ни для чего, кроме ссылки или указателя. Однако это вызывает некоторую путаницу.