C++:对象模型和this指针
对象模型:
成员变量和成员函数分开存储
在C++中,类内的成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上
空对象占用空间: 1字节
C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
每个空对象也应该有一个独一无二的内存地址
class Person {
public:};void test01()
{Person p;//空对象占用内存空间为:cout << sizeof(p) << endl;
}int main()
{test01();system("pause");return 0;
}
非静态成员变量占对象空间 属于类的对象上
class Person {
public://非静态成员变量占对象空间 属于类的对象上 4int m_A;//静态成员变量不占对象空间 不属于类的对象上 4static int m_B; //类内声明void func() //非静态成员函数 不属于类的对象上 4{ cout << "m_A:" << this->m_A << endl;}//静态成员函数也不占对象空间 不属于类的对象上 4static void sfunc() {}};
int Person::m_B = 0; //类外初始化//空对象占多数空间
void test01()
{Person p;//空对象占用内存空间为: 1//C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置//每个空对象也应该有一个独一无二的内存地址cout << sizeof(p) << endl;
}void test02()
{Person p;cout << sizeof(p) << endl;
}int main()
{//test01();test02();system("pause");return 0;
}
this指针:
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码
那么问题是:这一块代码是如何区分那个对象调用自己的呢?
c++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象:
1.解决名称冲突;
示例:
class Person
{
public:Person(int age){//this指针指向 被调用的成员函数 所属的对象this->age = age;}int age;
};//解决名称冲突
void test01()
{Person p1(18);cout << "p1.age = " << p1.age << endl;
}int main()
{test01();system("pause");return 0;
}



2.在类的非静态成员函数中返回对象本身,可使用return * this
class Person
{
public:Person(int age){//this指针指向 被调用的成员函数 所属的对象this->age = age;}//值返回 返回一个新的对象//引用得方式返回 不会创建对象 一直返回p2Person& PersonAddAge(Person& p){this->age += p.age;//this指向p2的指针,而*this指向的就是p2这个对象本体return *this;}int age;
};//1 解决名称冲突
void test01()
{Person p1(18);cout << "p1.age = " << p1.age << endl;
}//2 返回对象本身,可使用return * this
void test02()
{Person p1(10);Person p2(10);//链式编程思想p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);cout << "p2.age = " << p2.age << endl;
}int main()
{test01();test02();system("pause");return 0;
}

空指针访问成员函数

#include <iostream>
using namespace std;//空指针访问成员函数
class Person {
public:void ShowClassName() {cout << "我是Person类!" << endl;}void ShowPersonAge(){//报错原因是因为传入的指针是为NULLif (this == NULL) {return;}cout << "age = " << this->m_Age << endl;}int m_Age;
};void test01()
{Person* p = NULL;p->ShowClassName(); //空指针,可以调用成员函数p->ShowPersonAge(); //但是如果成员函数中用到了this指针,就不可以了
}int main() {test01();system("pause");return 0;
}
相关文章:
C++:对象模型和this指针
对象模型: 成员变量和成员函数分开存储 在C中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空对象占用空间: 1字节 C编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置 每个…...
碳酸氢锂/硫酸锂溶液纯化除钙镁解决方案
碳酸锂是锂电行业阳极生产中的一个重要原材料,主要用于制造钴酸锂、镍酸锂、锰酸锂等电极材料,也用于充电 锂电池中作非水溶液电解质等,具有良好的电化学性能,应用领域还在不断扩大。工业级碳酸锂主含量(Li2CO3&#x…...
消失的数字,旋转数组(leetcode 一题多解)
目录 一、消失的数字 思路一(暴力求解)代码实现: 思路二(数列的思想)代码实现: 思路三(异或的运用)代码实现: 二、轮转数组 思路一(暴力求解)…...
肠道菌群16s检测粪便采样工具包 粪便采样套装
肠道菌群16s检测是一种常见的分子生物学技术,用于研究人体肠道中的微生物群落。该技术通过分析16s rRNA基因序列,可以快速、准确地鉴定并定量不同种类的肠道微生物。 肠道菌群16s检测通常通过采集粪便样本进行分析。在实验室中,通过提取微生物…...
实现领域驱动设计-07-领域服务
领域中的服务表示一个无状态的操作,它用于实现特定于某个领域的任务。当某个操作不适合放在聚合和值对象上时,为了避免过程式的编程方式,最好的方式便是使用领域服务来实现该操作。 什么是领域服务? 当领域中的某个操作过程或转换过程不是实…...
井盖位移传感器厂家批发,守护井盖安全
窨井盖广泛分布于城市街道,其管理效果直接反映了城市治理的现代化程度。根据住房和城乡建设部发布的《关于进一步加强城市窨井盖安全管理的通知》,全国各地需加强窨井盖的安全管理。作为市政基础设施的一个重要的组成部分,井盖的管理工作不仅…...
python命令行交互 引导用户选择宠物
字多不看,直接体验 代码 以下代码将在命令行中,引导用户选择一个或者多个宠物,并反馈用户选择的宠物 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/22 15:19 file: 在命令行中引导用户…...
Leetcode—167.两数之和 II - 输入有序数组【中等】
2023每日刷题(四十一) Leetcode—167.两数之和 II - 输入有序数组 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {*returnSiz…...
MybatisPlus改造逻辑删除有多方便
MybatisPlus的逻辑删除可以有效保留历史数据。之前没有用逻辑删除的项目,想改造成逻辑删除总共需要几步? 答案:4步搞定 一、修改pom.xml的MybatisPlus版本(注意版本兼容性) <properties>...<!--<mybatis-…...
希尔伯特变换-matlab仿真
希尔伯特变换(hilbert transform)简介 在信号处理中我们常见的有傅里叶变换,用来分析频域信息,还有拉普拉斯变换和z变换,用于系统分析系统响应。短时傅里叶分析和小波分析用于时频分析。希尔伯特变换似乎听到的比较少。我因为最近在做信号幅度提取的时候看到可以用希尔伯…...
python字典的基本操作详解
Python字典是一种数据结构,它存储的是键值对(key-value pair)。在Python中,字典用于存储和组织数据,并且提供了快速查找和访问数据的方法。 以下是一些Python字典的基本操作: 创建字典: # 创…...
[ CSS ] 内容超出容器后 以...省略
内容超出容器后 以…省略 当前效果 代码 <template><div class"box">有志者,事竟成,破釜沉舟,百二秦关终属楚; 有心人,天不负,卧薪尝胆,三千越甲可吞吴</div> </templa…...
Java远程连接本地开源分布式搜索引擎ElasticSearch
文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar内网穿透工具实现Java远程连接操作本地Elasticsearch。 什么是elasticsearch?一个开源的分布式搜索引擎࿰…...
递归回溯剪枝-子集
LCR 079. 子集 - 力扣(LeetCode) 方法一 1. 决策树:对于决策树,思考的角度不同,画出的决策树也会不同,这道题可以从两个角度来画决策树。 2. 考虑全局变量的使用: 使用全局变量 List<List&…...
VC++、MFC中操作excel时,Rang和Rangs的区别是什么?
Rang 参考微软说明 作用 表示一个单元格、一行、一列、一个包含单个或若干连续单元格区域的选定单元格范围,或者一个三维区域。 说明 Range 的默认成员将不包含参数的调用转发至 Value 属性 如,someRange someOtherRange 等效于 someRange.Value …...
使用Rust开发小游戏
本文是对 使用 Rust 开发一个微型游戏【已完结】[1]的学习与记录. cargo new flappy 在Cargo.toml的[dependencies]下方增加: bracket-lib "~0.8.7" main.rs中: use bracket_lib::prelude::*;struct State {}impl GameState for State { fn tick(&mut self,…...
笔记二十一、使用路由search进行传递参数
21.1 父组件设置路由参数 <NavLink to{classify?param_A${this.state.name}¶m_B${this.state.age}} className{this.activeStyle}>classify</NavLink> import React from "react"; import {NavLink, Outlet} from "react-router-dom"…...
python多线程和多进程
1.多线程 线程是程序执行的最小单位,一个进程至少有一个线程。 提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。 进程之间不能共享内存,但线程之间共享内存非常容易。 Python 常用的多线程库有threading 和…...
VMware虚拟机网络配置详解
vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式) 打开vmware虚拟机,我们可以在选项栏的“编辑”下的…...
VUE语法--img图片不显示/img的src动态赋值图片显示
1、问题概述 常见情景1:在VUE中使用img显示图片的时候,通过传参的方式传入图片的路径和名称,VUE不加载本地资源而是通过http://localhost:8080/...的地址去加载网络资源,从而出现了图片无法显示的情况。 常见情景2:针…...
开发者必学:Web3.0技术栈全解析
Web3.0时代对软件测试从业者的挑战与机遇Web3.0作为下一代互联网范式,以去中心化、用户数据主权和区块链技术为核心,正重塑软件开发格局。对于软件测试从业者而言,这不仅意味着新的测试挑战——如智能合约安全、分布式系统验证和隐私保护——…...
STM32G474外部中断避坑指南:从CubeMX配置到中断服务函数编写,新手常犯的5个错误
STM32G474外部中断避坑指南:从CubeMX配置到中断服务函数编写 第一次接触STM32G474的外部中断功能时,很多开发者都会遇到各种奇怪的问题——中断不触发、响应异常甚至系统卡死。这些问题往往源于几个容易被忽视的细节配置。本文将深入剖析新手最容易踩的5…...
小白友好教程:用PyTorch 2.8镜像轻松完成深度学习实验
小白友好教程:用PyTorch 2.8镜像轻松完成深度学习实验 1. 为什么选择PyTorch 2.8镜像? 深度学习实验常常因为环境配置问题而变得复杂。PyTorch 2.8镜像解决了这个痛点,它预装了完整的PyTorch环境和CUDA工具包,让你可以立即开始实…...
别再死记硬背了!用‘房屋出租系统’实战项目,5步搞定RBAC权限设计与OWASP Top 10防护
实战房屋出租系统:从RBAC权限设计到OWASP Top 10防护 在开发一个房屋出租管理系统时,安全性往往是最容易被忽视却又至关重要的环节。许多开发者将精力集中在功能实现上,直到系统上线后遭遇数据泄露或恶意攻击时才追悔莫及。本文将以一个真实的…...
5分钟快速上手:在macOS上使用Whisky运行Windows应用的终极指南
5分钟快速上手:在macOS上使用Whisky运行Windows应用的终极指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 还在为Mac上无法运行Windows软件而烦恼吗?Whis…...
Photoshop图层批量导出终极指南:告别繁琐操作,5分钟搞定专业资源管理
Photoshop图层批量导出终极指南:告别繁琐操作,5分钟搞定专业资源管理 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script fr…...
跨平台 Conda 环境迁移:从 Linux 到 Windows 的完整指南
1. 为什么需要跨平台迁移 Conda 环境? 作为一个常年混迹在 Linux 和 Windows 双系统的开发者,我深刻理解环境迁移的痛苦。你可能遇到过这种情况:在 Linux 服务器上训练好的机器学习模型,想在 Windows 本地机器上部署测试ÿ…...
别再死记公式了!用Multisim仿真带你玩转积分与微分运算电路
用Multisim仿真解锁积分与微分电路的实战奥秘 记得第一次在实验室搭建积分电路时,盯着示波器上扭曲的波形百思不得其解——为什么理论完美的三角波变成了畸变的锯齿?直到在Multisim里实时调整RC参数,才真正理解时间常数与波形失真的微妙关系。…...
WarcraftHelper:魔兽争霸3现代兼容性终极解决方案
WarcraftHelper:魔兽争霸3现代兼容性终极解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为魔兽争霸3设计…...
终极指南:扩展BallonsTranslator插件生态,轻松集成OCR、文本检测和图像修复功能
终极指南:扩展BallonsTranslator插件生态,轻松集成OCR、文本检测和图像修复功能 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered…...
