目录
成员函数返回this对象本身时,内部通常会通过拷贝构造函数来创建一个临时对象?
前言
- this指针是隐含每一个非静态成员函数内的一种指针
- this指针不需要定义,直接使用即可
- 当形参和成员变量同名时,可用this指针来区分
- 在类的非静态成员函数中返回对象本身,可使用return *this
成员函数返回this指向的对象本身时,为什是返回引用类型?
#include <iostream>
using namespace std;
class Person
{
public:
Person(int age)
{
// 1、当形参和成员变量同名时,可用this指针来区分
this->age = age; // this->成员,类似结构体指针访问成员
}
Person& PersonAddPerson(Person p)
{
this->age += p.age;
return *this; // 返回对象本身
}
int age;
};
void test01()
{
Person p1(10);
cout << "p1.age = " << p1.age << endl; // 10
Person p2(10);
/* 链式调用,第一次得到20,返回p2本身,再继续调用,最终加两次得到40(如果返回的是Person类型,这里得到的是20)*/
p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);
cout << "p2.age = " << p2.age << endl; // 40
}
int main() {
test01();
return 0;
}
成员函数返回this对象本身时,内部通常会通过拷贝构造函数来创建一个临时对象?
当一个函数返回一个对象时,编译器会使用拷贝构造函数来生成该返回对象的副本。拷贝构造函数是一个特殊的类成员函数,用于将一个对象的数据成员的值复制到另一个对象中。
假设我们有一个简单的类 Person,具有一个 name 字符串成员变量:
class Person {
public:
std::string name;
Person(const std::string& n) : name(n) {}
// 拷贝构造函数
Person(const Person& other) : name(other.name) {}
};
// 现在,我们有一个函数 getPerson(),它返回一个 Person 对象:
Person getPerson() {
Person p("Alice");
return p;
}
在这个例子中,当 getPerson() 函数被调用时,它会创建一个 Person 对象 p,并将其初始化为 "Alice"。然后,函数将返回 p。
在返回的过程中,编译器会使用拷贝构造函数来生成返回对象 p 的副本。这意味着在调用 getPerson() 后,将会创建一个新的 Person 对象,其中的 name 字符串值被复制为 "Alice"。这是因为我们不能直接返回函数内部的局部对象 p,因为它是在函数结束后将被销毁的。
因此,拷贝构造函数在这里的作用是在函数返回对象时,根据已有对象的值创建一个新的对象,确保返回的对象是有效且具有正确的值。
总结
this指针是一个特殊的指针,用于访问当前对象的成员。它提供了一种便捷的方式来引用当前对象的成员变量和成员函数,并解决名称冲突的问题。