crossplatform.ru

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


  Ответ в Копирование членов класса-ссылок.
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
ilyabvt Дата 27.12.2011, 2:50
 
Цитата(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()" выводил то что нужно это не более чем везение.
rp80 Дата 26.12.2011, 22:48
  Ссылку нельзя инициализировать 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
}


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

Савсибо
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 19:27