c++成员函数返回类对象引用和直接返回类对象的区别
成员函数直接返回类对象(返回临时对象,对象拷贝)
#include <iostream>
class MyInt {
public:
int value;
//构造函数
explicit MyInt(int v=0) : value(v){}
//加法操作,返回对象副本(拷贝对象)
MyInt add(int x) {
value += x;
//this 是一个指向当前对象的指针,表示当前对象的存储地址。
//*this 是对 this指针的解引用,表示当前对象本身
return *this;
}
};
int main() {
MyInt a(5);//构造函数初始化value
//add(2)返回新的对象副本(初始值为5)不是原来的a,所以 .add(3)是对临时对象的操作
a.add(2).add(3);
std::cout << a.value << std::endl;
return 0;
}
对象成员变量被初始化为5
a.add(2).add(3) 的执行顺序是关键。以下是详细解释:
a.add(2) 的执行:
a.add(2) 调用 add 方法,将 a.value 的值从 5 增加到 7。
add 方法返回的是当前对象的副本(*this),返回类型 函数名称 MyInt add(),而不是对原对象 a 的引用。
.add(3) 的执行:
.add(3) 是对 a.add(2) 返回的临时对象的操作,而不是对原对象 a 的操作。
临时对象的 value 是 7,它被加上 3,但这个副本不会影响原对象 a。
std::cout << a.value:
输出的是原对象 a 的 value,此时 a.value 仍然是 7,因为 .add(3) 的操作只影响了临时对象
成员函数返回类对象引用(返回对象引用)
#include <iostream>
class MyInt {
public:
int value;
//构造函数
explicit MyInt(int v=0) : value(v){}
//加法操作,返回类型别名(引用),对别名的操作就是对对象本身的操作
MyInt& add(int x) {
value += x;
//this 是一个指向当前对象的指针,表示当前对象的存储地址。
//*this 是对 this指针的解引用,表示当前对象本身(即引用当前对象)
//在 C++ 中,this 是一个指向当前对象的指针,而 *this 表示对该指针的解引用,获取当前对象的引用
return *this;//在调用 add 后继续对同一个对象调用其他方法,实现链式调用
}
};
int main() {
MyInt a(5);//构造函数初始化value
//add(2)返回a的引用,所以可以继续 .add(3)
a.add(2).add(3); //链式调用允许多个操作在一行代码中连续执行,而无需多次引用对象
std::cout << a.value << std::endl;
return 0;
}
在代码中,a.add(2).add(3); 的执行顺序是关键。
a.add(2):
调用 add 方法,value 的值从 5 增加 2,变为 7。
add 方法返回当前对象的引用(*this),对引用(别名)的操作就是对原对象的操作,因此可以继续调用链式方法。
.add(3):
在 a.add(2) 返回的对象上再次调用 add 方法。
此时,value 的值从 7 增加 3,变为 10。
最终,a.value 的值是 10,因此输出结果为 10。