首页 > 其他分享 >22.this指针

22.this指针

时间:2022-09-22 21:36:59浏览次数:55  
标签:20 函数 22 对象 成员 Maker 指针

.this指针工作原理

我们知道,c++的数据和操作也是分开存储,并且每一个非内联成员函数(non-inline member function)只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码

  那么问题是:这一块代码是如何区分那个对象调用自己的呢?

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

  c++规定,this指针是隐含在对象成员函数内的一种指针。当一个对象被创建后,它的每一个成员函数都含有一个系统自动生成的隐含指针this,用以保存这个对象的地址,也就是说虽然我们没有写上this指针,编译器在编译的时候也是会加上的。因此this也称为“指向本对象的指针”,this指针并不是对象的一部分,不会影响sizeof(对象)的结果。

  this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每一个对象都拥有自己的函数成员。一般情况下,并不写this,而是让系统进行默认设置。

this指针永远指向当前对象。

this指针永远指向当前对象。

  成员函数通过this指针即可知道操作的是那个对象的数据。This指针是一种隐含指针,它隐含于每个类的非静态成员函数中。This指针无需定义,直接使用即可。

  注意:静态成员函数内部没有this指针,静态成员函数不能操作非静态成员变量。

2.this指针的使用

●当形参和成员变量同名时,可用this指针来区分

●在类的非静态成员函数中返回对象本身,可使用return *this.

class Person{
public:
	//1. 当形参名和成员变量名一样时,this指针可用来区分
	Person(string name,int age){
//name = name;
		//age = age; //输出错误
		this->name = name;
		this->age = age;
	}
	//2. 返回对象本身的引用
	//重载赋值操作符
	//其实也是两个参数,其中隐藏了一个this指针
	Person PersonPlusPerson(Person& person){
		string newname = this->name + person.name;
		int newage = this->age + person.age;
		Person newperson(newname, newage);
		return newperson;
	}
	void ShowPerson(){
		cout << "Name:" << name << " Age:" << age << endl;
	}
public:
	string name;
	int age;
};

//3. 成员函数和全局函数(Perosn对象相加)
Person PersonPlusPerson(Person& p1,Person& p2){
	string newname = p1.name + p2.name;
	int newage = p1.age + p2.age;
	Person newperson(newname,newage);
	return newperson;
}

int main(){

	Person person("John",100);
	person.ShowPerson();

	cout << "---------" << endl;
	Person person1("John",20);
	Person person2("001", 10);
	//1.全局函数实现两个对象相加
	Person person3 = PersonPlusPerson(person1, person2);
	person1.ShowPerson();
	person2.ShowPerson();
	person3.ShowPerson();
	//2. 成员函数实现两个对象相加
	Person person4 = person1.PersonPlusPerson(person2);
	person4.ShowPerson();

	system("pause");
	return EXIT_SUCCESS;
}

3.视频内容

程序1:

#pragma warning(disable:4996)
//2022年9月22日20:31:02
#include <iostream>
using namespace std;

class Maker
{
public:
    Maker()
    {
        a = 10;
        b = 20;
    }
    void func()
    {
        cout << this->a << " " << this->b << endl;
    }
public:
    int a;
    int b;
};
void test01()
{
    //1.分配空间。2.调用构造函数
    Maker m;
    m.func();
}
int main()
{
    test01();
    system("pause");
    return 0;
}

输出结果:

10 20
请按任意键继续. . .


程序2:

#pragma warning(disable:4996)
//2022年9月22日20:31:02
#include <iostream>
using namespace std;

class Maker
{
public:
    Maker()
    {
        a = 10;
        b = 20;
    }
    void func()//func()函数只有一份
    {
        cout << this->a << " " << this->b << endl;
    }
public:
    int a;
    int b;
};

void test01()
{
    //1.分配空间。2.调用构造函数
    Maker m;
    m.func();

    Maker m2;
    m2.func();
}

class Maker2
{
public:
    int id;
public:
    //1.当形参名和成员变量名相同时,用this指针区分
    Maker2(int id)
    {
        this->id = id;
    }
    //2.反回对象的本身
    Maker2 &getMaker2()
    {
        return *this;//运算符重载时有用
    }
};

int main()
{
    test01();
    system("pause");
    return 0;
}


程序3:

#pragma warning(disable:4996)
//2022年9月22日20:31:02
#include <iostream>
using namespace std;

class Maker
{
public:
    Maker()
    {
        a = 10;
        b = 20;
    }
    void func()//func()函数只有一份
    {
        cout << this->a << " " << this->b << endl;
    }
public:
    int a;
    int b;
};

void test01()
{
    //1.分配空间。2.调用构造函数
    Maker m;
    m.func();

    Maker m2;
    m2.func();
}

class Maker2
{
public:
    int id;
    static int a;//静态成员变量
public:
    //1.当形参名和成员变量名相同时,用this指针区分
    Maker2(int id)
    {
        this->id = id;
    }
    //2.反回对象的本身
    Maker2 &getMaker2()
    {
        return *this;//运算符重载时有用
    }
    static void func()
    {
        this->a = 300;//静态成员变量,指针指向的空间并没有a
    }
};
int Maker2::a = 200;

int main()
{
    test01();
    system("pause");
    return 0;
}

4.this指针(重点难点)

1.每个对象都有一个隐藏的this指针,但不属于对象,是编译器添加的

2.编译器会把this指针传入成员函数内

3.this指针指向对象的存储空间

4.this的作用:

class Maker2
{
public:
	//1.当形参名和成员变量名相同时,用this指针区分
	Maker2(int id)
	{
		this->id = id;
	}
	//2.返回对象的本身
	Maker2 &getMaker2()
	{
		return *this;//运算符重载时有用
	}
public:
	int id;
};

5.拓展

1.this指针指向的空间有没有存储静态成员变量?

没有

2.this指针的指向可以改变吗?

this指针的指向不能改变,也就是说this是Maker *const this;

6.防止空指针调用成员函数

class Maker
{
public:
	Maker()
	{
		a = 20;
	}

	void printMaker()
	{
		if (this == NULL)
		{
			cout << "this==NULL" << endl;
			return;
		}
		
		cout << this->a << endl;
	}
private:
	int a;
};

void test()
{
	Maker *m = NULL;
	m->printMaker();
}

标签:20,函数,22,对象,成员,Maker,指针
From: https://www.cnblogs.com/codemagiciant/p/16720912.html

相关文章

  • 20220922缉
    20220922(种苹)t1[COCI2015-2016#6]PAROVI最初思路若选择二元组中不包含1,那Slavko只需选择2作为x即可对所有二元组满足a,b≥x;同样,若不包含n,则Slavko只需选择n作为x即可满......
  • 2022.9.12———HZOI【CSP-S模拟4】游寄
    \(Preface\)\(Rank32/43\)\(0pts+40pts+40pts+20pts=100pts\)\[\Huge\mathbf{水博客警告}\]\(\mathfrak{T1}\石子游戏\)\(mad\)上来一个博弈论呼我脸上,这......
  • 9.22 DAY 01
    记录一下读的文献,以便日后翻阅。读论文:2020_NeurIPS_RegionAttentionNetworkforSemanticSegmentation关键词记录Method:使用区域上下文关系,建立起像素之间的空间(sp......
  • C语言第15天,指针与多维数组
    ##数组名的转换规则当数组名arr出现在一个表达式当中,数组名arr将会被转换为指向数组首元素的指针。但是,这个规则有两个例外:1.对数组名arr使用sizeof时。2.对数组名......
  • 闲话 22.9.22
    闲话发现最近gtm在无意识(?)地唱《月光》。于是放一下歌词!(其实就是你自己想放吧喂)月光ガラクタばかりを集めて一味收集毫无价值的杂物ボロ切れひとつを被せた以一......
  • 【闲话】2022.09.22 闲话
    今日闲话guge与wenqizhi早上跑完操:wenqizhi:看TST的涩图题解ing……bikuhiku:经过guge:看到了wenqizhi比较花的电脑屏幕bikuhiku:意识到了什么,然后开始乐......
  • hypermesh研三系统学习(2022/9/22)1000
    hypermesh2019视频教程洛千柔                       ......
  • Test 2022.09.22
    今天是COCI专场T1PAVORI题意从\(1-n\)的所有数中选出若干组两两互质的二元组,使得数轴上的\(1-n\)之间的区间被完全覆盖的方案数解决容易想到先排序然后再dp,定义\(dp[......
  • 2022.9.22
    最近真的被很多事情烦死了,实习难,就业难,考研难,还不知道大四要不要继续打好(现在热情已经损耗的差不多了,想退役了),队友又摆烂(等退役小文章再吐槽),学校课程又乱七八糟(实验课什么......
  • 2022 ios APP最新开发测试教程
    1.本文详细介绍最新的在windows上进行iosapp开发编译打包安装到手机测试的完整流程。介绍ios开发经常遇到的问题和解决方法,包括ios开发证书,ios开发描述文件等。2.App......