C++面向对象语法总结(一)

一、类

  • C++中可以使用struct、class两个关键字来定义一个类
  • struct和class的区别
    • struct的默认成员权限是public
    • class的默认成员权限是private
    • 实际开发中,用class表示类的比较多,因为涉及到封装的思想
  • 在函数中创建的对象,都是在栈空间,比如下面图片中的person对象、p指针的内存都是在函数的栈空间,会自动分配和回收内存
    在这里插入图片描述

二、对象的内存布局

一般情况下,对象中的成员变量是在内存中连续存放的,对象的名称指向存放成员变量的首地址的位置。
比如下面的代码:
在这里插入图片描述
其内存地址如下图:
在这里插入图片描述

三、this

  • this是指向当前对象的指针
  • 对象在调用成员函数的时候,会自动传入当前对象的内存地址
  • 因为this是指针,必须使用this->m_age的方式来访问成员变量

四、封装

封装指的是将成员变量私有化,提供公共的getter和setter给外界去访问成员变量

struct Person {
private:
	int m_age;
public:
	void setAge(int age) {
		if (age <= 0) {
			m_age = 1;
		} else {
			m_age = age;
		}
	}

	int getAge() {
		return m_age;
	}
};

int main() {
	Person person;
	person.setAge(-4);
	cout << person.getAge() << endl;
	return 0;
}

五、内存空间的布局

  • 每个应用都有自己独立的内存空间,其内存空间一般有以下几大区域
    • 代码段(代码区):用于存放代码
    • 数据段(全局区):用于存放全局变量等
    • 栈空间
      • 每调用一个函数就会给它分配一段连续的栈空间,等函数调用完毕后自动回收这段栈空间
      • 自动分配和回收
    • 堆空间:需要主动去申请和释放
  • 堆空间的特点
    • 在程序运行过程中,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存
    • 堆空间申请和对应的释放函数
      • malloc --> free
      • new --> delete
      • new[] --> delete[]
    • 堆空间的使用注意事项
      • 申请堆空间成功后,会返回那一段内存空间的地址
      • 申请和释放必须是一一对应的,不然可能会纯在内存泄漏的问题
    • 在函数中创建一个指针,指向堆空间的一个地址,内存图如下图(32位)
      在这里插入图片描述
  • 堆空间的初始化
    • 对于直接分配内存,malloc直接分配的地址不会初始化,memset可以批量初始化地址
      在这里插入图片描述
    • 对于用new的方式申请的内存,在类型后面加上括号的方法可以初始化
      在这里插入图片描述
    • memset函数时将较大的数据结构(比如对象、数组等)内存直接初始化的比较快的方法
      在这里插入图片描述

六、对象的内存

  • 对象的内存可以存放于3中地方
    • 全局区(数据段):全局变量
    • 栈空间:函数里面的局部变量
    • 堆空间:动态申请的内存(malloc、new等)
      在这里插入图片描述
  • 类中包含其他类的情况,如果类被创建在函数的栈空间,包含的类的对象也会被分配到栈空间,并且内存空间相邻
    在这里插入图片描述
  • 类中包含其他类的情况,如果外面的类是被new对象分配到堆空间,那么包含的类对象也会被创建在堆空间,并且地址相邻
    在这里插入图片描述

七、构造函数(Constructor)

  • 构造函数(也叫构造器),在对象创建的时候自动调用,一般用于完成对象的初始化工作
  • 特点
    • 函数名与类同名,无返回值(void都不能写),可以有参数,可以重载(可以有多个构造函数,包括复制构造函数)
    • 一旦自定义了构造函数,必须用其中一个自定义的构造函数来初始化对象
  • 注意:通过malloc分配的对象不会调用构造函数
  • 在某些特定的情况下,编译器才会为类生成空的无参构造函数
  • 构造函数的调用情况如下图
    在这里插入图片描述
  • 默认情况下,全局区定义变量会直接初始化成员变量,其他区域要在类型后面加括号才能初始化,具体情况如下图:
    在这里插入图片描述
  • 如果对象中都是基础类型,在构造函数中可以调用memset方法批量初始化对象
    在这里插入图片描述

八、析构函数(Destructor)

  • 析构函数(也叫析构器),在对象销毁的时候自动调用,一般用于完成对象的清理工作
  • 函数名以~开头,与类同名,无返回值(void都不能写),无参,不可以重载,有且只有一个析构函数
  • 注意:用malloc分配的对象free的时候不会调用析构函数
  • 构造函数、析构函数都要声明为public,才能被外界正常使用
  • 对象内部申请的堆空间,由对象内部回收,否则会出现内存泄漏的情况
    在这里插入图片描述
    • 外面的对象即使创建在栈空间,内部创建的堆空间对象也要由对象回收
      在这里插入图片描述

九、声明和实现分离

  • 一般对象申明在h文件中,实现在cpp文件中
    在这里插入图片描述

十、命名空间

  • 命名空间可以用来避免名字的冲突
  • 命名空间不影响内存布局
    在这里插入图片描述
  • 命名空间的嵌套,命名空间可以嵌套,适用时需要指定嵌套关系
    在这里插入图片描述
  • 有个默认的全局命名空间,我们创建的命名空间默认都嵌套在它的里面
    在这里插入图片描述
  • 命名空间的合并:以下2中写法是等价的
    在这里插入图片描述
  • 在声明和实现分离的场景中,可以指定相同的命名空间
    在这里插入图片描述

后记
  个人总结,欢迎转载、评论、批评指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/288785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

引导过程与服务控制

一、开机启动的完整过程 bios加电自检测-------mbr------grub----------加载内核文件------------启动第一个进程 简述&#xff1a;加电后bios程序会自检硬件&#xff0c;硬件无故障&#xff0c;会根据第一启动项去找内核&#xff0c;一般来说&#xff0c;第一启动项是硬盘&a…

(学习打卡2)重学Java设计模式之六大设计原则

前言&#xff1a;听说有本很牛的关于Java设计模式的书——重学Java设计模式&#xff0c;然后买了(*^▽^*) 开始跟着小傅哥学Java设计模式吧&#xff0c;本文主要记录笔者的学习笔记和心得。 打卡&#xff01;打卡&#xff01; 六大设计原则 &#xff08;引读&#xff1a;这里…

最新-mybatis-plus 3.5分页插件配置

mybatis-plus 3.5分页插件配置 前提 1.项目不是springboot, 是以前的常规spring项目 2.mp 从3.2升级到3.5&#xff0c;升级后发现原本的分页竟然不起作用了&#xff0c;每次查询都是查出所有 前后配置对比 jar包对比 jsqlparser我这里单独引了包&#xff0c;因为版本太低…

[蓝桥杯2020国赛]答疑

答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下&#xff1a; 首先进入办公室&#xff0c;编号为 i 的同学需要 si​ 毫秒的时间。然后同学问…

深入理解SPi通讯协议

目录 SPI简介&#xff1a; 主设备通过选择线&#xff08;SS&#xff09; 主设备通过时钟线&#xff08;SCLK&#xff09; 主设备通过主输出线&#xff08;MOSI&#xff09; 主设备通过主输出线&#xff08;MISO&#xff09; SPI读写数据&#xff1a; SPI写入数据&#xf…

超详细解释奇异值分解(SVD)【附例题和分析】

目录 一. 矩阵对角化 二. 奇异值分解 三. 对比奇异值分解与特征值分解 四. SVD分解与四大基础子空间 五. SVD分解的正交矩阵 六. 方阵与SVD分解 七. 单位特征向量与SVD分解 八. 例题分析&#xff1a;秩为1 九. 例题分析&#xff1a;秩为2 十. 计算机网络与矩阵的秩 一…

从董宇辉小作文风波,我们普通人能学到些什么?

哈喽&#xff0c;大家好啊&#xff0c;我是雷工&#xff01; 最近董宇辉小作文风波动静太大了&#xff0c;哪哪都是。 打开公号上都在写董宇辉&#xff0c;打开某音&#xff0c;都在说董宇辉。 这种事其实本来就是立场不同&#xff0c;各个角度来说都有道理的事。 神仙打架&am…

利用深度学习图像识别技术实现教室人数识别

引言 在现代教育环境中&#xff0c;高效管理和监控教室成为了一个重要议题。随着人工智能技术的迅猛发展&#xff0c;特别是深度学习和图像识别领域的突破&#xff0c;我们现在可以通过智能系统来自动识别教室内的人数&#xff0c;从而实现更加智能化的教室管理。 深度学习与图…

手把手教你开发盲盒小程序

在这个数字时代&#xff0c;微信小程序已经成为了各大品牌和个人的主要营销渠道。而盲盒小程序&#xff0c;作为小程序领域中的一种独特类型&#xff0c;更是具有巨大的市场潜力。那么&#xff0c;如何创建和运营一个成功的微信盲盒小程序呢&#xff1f;以下是一份保姆级的教程…

SpringBoot之多环境开发配置

1 多环境开发配置 问题导入 在实际开发中&#xff0c;项目的开发环境、测试环境、生产环境的配置信息是否会一致&#xff1f;如何快速切换&#xff1f; 1.1 多环境启动配置 yaml文件多环境启动 不同环境使用—隔开 示例代码&#xff1a; spring:profiles:active: dev#生产…

Intellij IDEA 快速开发参考

快捷键 核心快捷键 IntelliJ IDEA 作为一个以快捷键为中心的 IDE&#xff0c;为大多数操作建议了键盘快捷键。在这个主题中&#xff0c;您可以找到最不可缺少的列表&#xff0c;使 IntelliJ IDEA 轻松实现第一步。 核心快捷键表&#xff1a; 操作快捷键根据名称查找操作CtrlSh…

阶段十-分布式-Redis02

第一章 Redis 事务 1.1 节 数据库事务复习 数据库事务的四大特性 A&#xff1a;Atomic &#xff0c;原子性&#xff0c;将所以SQL作为原子工作单元执行&#xff0c;要么全部执行&#xff0c;要么全部不执行&#xff1b;C&#xff1a;Consistent&#xff0c;一致性&#xff0…

Django 分页(表单)

目录 一、手动分页二、分页器分页 一、手动分页 1、概念 页码&#xff1a;很容易理解&#xff0c;就是一本书的页码每页数量&#xff1a;就是一本书中某一页中的内容&#xff08;数据量&#xff0c;比如第二页有15行内容&#xff09;&#xff0c;这 15 就是该页的数据量 每一…

【信号处理:小波包转换(WPT)/小波包分解(WPD) 】

【信号处理&#xff1a;小波包转换&#xff08;WPT&#xff09;/小波包分解&#xff08;WPD&#xff09; 】 小波包变换简介WPT/WPD的基础知识WPT/WPD的主要特点The Wavelet Packet Transform 小波包变换前向小波数据包变换最佳基础和成本函数数学中波纹的最佳基础其他成本函数…

【教学类-43-14】 20240103 (4宫格数独:正确版:576套) 不重复的基础模板数量:576套

作品展示&#xff1a;&#xff1a;——4宫格 576套不重复模板&#xff08;48页*12套题&#xff09; 背景需求&#xff1a; 生成4宫格基础模板768套&#xff0c;观看64页内容时&#xff0c;明显看到有错误 【教学类-43-13】 20240103 &#xff08;4宫格数独&#xff1a;错误版…

kbdnso.dll文件缺失,软件或游戏报错的快速修复方法

很多小伙伴遇到电脑报错&#xff0c;提示“kbdnso.dll文件缺失&#xff0c;程序无法启动执行”时&#xff0c;不知道应该怎样处理&#xff0c;还以为是程序出现了问题&#xff0c;想卸载重装。 首先&#xff0c;先要了解“kbdnso.dll文件”是什么&#xff1f; kbdnso.dll是Win…

高压功率放大器的作用或应用领域是什么

高压功率放大器是一种能够将低电压信号放大到高电压水平的设备。它在各个领域中扮演着重要的角色&#xff0c;并具有广泛的应用。本文将介绍高压功率放大器的作用和应用领域。 高压功率放大器可以在音频设备中发挥重要作用。音频设备中需要将低音频信号放大到足够的水平&#x…

控制台日志存入数据库后结果乱码

控制台输出 数据库返回 结论 控制台的输出在存储到数据库之后出现了ANSI颜色代码。这些颜色代码通常是由控制台日志库添加的&#xff0c;用于在支持ANSI颜色代码的终端中显示彩色文本。例如&#xff1a; [95m6 [0m | [95m0.6376 [0m | [95m0.0 [0m | [95m289.2 [0m | 在上面的…

MySQL主从复制案例实现

使用Sharding-JDBC实现读写分离&#xff1a; 1、导入maven坐标 2、 在配置文件中配置读写分离规则 3、在配置文件中配置允许bean定义覆盖配置项 1、导入maven坐标 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jd…

Java安装详细教程

文章目录 一、JDK 下载 和 安装1.1 选择 Java版本1.2 下载 JDK 二、 配置环境变量2.1 配置环境变量的原因2.2 配置环境变量2.3 验证配置是否成功 参考资料 一、JDK 下载 和 安装 1.1 选择 Java版本 访问 Oracle 官方网站的 Java 下载页面Java Archive | Oracle。 在 “Java …