this指针你“造(知道)”吗?

1,在类中数据是怎么存储的?
用类去定义对象时,系统会为每一个对象分配存储空间。如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间。
如图:模型一
这里写图片描述
模型二:
这里写图片描述

可以通过求类的大小来测试编译器采用的哪种模式。如果大于double类型的字节数,则采用的第一种模式,等于double字节则采用的第二个模式。

#include<iostream>
using namespace std;
const double PI = 3.1415926;
class circle
{
private:
    double radius;
public:
    void Init(double _radius)
    {
        radius = _radius;
    }
    void Print()
    {
        cout << "area=" << PI*radius*radius << endl;
    }
};
int main()
{

    cout << sizeof(circle) << endl;
    system("pause");
    return 0;
}
//输出为8字节,刚好是数据部分的double类型的大小

结论:C++编译系统正采用模式二的,每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间。
那么问题来了。。所的有对象都调用共用的函数代码段,如何区分的呢。这个功劳就是c++中this指针的了!
c++设置了 this 指针,this 指针指向调用该函数的不同对象。。
2,this指针作用

#include<iostream>
using namespace std;
const double PI = 3.1415926;
class circle
{
private:
    double radius;
public:
    void Init(double _radius)
    {
        radius = _radius;
    }
    void Print()
    {
        cout << "area=" << PI*radius*radius << endl;
    }
};
int main()
{

    circle cir1, cir2;
    cir1.Init(23.2);
    cir2.Init(13.6);
    cout << sizeof(circle) << endl;
    cir1.Print();
    cir2.Print();
    system("pause");
    return 0;
}

如上代码,创建两个对象cir1,cir2。通过上述介绍,我们直到c++编译器,将函数部分作为公共代码区域。通过cir1.Init()使得函数init与对象cir1绑定。通过cir2.Init()使得函数init与对象cir2绑定。类成员函数的形参和类的属性,名字相同,而不同对象可以实现不同数据的操作这是怎么实现的呢?
其实,每个成员函数都有一个this指针,this指针指向调用对象。即,某个对象正在调用成员函数那么this指针就指向哪个对象。this指针并不是对象本身的一部分,不影响sizeof的结果(已证明)。
这里写图片描述
3,this指针如何产生?
然而我们在编程时,并没有写入有关this指针的任何声明和定义,那么this指针又是如何产生的呢?
this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递。
这里写图片描述
将上面代码修改为上示代码。运行后,结果是一致的。
所以函数参数本质应该是

void Init(circle* this ,double _radius)//
    { 
        this->radius = _radius;     
    }
    void Print(circle* this )//
    {
        cout << "area=" << PI*this->radius*this->radius << endl;
    }

猜想:“因为this指针在指向一个对象的时候,指针所存放的是调用对象的地址,所以应该是常属性的的指针。”
验证:如果this指针是非const指针,那么意味着在它被赋值为对象地址后可以被赋值为空。否则,是const指针。
这里写图片描述
结果这种赋值语法错误。所以this指针的类型应该为:类名*const this

void Init(circle* const this ,double _radius);
void Print(circle* const this )

4,关于this指针一个经典回答。
当你进入一个房子后,你可以看见桌子、椅子、地板等, 但是房子你是看不到全貌了。对于一个类的实例来说, 你可以看到它的成员函数、成员变量,但是实例本身呢?   
this是一个指针,它时时刻刻指向你这个实例本身

this指针总结:
作用:编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,对各成员的访问均通过this进行。  
注意事项:
(1)我们只有获得一个对象后,才能通过对象使用this指针。
(2)this只能在成员函数中使用。
(3)this指针并不是对象本身的一部分,不影响sizeof的结果
(4)this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递(可用C语言模拟实现)
(5)this的作用域在类成员函数的内部

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值