在C ++中返回当前对象(* this)?

时间:2011-05-11 11:57:36

标签: c++ reference

我有以下代码:

代码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对象的地址??? 或者我误解了什么?

5 个答案:

答案 0 :(得分:5)

虽然harry.getObject()是对原始对象的引用,但是你会使用赋值来破坏它:

harry1 = harry.getObject();

执行复制。

相反:

Student const& harry1 = harry.getObject();

答案 1 :(得分:4)

您正在将getObject返回的引用分配给Student,因此它会在代码1中稍后复制一次(从{{1}返回时将直接复制它) })。使用

getObject

获取哈里的参考。请注意,您必须在一个步骤中声明和初始化引用。

答案 2 :(得分:2)

您正在使用实际对象,而不是指针或引用。当你说:

harry1 = harry.getObject()

harry的内容由默认赋值运算符复制到harry1。

答案 3 :(得分:1)

你的测试代码中的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

答案 4 :(得分:1)

常见建议:定义一个私有的,没有实现的拷贝构造函数:

private:
  Student(Student& xOther);

这样,如果您碰巧有不需要的副本,编译器会检测到它们(您的harry1实际上是一个副本)。如果你希望有副本,你可以正确控制它们的完成方式,从而避免混淆潜在的指针或封装的对象。