c++ 学习 之 this 指针的学习

发布于:2023-09-15 ⋅ 阅读:(60) ⋅ 点赞:(0)

前言

在c++ 中类内成员变量和成员函数分开存储
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会公用一块代码
那么问题来了,这一块代码是如何区分哪个对象调用自己呢?

c++ 通过提供特殊的对象指针,this指针,解决上述问题,
his指针指向被调用的成员函数所属于的对象

his 指针是隐含每一个非静态成员函数内的一种指针
this 指针不需要定义,直接使用即可

正文

this 指针有什么作用

1. 解决名称冲突

先看看下面的代码有没有问题

#define CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class Person
{
public:
	Person(int age)
	{
		age = age;
	}

	int age;
	
};

void test()
{
	Person p(18);
	cout << p.age << endl;
}
int main()
{
	test();
}

答案是有问题,person 的构造函数里面 age 出现冲突,怎么解决这个问题呢

#define CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class Person
{
public:
	Person(int age)
	{
		this->age = age;
	}

	int age;
	
};

void test()
{
	Person p(18);
	cout << p.age << endl;
}
int main()
{
	test();
}

2.返回对象本身用 * this

我们先来看看下面的代码

#define CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class Person
{
public:
	Person(int age)
	{
		this->age = age;
	}

	void PersonAdd(Person& p)
	{
		this->age += p.age;
	}

	int age;
	
};

void test()
{
	Person p(18);
	Person p2(18);

	p.PersonAdd(p2);  // 正确的
	p.PersonAdd(p2).PersonAdd(p2).PersonAdd(p2);   // 错误的
	cout << p.age << endl;
}
int main()
{
	test();
}

那怎么让上面的代码变得正确呢
看看下面的代码

#define CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class Person
{
public:
	Person(int age)
	{
		this->age = age;
	}

	Person &  PersonAdd(Person& p)
	{
		this->age += p.age;
		// this 指向的是 指向 自身的一个指针
		return *this;
	}

	int age;
	
};

void test()
{
	Person p(18);
	Person p2(18);

	p.PersonAdd(p2);  // 正确的
	p.PersonAdd(p2).PersonAdd(p2).PersonAdd(p2);   //这种编程思想是链式编程思想
	cout << p.age << endl;
}
int main()
{
	test();
}

让 PersonAdd()这个函数设置返回值为 Person 类就可以啦(记得要设置的是引用,这样后续才能修改里的参数
看看运行的效果
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到