C++this指针详解
文章目录
前言
在c++中,相信大家对this指针都不陌生,但是this指针很容易搞混,这个指针到底怎么来的?他的作用是什么?我们怎样去使用它?
一、c++的对象模型 ?
1、在c++中,一个空的类,他的内存大小为1;
class a
{
};
cout << sizeof(a) << endl;
输出结果为:1
2、类的成员函数不占用类的大小;静态成员变量不占用类的大小;静态成员函数不占用类的大小。
class a
{
public:
void()
{
}
static int fun()
{
}
private:
static int a;
};
cout << sizeof(a) << endl;
输出结果为:1
3、普通成员变量占用类的大小。
class a
{
int a;
};
cout << sizeof(a) << endl;
输出结果为:4
总结:
通过以上案例我们不难发现成员变量和成员函数是分开存储的,但是大家对类的封装有所了解的话,应该知道普通成员函数是可以访问私有成员变量的,那么他们不属于同一存储模式下,他们是如何访问的呢?这时我们的this指针展现了他的作用。
二、this指针的作用与意义
1.引入
从上面我们知道了c++的数据和操作是分开存储的,每个对象可以共享成员函数,这是为了节省空间(因为如果每一个对象都有一个同样的成员函数时这不会对内存进行有效的利用,如果是用来共享的话,则会大大节省空间)
那么怎么区分是哪个对象调用该函数呢?
每个对象都会有一个this指针,这是编译器自动生成的,当对象调用类内的成员函数时,会将this指针传入到成员函数中,此时成员函数便知道是哪个对象在调用。
下面我们来看一下你眼中的成员函数和编译器眼中的成员函数:
你眼中的(示例):
#include <iostream>
using namespace std;
class a
{
public:
void fun(int i,int j)
{
x = i;
y = j;
}
private:
int x;
int y;
}
int main()
{
a a1;
a1.fun(1,2)
}
上面的fun()函数在编译器眼里是这样的:
void fun(a * const this,int i,int j)
{
x = i;
y = j;
}
总结:
大家发现没有,他多了一个a类型的this指针并且用const修饰了他,说明这个指针的指向还必须是无法改变其指向的。说明每一个对象都有其特定的this指针,通过传入this指针来明确是哪个对象调用的该函数。
2.作用
1、当形参和成员变量冲突时,可用this指针来区分
代码如下(示例):
class a
{
public:
void fun(int i)
{
this->i = i;
}
private:
int i;
}
2、返回对象的本身
a &fun()
{
return *this;
}
3、注意事项:
1)this指针指向的空间没有存储静态成员变量。
2)this指针的指向不能改变