我有以下代码:

代码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

正如我正在阅读的书所述,代码1和2的getObject()的区别在于代码2的getObject()返回对当前对象的引用,而不是拷贝(出于效率原因)。

但是,我已经测试(代码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,MMMMMM?因为我认为harry1应该包含harry对象的地址???
还是我误会了什么?

最佳答案

尽管harry.getObject()是对原始对象的引用,但是您可以通过赋值破坏它:

harry1 = harry.getObject();

执行复制。

反而:
Student const& harry1 = harry.getObject();

10-04 21:58