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

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;
}

 

空指针访问成员函数 

C++ 中空指针也是可以调用成员函数的,但是也要注意有没有用到 this 指针
如果用到 this 指针,需要加以判断保证代码的健壮性

#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指针

对象模型&#xff1a; 成员变量和成员函数分开存储 在C中&#xff0c;类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空对象占用空间&#xff1a; 1字节 C编译器会给每个空对象也分配一个字节空间&#xff0c;是为了区分空对象占内存的位置 每个…...

碳酸氢锂/硫酸锂溶液纯化除钙镁解决方案

碳酸锂是锂电行业阳极生产中的一个重要原材料&#xff0c;主要用于制造钴酸锂、镍酸锂、锰酸锂等电极材料&#xff0c;也用于充电 锂电池中作非水溶液电解质等&#xff0c;具有良好的电化学性能&#xff0c;应用领域还在不断扩大。工业级碳酸锂主含量&#xff08;Li2CO3&#x…...

消失的数字,旋转数组(leetcode 一题多解)

目录 一、消失的数字 思路一&#xff08;暴力求解&#xff09;代码实现&#xff1a; 思路二&#xff08;数列的思想&#xff09;代码实现&#xff1a; 思路三&#xff08;异或的运用&#xff09;代码实现&#xff1a; 二、轮转数组 思路一&#xff08;暴力求解&#xff09…...

肠道菌群16s检测粪便采样工具包 粪便采样套装

肠道菌群16s检测是一种常见的分子生物学技术&#xff0c;用于研究人体肠道中的微生物群落。该技术通过分析16s rRNA基因序列&#xff0c;可以快速、准确地鉴定并定量不同种类的肠道微生物。 肠道菌群16s检测通常通过采集粪便样本进行分析。在实验室中&#xff0c;通过提取微生物…...

实现领域驱动设计-07-领域服务

领域中的服务表示一个无状态的操作&#xff0c;它用于实现特定于某个领域的任务。当某个操作不适合放在聚合和值对象上时&#xff0c;为了避免过程式的编程方式&#xff0c;最好的方式便是使用领域服务来实现该操作。 什么是领域服务? 当领域中的某个操作过程或转换过程不是实…...

井盖位移传感器厂家批发,守护井盖安全

窨井盖广泛分布于城市街道&#xff0c;其管理效果直接反映了城市治理的现代化程度。根据住房和城乡建设部发布的《关于进一步加强城市窨井盖安全管理的通知》&#xff0c;全国各地需加强窨井盖的安全管理。作为市政基础设施的一个重要的组成部分&#xff0c;井盖的管理工作不仅…...

python命令行交互 引导用户选择宠物

字多不看&#xff0c;直接体验 代码 以下代码将在命令行中&#xff0c;引导用户选择一个或者多个宠物&#xff0c;并反馈用户选择的宠物 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/22 15:19 file: 在命令行中引导用户…...

Leetcode—167.两数之和 II - 输入有序数组【中等】

2023每日刷题&#xff08;四十一&#xff09; 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的逻辑删除可以有效保留历史数据。之前没有用逻辑删除的项目&#xff0c;想改造成逻辑删除总共需要几步&#xff1f; 答案&#xff1a;4步搞定 一、修改pom.xml的MybatisPlus版本&#xff08;注意版本兼容性&#xff09; <properties>...<!--<mybatis-…...

希尔伯特变换-matlab仿真

希尔伯特变换(hilbert transform)简介 在信号处理中我们常见的有傅里叶变换,用来分析频域信息,还有拉普拉斯变换和z变换,用于系统分析系统响应。短时傅里叶分析和小波分析用于时频分析。希尔伯特变换似乎听到的比较少。我因为最近在做信号幅度提取的时候看到可以用希尔伯…...

python字典的基本操作详解

Python字典是一种数据结构&#xff0c;它存储的是键值对&#xff08;key-value pair&#xff09;。在Python中&#xff0c;字典用于存储和组织数据&#xff0c;并且提供了快速查找和访问数据的方法。 以下是一些Python字典的基本操作&#xff1a; 创建字典&#xff1a; # 创…...

[ CSS ] 内容超出容器后 以...省略

内容超出容器后 以…省略 当前效果 代码 <template><div class"box">有志者&#xff0c;事竟成&#xff0c;破釜沉舟&#xff0c;百二秦关终属楚; 有心人&#xff0c;天不负&#xff0c;卧薪尝胆&#xff0c;三千越甲可吞吴</div> </templa…...

Java远程连接本地开源分布式搜索引擎ElasticSearch

文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar内网穿透工具实现Java远程连接操作本地Elasticsearch。 什么是elasticsearch&#xff1f;一个开源的分布式搜索引擎&#xff0…...

递归回溯剪枝-子集

LCR 079. 子集 - 力扣&#xff08;LeetCode&#xff09; 方法一 1. 决策树&#xff1a;对于决策树&#xff0c;思考的角度不同&#xff0c;画出的决策树也会不同&#xff0c;这道题可以从两个角度来画决策树。 2. 考虑全局变量的使用&#xff1a; 使用全局变量 List<List&…...

VC++、MFC中操作excel时,Rang和Rangs的区别是什么?

Rang 参考微软说明 作用 表示一个单元格、一行、一列、一个包含单个或若干连续单元格区域的选定单元格范围&#xff0c;或者一个三维区域。 说明 Range 的默认成员将不包含参数的调用转发至 Value 属性 如&#xff0c;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}&param_B${this.state.age}} className{this.activeStyle}>classify</NavLink> import React from "react"; import {NavLink, Outlet} from "react-router-dom"…...

python多线程和多进程

1.多线程 线程是程序执行的最小单位&#xff0c;一个进程至少有一个线程。 提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。 进程之间不能共享内存&#xff0c;但线程之间共享内存非常容易。 Python 常用的多线程库有threading 和…...

VMware虚拟机网络配置详解

vmware为我们提供了三种网络工作模式&#xff0c;它们分别是&#xff1a;Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09; 打开vmware虚拟机&#xff0c;我们可以在选项栏的“编辑”下的…...

VUE语法--img图片不显示/img的src动态赋值图片显示

1、问题概述 常见情景1&#xff1a;在VUE中使用img显示图片的时候&#xff0c;通过传参的方式传入图片的路径和名称&#xff0c;VUE不加载本地资源而是通过http://localhost:8080/...的地址去加载网络资源&#xff0c;从而出现了图片无法显示的情况。 常见情景2&#xff1a;针…...

保姆级教程:用LLaMA-Factory微调Qwen2.5-VL-7B模型(附避坑指南)

从零开始&#xff1a;用LLaMA-Factory高效微调Qwen2.5-VL-7B模型的完整指南 第一次接触大模型微调时&#xff0c;我被各种参数和工具链搞得晕头转向。直到发现LLaMA-Factory这个神器&#xff0c;才真正体会到高效微调的乐趣。本文将带你完整走一遍Qwen2.5-VL-7B模型的微调流程&…...

Go语言怎么用Jaeger_Go语言Jaeger链路追踪教程【实用】

Jaeger客户端初始化报nil pointer dereference因未设置有效tracer&#xff0c;须在main开头调用opentracing.SetGlobalTracer&#xff1b;HTTP透传需用opentracing.HTTPHeadersCarrier&#xff1b;Tag/Log值禁用nil指针&#xff1b;UDP连Agent失败应检查端口、Docker网络及改用…...

SystemVerilog验证平台搭建实战:从零开始手把手教你构建RTL测试环境(附代码示例)

SystemVerilog验证平台搭建实战&#xff1a;从零开始手把手教你构建RTL测试环境&#xff08;附代码示例&#xff09; 芯片验证是确保设计符合预期功能的关键环节&#xff0c;而SystemVerilog作为当前主流的验证语言&#xff0c;其强大的面向对象特性和丰富的验证方法学支持&…...

从零到一:用ima构建你的专属知识大脑【手把手教学】

1. 为什么你需要一个"第二大脑"&#xff1f; 每天早上打开电脑&#xff0c;你是不是也和我一样&#xff0c;面对满桌面的文档、收藏夹里几百个未读网页、微信里收藏的无数文章感到无从下手&#xff1f;我们的大脑就像一台内存有限的电脑&#xff0c;每天接收海量信息…...

依赖的第三方服务挂掉怎么办?

依赖的第三方服务挂掉怎么办&#xff1f; 在现代软件开发中&#xff0c;依赖第三方服务已成为常态。无论是支付接口、云存储、短信服务&#xff0c;还是数据分析工具&#xff0c;这些外部依赖极大地提升了开发效率。一旦这些服务突然宕机&#xff0c;轻则影响用户体验&#xf…...

地质雷达电磁波仿真终极指南:gprMax开源软件完全解析

地质雷达电磁波仿真终极指南&#xff1a;gprMax开源软件完全解析 【免费下载链接】gprMax gprMax is open source software that simulates electromagnetic wave propagation using the Finite-Difference Time-Domain (FDTD) method for numerical modelling of Ground Penet…...

AIGlasses OS Pro 实战:5步完成交通信号识别,新手也能轻松搞定

AIGlasses OS Pro 实战&#xff1a;5步完成交通信号识别&#xff0c;新手也能轻松搞定 1. 项目简介与准备工作 AIGlasses OS Pro 是一款基于YOLO11与MediaPipe开发的智能眼镜视觉辅助系统&#xff0c;专为低算力场景优化。其交通信号识别模式能够实时检测红绿灯、交通标志等道…...

收藏!小白程序员快速上手大模型:揭秘Coding Agent的核心模块与实战技巧

本文深入剖析了Coding Agent的核心模块&#xff0c;重点介绍了Agent Harness在提升LLM应用效能中的关键作用。文章详细阐述了Coding Harness的六大核心组件&#xff1a;实时仓库上下文、prompt上下文组装与Cache复用、工具访问与使用、上下文管理、结构化会话记忆、Subagent任务…...

三电平NPC逆变器矢量控制(SVPWM)算法解析与调制波形探究

三电平NPC逆变器矢量控制&#xff08;SVPWM&#xff09;matlab2021a 采用矢量控制&#xff0c;大扇区、小扇区、矢量作用时间等均用程序编写&#xff0c;可以得到马鞍波调制波形 逆变器输出三电平相电压波形&#xff0c;五电平线电压波形&#xff0c; 经过滤波器后&#xff0c;…...

如何永久保存微信聊天记录?这款开源工具让你完全掌控个人数字记忆

如何永久保存微信聊天记录&#xff1f;这款开源工具让你完全掌控个人数字记忆 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendi…...