Ссылочная переменная в определении класса - PullRequest
10 голосов
/ 19 февраля 2011

Я изучаю C ++, и я прочитал, что все ссылки должны быть инициализированы при объявлении, и не может быть "неинициализированных ссылок".Но что, если ссылочная переменная является членом класса?

class test
{
    int &k;
};

int main()
{
    test *abc = new test;
}

Эта программа компилируется и работает нормально (в g ++ нет предупреждений).Тем не менее, abc->k является ссылкой, но для чего он инициализирован?Или это какая-то неинициализированная ссылка или что-то еще?

Ответы [ 3 ]

8 голосов
/ 19 февраля 2011

Программа плохо сформирована, потому что она создает класс, который не может инициализировать нестатический элемент-член ссылочного типа.

Я считаю, что gcc не сможет скомпилировать это, но я получил только предупреждение "нестатическая ссылка" int & test :: k 'в классе без конструктора ".

test - это тип не POD-struct, поскольку он содержит ссылочный член (9 [класс] / 4)

new test default-инициализирует динамически размещенный класс. (5.3.4 [expr.new] / 15)

To default-initialize объект типа test означает вызов неявно объявленного и неявно определенного конструктора по умолчанию. (8,5 [dcl.init] / 5)

Неявно определенный конструктор по умолчанию эквивалентен конструктору по умолчанию с пустым mem-initialized-list и пустым телом функции. (12,1 [class.ctor] / 7)

Дальше больше:

Неявно определенный конструктор по умолчанию выполняет набор инициализаций класс, который будет выполняться пользовательским конструктором по умолчанию для этого класса с пустым mem-initializer-list (12.6.2) и пустым телом функции. Если этот пользовательский конструктор по умолчанию будет некорректно сформирован, программа будет некорректно сформирована.

Если объект не является именем в mem-initializer-list и член не относится к типу класса [с дополнительными ограничениями], то объект не инициализируется.

В противном случае объект не инициализируется. Если объект имеет константный тип или ссылочный тип , [или ...], программа имеет некорректную форму. "(12.6.2 [class.base.init] / 4)

2 голосов
/ 19 февраля 2011

Ваш код вообще не компилируется на Visual C ++. В общем, лучше оставить как можно меньше шансов. Вам необходимо инициализировать элементы refence, используя список инициализатора в конструкторе:

class test
{
public:
 test(int& x) : k(x)
 {
 }
 int& k;
};
1 голос
/ 18 августа 2012
class test
{
    public:
        test(int x) : k(x)
        {
        }
    int& k;
};

У меня есть сомнения относительно способа инициализации ссылки.Когда кадр стека для ctr будет удален из стека, ссылка больше не будет действительной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...