this指针

this指针作为一个隐含参数传递给非静态成员函数,用以指向该成员函数所属类所定义的对象。

在C++中,编译器是如何识别一个类的呢?分为以下三步:
1、识别类名
2、识别类数据成员
3、编译函数并且对函数进行重写

看下面这段代码:

#define _CRT_SECURE_NO_WARNINGS 1 

#include<iostream>
using namespace std;
class Person
{
public:
    void InitPerson(char* name, char* sex, int age)
    {
        strcpy(_name, name);
        strcpy(_sex, sex);
        _age = age;
    }
    void Print()
    {
        cout << _name << " " << _sex << " " << _age << endl;
    }

private:
    char _name[20];
    char _sex[5];
    int _age;
};
int main()
{
    Person person1;
    Person person2;
    Person person3;
    person1.InitPerson("zhao", "nan", 12);
    person2.InitPerson("qian", "nan", 14);
    person3.InitPerson("li", "nv", 18);
    person1.Print();
    person2.Print();
    person3.Print();
    system("pause");
    return 0;
}

所有函数都公用同一个函数,那系统如何区分调用person1 2 3 中的哪个的对应数据呢?

类的大小包括非静态数据成员而不包括成员函数。

类中成员函数和数据成员的存储方式:成员函数在类外单独存放,并且同类的对象共用一份成员函数。

这里引入this指针。this指针时刻指向当前对象

this指针的特性:

1、this指针的类型:类类型* const
2、this指针并不是对象本身的一部分,不影响sizeof的结果
3、this指针是非静态成员函数的第一个隐含指针形参,是编译器自己处理的,我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用时显示传递对象的地址给this指针

上面代码中,InitPerson函数部分重写之后为:

void InitPerson(Person* const this, char* name, char* sex, int age)
{
    strcpy(this->_name, name);
    strcpy(this->_sex, sex);
    this->_age = age;
}

this指针的两种传参方式:
1、参数压栈:当成员函数的参数为可变时(这时遵循__cdecl调用约定)
2、ecx寄存器:当成员函数的参数固定时(这时遵循__thiscall调用约定)


此外,有关this指针还有下面两个问题:
1、this指针的实现和引用的底层实现相同,为什么还要用this指针而非引用呢?

最开始C++ 被称为带类的C,而引用是在C++1.0版才加入的。

2、this指针有没有可能为空?

定义一个指向类对象的指针,使其初始化为NULL。则这个this指针为空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值