C++中关于this指针的入门介绍

 更新时间:2022年07月08日 08:36:20   作者:幻荼  
this 指针在C++类和对象中是个很方便实用的关键字,可以简化对象成员属性的调用,使代码表达的含义更加准确;在之前的学习中我们都可以判断变量所占内存空间大小,那么我们创建的类对象所占的内存空间怎么计算呢?想知道this的妙用和类对象占用的内存空间就来跟我学习吧

简介

C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参

数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

特性

1. this指针的类型:类类型* const

2. 只能在“成员函数”的内部使用

3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this

形参。所以对象中不存储this指针。

4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

举例

class Data {
public:
	void Printf()
	{
		cout << _year <<" "<<" "<< _month <<" "<< _day << endl;
	}
	void Init(int year=2022,int month=5,int day=25)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data d1,d2;
	d1.Init(2022,1,1);
	d1.Printf();
	d2.Init(2022,2,2);
	d2.Printf();
	return 0;
}

这是一个简单的日期类,那么这里有一个问题,我们在使用打印函数Printf和初始化函数Init的时候,d1和d2调用的是同一个函数,那么编译器是怎么知道我是应该设置/打印d1还是d2呢?

这其实就使用了this指针

那么具体编译器是怎么做的呢?

void Printf(const* this)//编译器实际上处理的
	{
		cout << this->_year << " " << this->_month << " " << this->_day << endl;
	}
	void Printf()//我们看到的
	{
		cout << _year <<" "<<" "<< _month <<" "<< _day << endl;
	}
void Init(const* this,int year=2022,int month=5,int day=25)//编译器处理的
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}
	void Init(int year = 2022, int month = 5, int day = 25)//我们看到的
	{
		_year = year;
		_month = month;
		_day = day;
	}
d1.Init(2022,1,1);//我们看到的
	d1.Init(&d1,2022, 1, 1);//编译器实际上处理的

实际上编辑器取了d1和d2函数的地址,然后传递给了const*this,这样编译器就能自动打印和初始化相应的结构了。

注意

我们不能自己在传参处加const*this和&,这是编译器自己做的,我们不能抢了编译器的活,即使做了,编译也不会通过,但是里面我们可以加

void Printf(const* this)//错误
	{
		cout << _year <<" "<<" "<< _month <<" "<< _day << endl;
	}
void Printf()//可以运行,但是编译器默认都会加this->,所以我们可以不用加,加了也没事
	{
		cout <<this-> _year <<" "<<" "<< this->_month <<" "<< this->_day << endl;
	}

到此这篇关于C++中关于this指针的入门介绍的文章就介绍到这了,更多相关C++ this指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言文件操作函数大全(超详细)

    C语言文件操作函数大全(超详细)

    本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下
    2013-05-05
  • 北邮考研复试C语言上机题目精选

    北邮考研复试C语言上机题目精选

    这篇文章主要介绍了北邮考研复试C语言上机题目精选,摘自2010年北邮CS的复试,需要的朋友可以参考下
    2015-08-08
  • 详解C语言未初始化的局部变量是多少

    详解C语言未初始化的局部变量是多少

    这篇文章主要给大家介绍了关于C语言未初始化的局部变量是多少,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • C语言中逻辑运算符与条件运算符的学习教程

    C语言中逻辑运算符与条件运算符的学习教程

    这篇文章主要介绍了C语言中逻辑运算符与条件运算符的学习教程,条件运算符问号即三目运算符使用起来十分方便,需要的朋友可以参考下
    2016-04-04
  • C语言实现电子时钟程序

    C语言实现电子时钟程序

    这篇文章主要为大家详细介绍了C语言实现电子时钟程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • C语言实现BMP格式图片转化为灰度

    C语言实现BMP格式图片转化为灰度

    这篇文章主要为大家详细介绍了C语言实现BMP格式图片转化为灰度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C语言超详细讲解队列的实现及代码

    C语言超详细讲解队列的实现及代码

    队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。在队尾添加元素,在队头删除元素
    2022-04-04
  • C++保存txt文件实现方法代码实例

    C++保存txt文件实现方法代码实例

    这篇文章主要介绍了C++保存txt文件实现方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • C/C++实现快速排序算法的思路及原理解析

    C/C++实现快速排序算法的思路及原理解析

    这篇文章主要介绍了C/C++实现快速排序算法的思路及原理解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • linux内核select/poll,epoll实现与区别

    linux内核select/poll,epoll实现与区别

    这篇文章主要介绍了linux内核select/poll,epoll实现与区别,需要的朋友可以参考下
    2016-11-11

最新评论