首页 > 编程语言 >【C++】对象模型和this指针

【C++】对象模型和this指针

时间:2024-07-31 17:27:38浏览次数:7  
标签:const 函数 对象 模型 C++ Person void 指针

一、成员变量和成员函数分开存储

只有非静态成员变量才属于类的对象上

①C++编译器会给每一个空对象分配一个字节的空间,为了区分空对象占内存的位置

class Person
{

}

void test()
{
    Person P;
    //空类(类中什么也没有)中的空对象所占内存空间为 1
    cout << sizeof(P) << endl;
}

②非空类所占内存空间

class Person
{
    int m_A; //非静态成员变量 属于类对象上的数据

    static int m_B;//静态成员变量 不属于类对象
    
    void func(){}//非静态成员函数 不属于类对象

    static void func2(){}//静态成员函数 不属于类对象
};

int Person::m_B = 0;

void test()
{
    Person P;
    //所占内存为4
    cout << sizeof(P) << endl;
}
二、this指针概念

this指针指向被调用的成员函数所属对象

用途:①当形参和成员变量同名时,可用this指针区分

           ②在类的非静态成员函数中返回对象本身,可使用return *this

class Person
{
public:
    Person(int age)
    {
        //this指针指向被调用成员函数 所属对象
        this->age = age;
    }

    //如果用Person&一直返回一个对象;如果用Person就会复制新对象
    Person& add(Person &p)
    {
        this->age += p.age;
        //this指向p2指针,而*this指向p2这个对象的本体
        return *this;
    }
    
    int age;
};

//解决名称冲突
void test()
{
    Person p1(18);
    cout << "p1年龄:" << p1.age << endl;
}

//返回对象本身用*this
void test2()
{
    Person p1(10);
    Person p2(10);

    //链式编程思想
    p2.add(p1).add(p1).add(p1).add(p1);
    cout << "p2年龄:" << p2.age << endl;

    return ;
}
三、空指针访问成员函数
class Person
{
public:

    void showClassName()
    {
        cout << "This is Person class" << endl;
    }

    //处理后提高代码健壮性
    void showPersonAge()
    {
        if(this == NULL)
        {
            return;
        }

        cout << "age =" << this->m_Age << endl;
    }

    int m_Age;
    
};

void test()
{
    Person * p = NULL;  //创建空指针
    P->showClassName(); //可以直接调用
    p->showPersonAge(); 
    //因为该函数的属性是当前对象的属性,如果用空指针(没有对象)就没办法访问里面的属性
}
四、const修饰成员函数

常函数:

1、成员函数后加const后称该函数为常函数

2、常函数内不可以修改成员顺序ing

3、成员属性声明时加关键字mutable后,在常函数中依然可以修改

class Person
{
public:
    //this指针的本质是指针常量 指针指向不可以修改
    //在成员函数后加const,修饰的是this指向,让指针指向的值也不可以修改
    //常函数:
    void showPerson() const //相当于 const Person * const this
    {
        //函数后面加了const后变量不可修改
        //this->m_A = 100; 该行报错
          this->m_B = 100;
    }

    int m_A;
    mutable int m_B; //特殊变量,在常函数中也可以修改该值
};

常对象:

1、声明对象前加const称该对象为常对象

2、常对象只能调用常函数

class Person
{
public:
   
    void showPerson() const
    {
        m_B = 100;
    }

    void func()
    {
        m_A = 100;
    }

    int m_A;
    mutable int m_B; //特殊变量,在常函数中也可以修改该值
};

void test()
{
    //常对象:
    const Person p;
    p.m_A = 100;//不可以修改
    p.m_B = 100;//m_B是特殊值,在常对象下可以修改

    //常对象只能调用常函数
    p.showPerson();//可以运行
    p.func();//报错 不能运行
}

标签:const,函数,对象,模型,C++,Person,void,指针
From: https://blog.csdn.net/weixin_60546365/article/details/140799009

相关文章

  • 掩码语言模型MLM有什么应用场景
    上一文介绍了《什么是掩码模型MLM》,本文继续讲讲它的应用场景。MLM(MaskedLanguageModel,掩码语言模型)在自然语言处理(NLP)领域有着广泛的应用场景。以下是MLM的一些主要应用场景:1.预训练语言模型MLM是许多预训练语言模型(如BERT、RoBERTa、ALBERT等)的核心技术之一。通过在大......
  • 什么?在本地使用LLaMA大模型
    LLaMA是什么?LLaMA3.1是Meta公司开发的最新大型语言模型(LLM)系列,具有多种规格和显著改进。LLaMA3.1版本包含8B、70B和405B参数模型,专为各种复杂任务设计,包括多语言支持、翻译、对话生成和文本总结。其中LLaMA3.1405B是迄今为止最大和最强大的版本,具有显著......
  • PerfXCloud 再度升级,免费开放体验全球顶尖 MOE 大模型 DeepSeek-V2 236B!
     PerfXCloud注册地址:www.perfxcloud.cn今日,在PerfXCloud重磅更新支持llama 3.1 405B之后,其平台再度实现重大升级!目前,已顺利接入被誉为全球最强的MOE大模型DeepSeek-V2,已在PerfXCloud(澎峰云)官网的体验中心对平台用户免费开放体验。DeepSeek-V2 DeepSeek-V2是强大的......
  • C++面向对象编程解析
    文章目录1.概述2.作用解析3.概念解析1.类和对象2.封装(Encapsulation)3.继承(Inheritance)4.多态(Polymorphism)1.概述C++是在C语言的基础上增加了面向对象编程(OOP)特性的编程语言。面向对象编程是一种编程范式,通过将程序组织成对象的集合,这些对象包含数据和行......
  • 软件测试工程师我不干了,做大模型去了,如何转行跟上风口?希望能帮助到你们
    软件测试工程师转行到大模型岗位,需要补充深度学习、自然语言处理(NLP)等相关知识,并掌握必要的编程技能。以下是一个详细的转型攻略:学习深度学习和NLP基础知识:理解深度学习的基本概念,如神经网络、卷积神经网络(CNN)、循环神经网络(RNN)等。学习NLP的基础知识,包括词向量、序列标......
  • 二十五、【机器学习】-【Python手搓3层神经网络】:从零构建深度学习模型的实战指南
    目录一、序章:为什么你需要掌握手搓神经网络二、基础篇:神经网络基础知识回顾三、实战配置:搭建3层神经网络的步骤与技巧(一)、__init__ 方法初始化神经网络(二)、train 方法实现了前向传播和反向传播(三)、query 方法(四)、全部代码四、总结一、序章:为什么你需要掌握手......
  • AI创作商业系统软件源码(SparkAi系统) AI换脸/智能体GPTs应用/AI视频生成AI绘画/文档分
    AI创作商业系统软件源码(SparkAi系统)AI换脸/智能体GPTs应用/AI视频生成AI绘画/文档分析/GPT4.0模型支持目录一、人工智能SparkAi创作系统二、功能模块介绍系统快速体验三、系统功能模块3.1AI全模型支持/插件系统AI模型提问AI智能体文档分析多模态识图理解TTS&......
  • 记一次 JUnit5 问题排查(不识别单测、mock 对象空指针等问题)
    背景最近开始使用JUnit5写单元测试,本地运行成功之后提交代码,触发流水线进进行覆盖率计算。结果出来之后傻眼了,几百个单侧只能识别到2个。先简单说一下具体的环境。本地使用IDEA自带的maven,版本为3.9.6,JUnit版本5.7.0。流水线使用jenkins触发maven命令,用的maven......
  • 2024 年过半,AI 大模型在各行业的落地实践走到哪了?
    转眼之间,2024年已经过半,AI大模型的热度从去年的技术探索转向落地实践,肉眼可见的是,各行各业都纷纷在这场热潮中寻找新的业务创新点和行业增长点。“大模型的出现带来了变革,它实现了知识平权,为我们提供了技术条件,使得我们能够参与到AI的应用中来。”宁德核电人工智能实验......
  • 关于使用C#注入C++的封装DLL后打印内容乱码
    最近因需要,用C++写了个钩子的DLL,一切工作测试通过后,放到C#里使用P/Invoke调用,发现部分乱码,最后反复测试,才发现一个问题,原来SetWindowsHookEx这个函数,也是分A版和W版,最后换了就正常了,附上对比。。乱码[DllImport("user32.dll",SetLastError=true]publicstaticex......