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

C++对象模型和this指针,const修饰成员函数详解

目录

1.成员变量和成员函数分开存储

2.this指针

1.this指针概念

​编辑

2.this指针用途

3.空指针访问成员函数

​编辑

4.const修饰成员函数 

 mutable声明

1.成员变量和成员函数分开存储

空对象占用内存空间为1字节,这样是为了区分不同的空对象占内存的位置

使得每个空对象都有一个独一无二的内存地址 

代码示例:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;class stu
{};class person
{int a;static int b;
};int person::b = 100;int main(){person p;stu s;cout << sizeof(s) << endl;cout << sizeof(p);return 0;
}

2.this指针

1.this指针概念

谁调用函数,this指针就指向它 

this指针不需要定义,直接使用 

2.this指针用途

代码示例 :

#include<bits/stdc++.h>
using namespace std;class person
{public:int age;// person(int age){// age = age;// }错误的,编译器会认为这三个age是同一个person(int age){this -> age = age;//解决了名称冲突}//这里要以引用的方式返回//如果不这样,就是以值的方式返回,会复制一个新的对象而不是原来的p1person& personaddage(person &p){this -> age += p.age;//此时this是指向p1的指针//,*this就是p1return *this;}
};int main(){person p1(18);cout << "p1年龄为" << p1.age << endl;person p2(10);p1.personaddage(p2).personaddage(p2);cout << "p1年龄为" << p1.age << endl;return 0;
}

3.空指针访问成员函数

代码示例: 

#include<bits/stdc++.h>
using namespace std;class person
{public:int age;void show(){cout << "Here is class person" << endl;}void showage(){if(this == NULL) return;//提高代码健壮性,防止为空的情况cout << age << endl;//相当于cout << this -> age << endl;}
};int main(){person *p = NULL;p -> show();p -> showage();return 0;
}

4.const修饰成员函数 

 mutable声明

代码讲解:

#include<bits/stdc++.h>
using namespace std;class person
{public://this指针本质上是person * const this,指针常量,指向不可以修改//指向的值可以修改void func(int c) const{//这里的const修饰的是this指向,让this指向的值也不可以修改//相当于从person * const this变为const person * const thisa = c;}mutable int a = 0;//mutable声明使得在常函数和常对象中也可以修改这个值int b = 6;};int main()
{const person p;//常对象//p.b = 5;错误的,常对象不可修改属性p.a = 20;cout << p.a << endl;p.func(19);cout << p.a << endl;return 0;
}

这里使用const person p时一定要给a和b赋初值,不然会报错说未初始化 

相关文章:

  • 【爬虫用户代理和ip自动生成】
  • 大中型企业DevSecOps建设
  • kubernetes-快速部署一套k8s集群
  • GDB调试技巧实战--自动化画出类关系图
  • 【ES6】一个页面上需要等两个或多个ajax的数据请求成功以后才正常显示(使用Promise.all和Promise.race)
  • HTTPS 之fiddler抓包--jmeter请求
  • 人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示)
  • 【51单片机】点亮第一个LED灯
  • 707. 设计链表(力扣刷题)(C语言题解)
  • ARM-M0 + 24bit ADC,采样率8KSPS,高精度ADC使用手册
  • [GN] DP学习笔记板子
  • Next.js如何正确处理跨域问题?
  • 网络ADB连接(不用实体安卓线)
  • 每日一练:LeeCode-404、左叶子之和【二叉树】
  • IDEA:git 回滚本地提交-git 选择 Reset Current Branch to
  • @jsonView过滤属性
  • dva中组件的懒加载
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • input实现文字超出省略号功能
  • JavaScript 一些 DOM 的知识点
  • Lsb图片隐写
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Promise初体验
  • scrapy学习之路4(itemloder的使用)
  • tensorflow学习笔记3——MNIST应用篇
  • webgl (原生)基础入门指南【一】
  • windows-nginx-https-本地配置
  • 笨办法学C 练习34:动态数组
  • 基于webpack 的 vue 多页架构
  • 理清楚Vue的结构
  • 免费小说阅读小程序
  • 数据仓库的几种建模方法
  • 听说你叫Java(二)–Servlet请求
  • 微服务核心架构梳理
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Semaphore
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​configparser --- 配置文件解析器​
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #define
  • (42)STM32——LCD显示屏实验笔记
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (规划)24届春招和25届暑假实习路线准备规划
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .gitignore文件设置了忽略但不生效
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net FrameWork简介,数组,枚举
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .net 验证控件和javaScript的冲突问题
  • .net6+aspose.words导出word并转pdf