krembrule2016
@krembrule2016

В чем разница между ссылкой на объект и член-данных объекта?

Приведу пример интересующей меня детали на конструкторе копирования
constructor_and_d_and_c::constructor_and_d_and_c(const constructor_and_d_and_c& c) // передаем объект, который хотим скопировать
	{
		cout << "To, chto interesuet: " << c.n_Name << endl;
		cout << "copy is calling" << endl;
		n_Name = new string(*(c.n_Name)); // n_Mame - член данных нового объекта
	};

Если мы хотим посмотреть какой адрес в памяти имеет член данных, то мы можем просто написать c.n_Name, для того, чтобы узнать адрес объект c нужно обязательно добавить &. Почему это так? Ведь в аргументе уже указано, что мы принимаем ссылку на объект.
  • Вопрос задан
  • 317 просмотров
Решения вопроса 1
Символ & в С++ имеет два различных смысла в зависимости от места использования:
1) Когда & используется в описании тип - это обозначение того, что тип является ссылочным.
Пример:
int b = 5;
int &a = b; //a - это объект-ссылка тип int. Инициализирован объектом b


2)Когда & применяется к объекту - это оператор взятия адреса.
Пример:
int b = 5;
int * a = &b; //а - это указатель на объект типа int. Инициализирован адресом объекта b
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
Ссылка это не адрес, адрес это указатель.
n_Name объявлено видимо, как String *n_Name - т.е. n_Name - указатель, поэтому обращаясь c.n_Name вы получаете адрес объекта.
Воспринимайте ссылки как псевдонимы (алиасы) существующих переменных. Обращаться со ссылками следует как с обычными переменными, а не как с указателями.
Ответ написан
Комментировать
@Dvvarreyn
Предположения:
  • оператор & не перегружен.
  • Вывод в поток не определён для объекта .n_Name каким-то фантасмагорическим образом.


В определении функции указан способ передачи аргумента. Указано, что он передаётся по ссылке, но это техническая деталь, формально же при этом внутри функции с — это не адрес, а сам объект.
Если нужно передать адрес, то в описании должна быть *
constructor_and_d_and_c::constructor_and_d_and_c(const constructor_and_d_and_c* c)


В объекте может быть несколько полей данных. Адрес первого поля и объекта обычно совпадают.

& в теле функции означает взятие адреса. Код
cout << &c;
выдаст адрес объекта.

Код
cout << &c.n_Name;
выдаст адрес поля, и, возможно, он совпадёт с адресом c.

Судя по тому, что происходит. n_Name — это адрес памяти, которая выделяется для размещения строки. Не совсем понятно, зачем так сделано, можно было сделать полем класса строку напрямую, а не адрес на неё. Но так или иначе, у переменной содержащей адрес, тоже есть адрес.
Поэтому
cout << c.n_Name;
выдаёт какой-то адрес. Но это не адрес объекта с или поля c.n_Name. Это адрес динамически выделенной памяти под строку.

n_Name = new string(*(c.n_Name));
По адресу строки с помощью * получаем объект-строку, далее создаём новую строку, адрес пишем в n_Name.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы