c++成员函数返回类对象引用和直接返回类对象的区别
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。