类的成员函数返回对象的指针:
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 =2
mc1.change()->change()->show();
// mc1的num1
// +1 +1 =4
mc1.change()->change()->show();
// mc1的num1
// +1 +1 =6
mc1.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 =2
mc1.change().change().show();
// mc1的num1
// +1 +1 =4
mc1.change().change().show();
// mc1的num1
// +1 +1 =6
mc1.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;
// 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(); // 3
return 0;
}