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中写法是等价的
    在这里插入图片描述
  • 在声明和实现分离的场景中,可以指定相同的命名空间
    在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划】LeetCode-10. 正则表达式匹配

10. 正则表达式匹配。 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 …

MySQL概述

M y S Q L 概述 \huge{MySQL概述} MySQL概述 MySQL学习笔记 引入 什么是数据库&#xff1f; D \color{red}D Data B \color{red}B Base&#xff08;DB&#xff09;&#xff0c;存储和管理数据的仓库。 使用的各种电子产品的网页&#xff0c;页面中的数据都是动态的&#xf…

嵌入式系统(二)单片机基础 | 单片机特点 内部结构 最小系统 电源 晶振 复位

上一篇文章我们介绍了嵌入式系统 嵌入式系统&#xff08;Embedded System&#xff09;是一种特定用途的计算机系统&#xff0c;它通常嵌入在更大的产品或系统中&#xff0c;用于控制、监测或执行特定的任务。这些系统通常由硬件和软件组成&#xff0c;旨在满足特定的需求&…

使用SpringBoot AOP记录操作日志和异常日志

使用SpringBoot AOP记录操作日志和异常日志 平时我们在做项目时经常需要对一些重要功能操作记录日志&#xff0c;方便以后跟踪是谁在操作此功能&#xff1b;我们在操作某些功 能时也有可能会发生异常&#xff0c;但是每次发生异常要定位原因我们都要到服务器去查询日志才能找…

【LeetCode每日一题】1599. 经营摩天轮的最大利润(模拟)—2024新年快乐!

2024-1-1 文章目录 [1599. 经营摩天轮的最大利润](https://leetcode.cn/problems/maximum-profit-of-operating-a-centennial-wheel/)思路&#xff1a; 1599. 经营摩天轮的最大利润 思路&#xff1a; 1.对摩天轮的运转情况进行模拟&#xff0c; 2.遍历数组&#xff0c;分别计…

springcloud alibaba整合sentinel并结合dashboard控制面板设置规则

目录 一、springcloud alibaba整合sentinel二、采用代码方式设置流控规则三、结合dashboard控制面板设置规则3.1、准备工作3.2、设置全局异常处理3.3、编写测试接口3.4、结合dashboard控制面板设置规则3.4.1、流控规则设置并测试——QPS3.4.2、流控规则设置并测试——线程数3.4…

微信小程序使用echarts报错 ReferenceError: Image is not defined 解决

报错 ReferenceError: Image is not defined 在用uni-app开发微信小程序时&#xff0c;使用到了echarts&#xff08;V4.6.0&#xff09;配置项中的icon属性&#xff0c;微信开发者工具报错如下&#xff1a; 定位问题 定位问题到了压缩echarts文件中的new Image 使用非压缩…

【JavaFX】JDK11 基于Gson、hutool、Jackson持久化存储实体类数据的解决方案 (读取、追加、去重、写入json对象)

文章目录 开发环境效果前言一、Gson是什么?二、使用步骤1.引入依赖2.创建实体类创建 JsonFileService类创建JsonFileService的实现类 JsonFileServiceImpl三、实现效果开发环境 JDK11IDEA 2023.3Gson、hutool、JacksonJavaFX 11效果 前言 使用JDK1

用通俗易懂的方式讲解大模型:在 CPU 服务器上部署 ChatGLM3-6B 模型

大语言模型&#xff08;LLM&#xff09;的量化技术可以大大降低 LLM 部署所需的计算资源&#xff0c;模型量化后可以将 LLM 的显存使用量降低数倍&#xff0c;甚至可以将 LLM 转换为完全无需显存的模型&#xff0c;这对于 LLM 的推广使用来说是非常有吸引力的。 本文将介绍如何…

C# windows服务程序开机自启动exe程序

我们使用传统的Process.Start(".exe")启动进程会遇到无法打开UI界面的问题&#xff0c;尤其是我们需要进行开启自启动程序设置时出现诸多问题&#xff0c;于是我们就想到采用windows服务开机自启动来创建启动一个新的exe程序&#xff0c;并且是显式运行。 首先是打开…

【一文入门】Git常用命令集锦--分支操作和版本管理篇

前言 Git 是一种分布式版本控制系统&#xff0c;可以帮助团队协作开发、管理和维护代码&#xff0c;提高代码质量和效率&#xff0c;掌握常用版本管理命令可以帮助我们更好地管理代码变更和历史记录。下面我将介绍开发中常用的一些Git分支操作和版本管理命令 1 分支操作 1.1 …

centos7安装nacos

一、前言 centos 7.9上部署nacos 2.0.3 二、部署步骤 1、下载nacos wget -P /opt/software/ https://github.com/alibaba/nacos/releases/download/2.0.3/nacos-server-2.0.3.tar.gz 2、解压并改变nacos部署目录 cd /opt/software/ tar -zxf nacos-server-2.0.3.tar.gz mv…