我有以下代码:
代码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;
}
};
Run Code Online (Sandbox Code Playgroud)
代码2:
// no change from code 1
const Student& getObject() {
return *this;
}
// no change from code 1
Run Code Online (Sandbox Code Playgroud)
正如我正在阅读的书所解释的那样,代码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
Run Code Online (Sandbox Code Playgroud)
我不懂.如果getObject()返回一个引用,那么测试代码中的第1行也应该显示111,MMMMMM?因为我认为harry1应该包含harry对象的地址??? 还是我误解了什么?
虽然harry.getObject()是对原始对象的引用,但是你会使用赋值来破坏它:
harry1 = harry.getObject();
Run Code Online (Sandbox Code Playgroud)
执行副本.
代替:
Student const& harry1 = harry.getObject();
Run Code Online (Sandbox Code Playgroud)