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

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

目录

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

二、this指针概念

三、空指针访问成员函数

四、const修饰成员函数


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

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

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

class Person
{}void test()
{Person P;//空类(类中什么也没有)中的空对象所占内存空间为 1cout << 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;//所占内存为4cout << 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();//报错 不能运行
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vivado ODT
  • 【HarmonyOS NEXT星河版开发学习】小型测试案例01-今日头条置顶练习
  • 【算法速刷(4/100)】LeetCode —— 155.最小栈
  • Java反序列化漏洞实战:原理剖析与复现步骤
  • 与大语言模型Transformer的奇妙旅程
  • 手机三要素接口怎么对接呢?(二)
  • MediaHub中的卡片实现进展汇报
  • 数据结构:链表经典算法OJ题
  • 【Linux】权限理解
  • Python的lambda函数
  • dockerfile之vllm大模型镜像构建
  • Go语言加Vue3零基础入门全栈班10 Go语言+gRPC用户微服务项目实战 2024年07月31日 课程笔记
  • Hugging Face下载模型
  • 技术详解:视频美颜SDK与直播美颜插件开发指南
  • XQuery 术语
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • classpath对获取配置文件的影响
  • Computed property XXX was assigned to but it has no setter
  • JavaScript设计模式与开发实践系列之策略模式
  • mysql 5.6 原生Online DDL解析
  • nginx 配置多 域名 + 多 https
  • REST架构的思考
  • Windows Containers 大冒险: 容器网络
  • 测试如何在敏捷团队中工作?
  • 产品三维模型在线预览
  • 对象引论
  • 开发基于以太坊智能合约的DApp
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 新版博客前端前瞻
  • nb
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • raise 与 raise ... from 的区别
  • #### golang中【堆】的使用及底层 ####
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (23)Linux的软硬连接
  • (bean配置类的注解开发)学习Spring的第十三天
  • (c语言+数据结构链表)项目:贪吃蛇
  • (windows2012共享文件夹和防火墙设置
  • (二) 初入MySQL 【数据库管理】
  • (二)pulsar安装在独立的docker中,python测试
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (回溯) LeetCode 78. 子集
  • (论文阅读40-45)图像描述1
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (源码分析)springsecurity认证授权
  • .chm格式文件如何阅读
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .jks文件(JAVA KeyStore)
  • .Net 4.0并行库实用性演练