2010-07-13 4 views
0

Нет, это не про ошибку, которую каждый из проезжающих местных жителей. Я просто пытаюсь понять возвращение ссылки на объект, который вы проходите (я читаю через праймер).О возвращении ссылок на объекты

Так что, если у меня есть функция, как это:

const foo & foo::function2(const foo & val) const 
{ 
    using namespace std; 
    return *this; 
} 

и затем я в этом главная:

foo object1; 
object1.someproperty = 7; 

foo object2 = object1.function2(object1); 
object2.someproperty = 5; 

cout << &object1 << endl; 
cout << &object2 << endl; 

Когда я вернусь по ссылке, не должно object2 иметь то же самое адрес (и свойства) как object1? Не следует ли изменять «someproperty» в одном объекте, изменить значение в другом? Или, возвращая ссылку на объект, просто скопируйте значения в новый объект?

Кажется, что то же самое происходит, как будто я только что сказал, что я собираюсь вернуть объект foo вместо ссылки на него.

+0

Нет, потому что вы объявляете два разных объекта в стеке и копируете их значения. – cpx

ответ

6
foo object2 = object1.function2(object1); 

function2() возвращает ссылку на object1; затем создается конструктор копии foo, чтобы скопировать object1 в object2, так как object2 объявлен как объект foo.

Если вы объявили object2 в качестве константной ссылки вместо:

const foo& object2 = object1.function2(object1); 

тогда object2 будет ссылка на object1.

+0

Ах, хорошо, имеет смысл, что пара вещей неявно происходит под капотом. Спасибо всем за очень быстрые и тщательные ответы. – Ilya

0

Строка кода:

foo object2 = object1.function2(object1); 

делает 2 вещи.

  1. ссылка (что случается, чтобы обратиться к object1) возвращается из function2()
  2. инициализация object2 создает копию объекта, возвращенного function2()
1

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

foo object2(object1.function2(object1)); 

Где автоматически генерируется конструктор копирования заключается в следующем:

class foo { 
public: 
    foo(const foo& other) { 
    //shallow copy other to this 
    } 
} 

Для того, чтобы получить код, чтобы делать то, что вы думаете, что нужно сделать, вам нужно объявить объект 2, как const ссылка:

const foo& object2 = object1.function2(object1); 
//&object2 == &object1 
Смежные вопросы