27.1 知识点
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;// 先看一个缺陷
class Person
{
public:
Person(int age) {
age = age; // 我们认为:成员变量 = 形参
} // 但编译器认为: “形参 = 形参” // 本质:编译器根本没有将左边的age认为是p的
// 因此名称冲突会引发bug
int age;
};
void test()
{
Person p(18);
cout << "p的年龄 = " << p.age << endl; // 结果:乱码
}****************************************************************************************
// 解决:
// 方式一:成员函数的形参 和 成员变量 使用不同名称
// 方式二:使用this指针
class Person1
{
public:
Person1(int age) {//作用:解决命名冲突
this->age = age; // this指针:谁调用的,指向谁 // 告知编译器,左边的age是属于p1的
// 注意:谁调用就指向谁,因此this的指向不可以改变,本质是 Person * const this = &p1(指针常量)
// 因此 1、 this->age 等价于 p1.age
// 2、 this = NULL; // err:这种写法的是错误的 // this 的指向不可修改 }
int age;
};
void test01()
{
Person1 p1(18);
cout << "p的年龄 = " << p1.age << endl; // 结果: p的年龄 = 18
}
27.2 利用 this 指针实现链式编程
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class Person
{
public:
Person(int age) { // 拷贝构造函数用于初始化
m_Age = age;
}
Person& addAge(Person &p) // 参数为引用 返回值类型为引用
{
m_Age += p.m_Age; // 自身年龄翻倍
return *this; // 谁调用返回谁 this 相当于 Person * const this = &p1
} // 返回 *this 相当于返回 p1 本身
int m_Age;
};
void test01()
{
Person p1(18);
cout << "p1 的年龄为: " << p1.m_Age << endl; // 结果: p1的年龄 = 18
p1.addAge(p1).addAge(p1); // 这是一种链式编程
cout << "p1 的年龄为: " << p1.m_Age << endl; // 结果: p1的年龄 = ( 18*2) *2 = 72
/*
解析:
p1 // p1 中 m_Age = 18
p1.addAge(p1) // p1 中 m_Age = 18 + 18 = 36
p1.addAge(p1).addAge(p1) // p1 中 m_Age = 36 + 36 = 72
*/
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}