Вернуть текущий объект (* this) в C ++? - PullRequest
3 голосов
/ 11 мая 2011

У меня есть следующий код:

Код 1

class Student {
     int no;
     char grade[M+1];
 public:
     Student() {
         no = 0;
         grade[0] = '\0';
     }
     void set(int n, const char* g) {
         no = n;
         strcpy(grade, g);

     }
     const Student getObject() {
         return *this;
     }
     void display() const {
         cout << no << ", " << grade << endl;
     }
 };

Код 2:

// no change from code 1
const Student& getObject() {
         return *this;
     }
// no change from code 1

В книге, которую я читаю, объясняется разница в getObject() кода 1 и 2 заключается в том, что getObject () кода 2 возвращает ссылку на текущий объект вместо копии (из соображений эффективности).

Однако я проверял (код 2)следующим образом:

Проверенный код:

Student harry, harry1;
    harry.set(123, "ABCD");

    harry1 = harry.getObject();
    harry1.set(1111,"MMMMMM");
    harry.display(); // Line 1 => displayed: 123, ABCD
    harry1.display(); / Line 2 => displayed: 1111, MMMMMM

Я не понимаю.Если getObject () возвращает ссылку, то строка 1 в тестируемом коде также должна отображать 111, ММММММ?Потому что я думал, что harry1 должен содержать адрес объекта Гарри ???Или я что-то неправильно понимаю?

Ответы [ 5 ]

5 голосов
/ 11 мая 2011

Хотя harry.getObject() является ссылкой на исходный объект, вы затем разрушаете его с помощью назначения:

harry1 = harry.getObject();

, который выполняет копирование.

Вместо того, чтобы:

Student const& harry1 = harry.getObject();
4 голосов
/ 11 мая 2011

Вы присваиваете ссылку, возвращаемую getObject, Student, поэтому она копируется всего несколькими шагами позже, как в коде 1 (где она будет скопирована непосредственно после возврата из getObject). Используйте

Student& harry1 = harry.GetObject();

чтобы получить ссылку на Гарри. Обратите внимание, что вы должны объявить и инициализировать ссылки за один шаг.

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

Вы используете реальные объекты, а не указатели или ссылки.Когда вы говорите:

harry1 = harry.getObject()

содержимое гарри копируется оператором присваивания по умолчанию в гарри1.

1 голос
/ 11 мая 2011

Советы общего характера: определите конструктор копирования, частный и не реализованный:

private:
  Student(Student& xOther);

Таким образом, если у вас есть нежелательная копия, компилятор обнаружит их (ваш harry1 на самом деле является копией).И если вы ожидаете, что у вас будут копии, вы можете должным образом контролировать, как они выполняются, что позволяет избежать путаницы с потенциальными указателями или инкапсулированными объектами.

1 голос
/ 11 мая 2011

harry1 в вашем тестовом коде является экземпляром Student, а не ссылкой. Измените это на это:

Student harry;
harry.set(123, "ABCD");

Student& harry1 = harry.getObject();
harry1.set(1111,"MMMMMM");
harry.display(); // Line 1 => displayed: 123, ABCD
harry1.display(); / Line 2 => displayed: 1111, MMMMMM
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...