C++类(2)

上期,我们知道类里面的函数是不占内存的,那么如果这个类里面全都是函数呢?

此时这个类是没有成员的类对象,内存是1byte,是为了占位,表示对象存在,不储存有效数据

同样,类里面什么都没有的空类内存大小也是1

this指针

class Add
{
private:
      int _day;
      int _month;
      int _year;
public:
      void Init(int year, int month, int day)
      {
          _year = year;
          _day = day;
          _month = month;
      }
      void caa(void)
    {
        cout<< _year<<_month <<_day << endl;
    }
};

int main(void)
{
    Add s1;
    Add s2;
    s1.Init(2024,10,12);
    s2.Init(2005,4,14);
    s1.caa();
    s2.caa();
    return 0;
}

打印结果是

20241012

20050414

但是思考一下,为啥我们调用的是同一个函数,但是打印结果却不一样呢?

你可能说一个是s1一个是s2,两个不同的对象,但是函数是存放在公共区域啊!

和对象没有关系啊!

答案是这个地方在编译的时候编译器会加一个this指针

虽然我们这个地方caa函数参数写的是void

但是编译器在编译的时候会处理成

​
  void caa(date* const this)
{
    cout<< this->_year<<this->_month <<this->_day << endl;
}

​

这样我们才知道我们要找的_year和_month在哪里,不然你怎么找?

所以本质上s1.caa()会被编译器处理成s1.caa(&s1)而this指针指向s2

s2.caa会被编译器处理成s2.caa(s2);而this指针指向s2

但是要注意的时候,我们写的时候函数参数不能写date*this(this指针不能在实参和形参中传递),但是函数体内可以这样写!

但是函数体内的this指向是不可以更改的

那么再思考一下,this这个函数是在类里面栈上,堆上,静态区还是哪里呢?

首先肯定排除类里面,因为前面提过类的内存大小只和类的成员变量有关,所以肯定不可能存放在类里面。

正确答案是在栈上,this是形参,所以this是和普通参数一样存放在函数调用的栈帧里面

我们再来思考一下前面说过

Add::这样是错误的,因为这是声明没有真的去开辟空间

但是学了上面知识我们知道,如果可以,那么传啥给this指针呢?

同样可以验证这种方法的错误性

那么这样写可不可以呢?

Add::(s1);

这个地方我给了this指针要传的地址了

答案还是不行

因为this指针不能在实参和形参中传递

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值