Разница в C ++ между ссылкой и аргументом передачи по ссылке - PullRequest
2 голосов
/ 05 мая 2011

Мой вопрос касается следующей функции-члена Bifstream, которая наследуется от ifstream.Рид ожидает указатель на символ.Я даю это (символ *) и цель.target - это ссылка, так что я дал ссылку на ссылку на int.Почему это работает?

bool cBifstream::ReadInt( int& target ){
    if( !this->is_open() ){
        return false;
    }
    this->read( (char*)&target, sizeof(int) );
}

Вот фрагмент из другого рабочего кода, который я использую.

int size;
is.read((char*)&size, sizeof(int));

Синтаксис такой же, но на этот раз переменная представляет собой int, а нессылка на int.

Целевое объявление:

cBifstream a("test2");
int b;
a.ReadInt(b);

РЕДАКТИРОВАТЬ: Спасибо за ответы.Я до сих пор не понимаю одну вещь.

this->read( (char*)target, sizeof(int) );  (all i did here was remove the ampersand)

Это изменение вызывает сбой моей программы.Однако target - это ссылка на int, поэтому вышеприведенное должно работать, потому что

int size;
is.read((char*)&size, sizeof(int));

работает.

Ответы [ 3 ]

6 голосов
/ 05 мая 2011

Вы берете адрес ссылки - это создает адрес переменной, на которую ссылается target.Ссылка - это псевдоним переменной, на которую она ссылается, нигде нет синтаксической косвенности - поэтому любая операция, выполняемая над ссылкой, влияет на указанную переменную.

int x; 
int & y=x;

Используя вышеизложенное, все, что вы делаете для y, будет работать точно так же, как если бы вы делали это для x

2 голосов
/ 05 мая 2011

Код &target не дает вам ссылку на ссылку, он дает вам адрес исходного объекта, на который указывает ссылка. Итак, вы взяли int* и преобразовали его в char* (используя приведение в стиле C).

0 голосов
/ 05 мая 2011

Для всех намерений и целей ссылка - это не что иное, как объект, из которого была создана ссылка.Это включает в себя получение адреса ссылки.

...