C++语言 this指针 的学习

一、this指针

   首先需要知道this指针是什么?

            this指针是指向本类对象的指针,它的值是当前被调用的类的成员函数所在的对象的起始地址。

     作用:保证不同对象的成员函数引用数据成员时,引用的数据成员是指定的对象的数据成员。


    我们也可以通过C语言与C++语言结构体和类的对比来进一步理解this指针  

结构体;
struct Student
{
	char *_name;
	char *_gender;
	int age;
};
void Init_info(struct Student *stu)
{
	stu->_name = "nihao";
	stu->age = 18;
	stu->_gender = "女";
}
int main()
{
	struct Student student;
	Init_info(&student);
	return 0;
}
类:
class Student
{
public:
	void Init_info()
	{
		_name = "niaho";
		_gender = "女";
		_age = 18;
	}
private:
	char *_name;
	char *_gender;
	int _age;
};
int main()
{
	Student stu;
	stu.Init_info();
	return 0;
}
this指针的特性:

   1.this指针的类型    (一般来说:类类型 * const)

           在非const成员函数中它的类型是指向该类类型的指针,在const 成员函数中是指向const 类类型的
     指针,而在volatile 成员函数中是指向volatile 类类型的指针。

   2.this指针并不是对象本身的一部分,不影响sizeof的结果。(因为sizeof计算的是类成员数据所占空间字节数,而           this指针是类成员函数的参数).

   3.this指针的作用域类成员函数的内部 ( 原因:因为this指针是类成员函数的参数)

   4.this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递。

this指针遵循的调用约定_thiscall:

    a._thiscall只能够用在类的成员函数上;

    b.参数从右到左传递;

    c.如果类成员函数参数个数确定,this指针通过ecx寄存器传递给被调用者,(_thiscall的调用约定)

       如果类成员函数参数不确定,this指针在所有参数被压栈后压入堆栈(_cdecl的调用约定);

this指针一般是隐式使用,但在需要的情况下也可以显示的使用

     例如:

#include<iostream>
using namespace std;
class Box
{
public:
	//申明有默认参数的构造函数,用参数初始化列表初始化数据成员
	Box(int h = 10,int w = 12,int len = 15)
		:_height(h)
		,_width(w)
		,_length(len)
	{}
	int volume()
	{
		return (_height*_width*_length);  //隐含使用this指针
		return (this->_length *this->_width*this->_length);  //显示使用this指针
		return((*this)._height*(*this)._width*(*this)._length);  //显示使用this指针
	}
private:
	int _height;
	int _width;
	int _length;
};

int main()
{
	int ret = 0;
	Box b1(10,10,10);
	ret = b1.volume();
	cout<<ret<<endl;
	getchar();
	return 0;
}


this指针有关的拓展问题: 

      为什么用this指针指向对象,而不是引用?

        因为this指针要比引用早出现

      ②this指针也有可能为NULL,当this指针为空时,调用类的成员函数是不会出错,

         但访问非静态成员数据时程序崩溃。

编译器识别类的过程:

    1.识别类名;

    2.识别类名中的数据成员;

    3.识别类中的成员函数并对函数进行改写(改写是指显示使用this指针,不过这是编译器的底层操作)。

          



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值