当前位置: 首页 > article >正文

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指针不能在实参和形参中传递


http://www.kler.cn/a/349714.html

相关文章:

  • JVM_程序计数器的作用、特点、线程私有、本地方法的概述
  • 10.3 LangChain实战指南:解锁大模型应用的10大核心场景与架构设计
  • 爬虫基础(三)Session和Cookie讲解
  • 基于STM32的智能温控花盆设计
  • USB 3.1-GL3510-52芯片原理图设计
  • LangChain的开发流程
  • Linux系统——lvm逻辑卷
  • 阿里云云盘在卸载时关联到PHP进程,如何在不影响PHP进程情况下卸载磁盘
  • 基于SSM的微信小程序博客管理系统(博客1)
  • DW-大模型生图安全疫苗注入作业记录
  • 1. 安装框架
  • vue单页面 与多页面的区别
  • 无mac电脑在苹果开发者上传构建版本
  • C语言[经典题——4×5矩形阵]
  • 一文通透OpenAI o1:从CoT、Quiet-STaR、Self-Correct、Self-play RL、MCST等技术细节到工程复现
  • Git cherry-pick 转移提交
  • android11 usb摄像头添加多分辨率支持
  • MySQL(python开发)——(1)数据库概述及其MySQL介绍
  • React远程组件
  • java基础(5)继承与多态
  • 在Oracle之后,哪些数据库取得了成功?
  • Apache Lucene 10 已发布!Lucene 硬件效率改进及其他改进
  • JVM内存区域
  • 标题:民峰金融——引领全球金融投资新时代
  • Docker安装ActiveMQ镜像以及通过Java生产消费activemq示例
  • Linux下多任务编程(网络编程2)