C++类与对象——this指针

概述

本篇博客主要讲解C++类和对象模块中的this指针的知识,将会深入探究this指针的使用细节即使用时需要注意的点,并且简单讲解一下底层的实现原理。

this指针的引出

我们首先定义一个日期类data

class Date
{
private:
	int _year;  //年
	int _month; //月
	int _day;   //日
	int a;
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month
		_day = day;
	}
	void print()
	{
		std::cout << _year << "-" << _month << "-" << day << endl;
	}
	Date cp_year(const Date& x)
	{
		//如何将当前类的年份数据和其他类进行比较?
		if(x._year>????)
			reutnr x;
		else
			return ???;
		//???处应该填写什么
	}
};

int main()
{
	Date d1,d2;
	d1.Init(2022,1,2);
	d2.Init(2023,3,24);
	d1.print();
	d2.print();
	return 0;
}

在上面使用日期类的时候,就会有一些问题:

Date类中有InitPrint两个成员函数,函数体中并没有关于不同对象的区分,当d1调用Init函数时,该函数时如何知道应该设置d1对象时,而不是设置d2对象呢?
'cp_year’如果是当前类的年份更大,应该返回什么东西呢?

这里就要用到this指针了,c++通过引入this指针解决这些问题。

c++编译器给每个**”非静态的成员函数“增加了一个隐藏的指针参数**,让该指针去指向当前对象(函数运行时调用函数的对象),在函数体中所有"成员变量"的操作,都是通过该指针去访问的。只不过所有操作对用户都是”透明“的(不可见的),都是通过该指针去访问,即用户不需要传递该指针,编译器自动完成。

注意

  1. 编译器同时也静止用户在函数声明中加上该指针,这是语法规定。
    在这里插入图片描述
    像这样,编译器会报错
  2. this指针在运行时会存在于对象内部吗?
    不存在于对象内部,this指针是一个形参,所以this指针是跟普通参数一样存在于函数调用的栈帧里面的。

this指针的特性

  1. this指针的类型: 类类型const指针,例如上面的类其this指针类型为(Date * const this),即成员函数中,不能给this指针赋值。(不能改变this指针的指向)
  2. 只能在成员函数内部使用
  3. this指针本质上是成员函数的形参,当对象调用成员函数时,编译器将隐式地将对象地址作为实参传递给this形参,所以对象中不存储this指针
  4. vs上对this指针的传递做出了优化,由于其经常要使用,vs编译器将this指针通过寄存器自动传递,从而可以提高访问效率,如下图所示:

在这里插入图片描述

另外,通过过this指针的了解,我们可以知道编译器在处理成员函数时会对其加上this指针,例如:

//类成员函数的print()函数将会被编译器隐式处理成如下形式:
void print(Date* const this)
{
	std::cout << this->_year << "-" << this->_month << "-" << this->day << endl;
}
//隐式处理过程用户不可见

//并且调用过程
//d1.print()也相当于隐式地将d1的地址作为实参传递给了this指针
print(&d1);

将this指针用于多个对象的比较

当对this指针有了了解之后,我们就可以涌起去完善刚才无法完成的cp_year函数了,如下:

	Date cp_year(const Date& x)
   {
   	//注意,this是对象的指针,要使用其中的数据需要对其进行解引用操作
   	if (x._year > (*this)._year)
   		return x;
   	else
   		return *this ;
   }
   //接着就可以用这个函数来进行比较年份
   Date old = d1.cp_year(d2);
   old.print();

this指针可以为空吗?

看下面一个代码:

Date* p = nullptr;
p->print();
return 0;

大家可以先想一想,这段代码最后能够正常运行吗?还是会编译报错,又或者是运行时崩溃?


答案是:运行错误

为什么呢?

这是由于编译器并不禁止传递空指针给this形参,但是当print()函数要打印数据时会对this指针解引用(this->_year),而对空指针解引用是会产生错误的,所以会发生运行崩溃。


以上就是关于this指针的全部内容啦!如果小伙伴们有哪里没有理解,或者发现博主的错误以及还有哪里没有写到位的话,欢迎大家在评论区指出!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在面向对象的编程中,C语言并不直接支持和抽象的概念。引用中提到,final关键字用来修饰方法,表示该方法不能在子中被覆盖。而abstract关键字用来修饰抽象方法,表示该方法必须在子中被实现。然而,在C语言中,没有对应的关键字来实现和抽象的概念。 相反,C语言通过结构体来模拟的概念。结构体是一种用户自定义的数据型,可以包含多个不同型的数据成员。通过结构体,我们可以将相关的数据和功能组合在一起。然而,C语言中的结构体不支持继承和多态等面向对象的特性。 在C语言中,我们可以使用函数指针来模拟抽象和接口的概念。函数指针可以指向不同的函数,通过使用函数指针,我们可以实现多态性,即在运行时根据函数指针指向的具体函数来执行不同的操作。 综上所述,C语言并不直接支持面向对象中的和抽象的概念,但可以使用结构体和函数指针来实现似的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [面向对象——对象](https://blog.csdn.net/shouyeren_st/article/details/126210622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [面向对象编程原则(06)——依赖倒转原则](https://blog.csdn.net/lfdfhl/article/details/126673771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮雨清秋.L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值