crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Копирование членов класса-ссылок.
rp80
  опции профиля:
сообщение 26.12.2011, 22:48
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ссылку нельзя инициализировать rvalue. Поэтому нельзя делать вот так:
    
int& y=100;//error
void f(int& n){}
f(10);//error

Но почему-то разрешается делать вот так
class AA
{
    int& r;
    public:
    void print() {prn(r);}
    AA(int n):r(n){};//Ok?
    AA(const AA& a):r(a.r){prn(a.r);}//Ok?
    AA& operator=(const AA& a)
    {
        if(this!=&a)
       {
        r=a.r;
        return *this;
       }
    }
};

(prn - функция-шаблон, обертка для cout)

Но в результате работы возникают странные глюки.
void f()
{
AA a(90);
a.print();//выводит 90
AA a1=a;//Copy constructor
a.print();//выводит -1078159084
}


И, как ни странно, не работает и такой вроде бы "нормальный" вариант.
void f()
{
int yy=98;
AA a(yy);
a.print();//выводит 98
AA a1=a;//Copy constructor
a.print();//выводит -1078159084
}


Хотелось бы понять почему во-первых проходит такая инициализация, а во-вторых почему ссылка "портится" после присваивания или конструктора копирования.

Савсибо

Сообщение отредактировал rp80 - 26.12.2011, 22:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 27.12.2011, 2:50
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Цитата(rp80 @ 27.12.2011, 1:48) *
Но почему-то разрешается делать вот так
class AA
{
    int& r;
    public:
    void print() {prn(r);}
    AA(int n):r(n){};//Ok?
    AA(const AA& a):r(a.r){prn(a.r);}//Ok?
    AA& operator=(const AA& a)
    {
        if(this!=&a)
       {
        r=a.r;
        return *this;
       }
    }
};

Потому что вы инициализируете ссылку адресом переменной (ведь при вызове конструктора будет создавать переменная "n" с тем значением которое мы передадим в конструктор). Проблема в том что переменная то потом уничтожается, а ссылка будет по прежнему ссылаться на нее.
Цитата(rp80 @ 27.12.2011, 1:48) *
И, как ни странно, не работает и такой вроде бы "нормальный" вариант.
void f()
{
int yy=98;
AA a(yy);
a.print();//выводит 98
AA a1=a;//Copy constructor
a.print();//выводит -1078159084
}

Ничего странного, ссылка будет также указывать на переменную 'n' вашего конструктора, а вовсе не на "yy".
Цитата
Хотелось бы понять почему во-первых проходит такая инициализация, а во-вторых почему ссылка "портится" после присваивания или конструктора копирования.

Где-то проходит где-то нет, билдеровский компилятор, например, послал меня и не захотел такое компилировать. А испортиться она может вообще в любой момент. То что "a.print()" выводил то что нужно это не более чем везение.

Сообщение отредактировал ilyabvt - 27.12.2011, 2:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.6.2022, 8:30