类的成员函数返回对象的指针:
return this;
返回值类型 : 类名*
支持链式调用:通过返回对象的指针,可以使得调用者能够连续调用该对象的其他成员函数,使用箭头操作符 (->)
条件性操作:可以根据条件返回对象自身的指针或nullptr,以表示某种状态或条件
#include <iostream>using namespace std;class MyClass
{
private:int num1;public:MyClass(){num1 = 0;}// 返回值类型为 MyClass*MyClass *change(){num1 += 1;// 表示指向MyClass类型对象的指针return this;}void show(){cout << num1 << endl;}
};
int main()
{MyClass mc1;// mc1的num1// +1 +1 =2mc1.change()->change()->show();// mc1的num1// +1 +1 =4mc1.change()->change()->show();// mc1的num1// +1 +1 =6mc1.change()->change()->show();return 0;
}
类的成员函数返回对象的引用:
return *this
返回值类型: 类名&
支持链式调用:使得调用者可以连续调用该对象的其他成员函数,使用点操作符 (.)
修改原始对象:由于返回的是引用,对返回对象所做的任何修改都会反映在原始对象上,而不是其副本
#include <iostream>using namespace std;class MyClass
{
private:int num1;public:MyClass(){num1 = 0;}// 返回值类型为 MyClass&MyClass& change(){num1 += 1;// 表示当前对象return *this;}void show(){cout << num1 << endl;}
};
int main()
{MyClass mc1;// mc1的num1// +1 +1 =2mc1.change().change().show();// mc1的num1// +1 +1 =4mc1.change().change().show();// mc1的num1// +1 +1 =6mc1.change().change().show();return 0;
}
类的成员函数返回对象的副本:
return *this
返回值类型 类名
当类的成员函数返回对象的副本时,它创建并返回当前对象或操作结果的一个新实例。这种做法适用于不希望外部修改原始对象,或需要返回一个局部修改后状态的场合
值语义:与返回引用或指针相比,返回副本强调了值语义,即每个对象都拥有自己的状态
缺点:链式调用难以判断
#include <iostream>using namespace std;class MyClass
{
private:int num1;public:MyClass(){num1 = 0;}// 返回值类型为 MyClassMyClass change(){num1 += 1;// 表示当前对象副本return *this;}void show(){cout << num1 << endl;}
};
int main()
{MyClass mc1;// 1 mc1的num1+1=1// 2 复制副本 副本num1+1=2// 3 显示副本的 num1=2// 4 临时副本销毁mc1.change().change().show();// 此时观察num1的值为1:mc1.show(); // 1// 1 mc1的num1+1=2// 2 复制副本 副本num1+1=3// 3 显示副本 num1=3// 4 临时副本销毁mc1.change().change().show();// 此时观察num1的值为2:mc1.show(); // 2// 1 mc1的num1+1=3// 2 复制副本 副本num1+1=4// 3 显示副本 num1=4// 4 临时副本销毁mc1.change().change().show();// 此时观察num1的值为3:mc1.show(); // 3return 0;
}