【C++ 重要知识点总结】自定义类型-类和结构体

类的基本特性

  • 数据抽象和封装
  • 继承
  • 多态

1 类的构成——抽象

概念

  • 数据抽象是一种依赖于接口和实现的分离的编程技术。
  • 类的接口包括用户所能执行的操作;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需要的的各种私有函数。
  • 封装实现了类的接口和实现的分离。

类成员

  • 定义包含数据成员成员函数
  • 定义在类内部的函数是隐式的 inline 函数!

this指针

  • this 指针。用来指明当前绑定的对象。只在依赖对象的函数中添加 this 指针。

常量成员

  • 常量成员函数。const 关键字放在成员函数的参数列表之后。常量函数的 this 指针指向常量对象。不能对常量对象内数据进行修改。
class A{const int getM(){//表示返回值是const类型的}int getN() const{//表示函数是const类型的}
}
  • 当一个函数被 const 说明后,其函数中出现的对外部数据的任何写入或修改都将被系统检查为出错。如果把函数 writeme()说明为:
void writeme(int i) const { me = i; } //系统将会检查出错误。
  • 作用:当函数体较大且复杂时,如果我们希望系统帮助避免对对象内容进行修改,那么我们就会将这个函数定义为常量型函数,这就是使用它的主要目的。

构造函数

  • 控制对象的初始化过程。只要类对象被创建就会执行构造函数。
  • 构造函数没有返回类型。构造函数不能被声明成 const
  • 默认构造函数没有任何实参。
  • 合成的默认构造函数。编译器隐式地创建的默认构造函数。合成默认构造函数初始化过程:
    • 如果类内存在初始值,使用它来初始化成员
    • 否则,默认初始化该成员。
hello{hello()=default;//要求编译器生成默认的构造函数。
}

构造函数的初始值列表

hello{heelo(int aa,int bb):a(aa),b(bb),c(0){};//列表初始化。
}

2 访问控制——封装

访问说明符

  • public,对外部函数可见。
  • private,被类成员访问,但不能被外部访问。private 部分封装了类的实现细节。
  • protect,对子类可见

定义类

  • class 和 struct 都能定义类。
  • class 的默认访问控制是 private
  • struct 的默认访问控制是 public

友元

  • 类的接口可以不是类的成员。下图中,print、add、read 是类的接口但是不是类的成员。被称作非成员接口函数。

在这里插入图片描述

  • 非成员接口函数无法访问类的私有变量。可以声明友元,访问私有变量。友元的声明智能出现在类定义的内部。友元是突破访问控制符的方法。
    在这里插入图片描述

  • 友元也为多种形式的接口提供了方法。比如可以重载上述的 read 函数,让它成为多个不同的类友元。可以实现一个接口在多种不同情况下的使用。

3 类的其他特性

  • 类内的函数可以被声明为内联函数
  • 成员函数可以被重载。
  • (日了狗了,真 TM 特例也太多了吧,有必要吗)可变成员函数,mutable 声明的变量,是可变数据成员。即是是 const 对象的成员,它也是可变数据成员,依然能够改变。

类类型

  • 类通过类名来标识。如果两个类的内容完全一致,但是类名不一样,也无法相互赋值。
  • 两种创建对象的方法
Hello h;
class Hello h;//包含关键字class创建对象。两者等价。
  • 类可以进行前向声明,而不进行定义。他是一个不完全的类型。
class Hello;
  • 在创建类的对象之前,类必须被定义。所以如果要引用其他头文件中的类,类必须在该头文件就被定义,否则没办法创建对象进行连接。

  • 其他类、类成员都可以声明为类的友元。

4 类的作用域

  • 在类的作用域外,通过对象、引用、指针,使用成员访问运算符访问。
  • 在类外定义函数,需要指明类作用域,使用作用域运算符::实现类内的函数。函数体内可以直接使用类作用域内的内容。函数体外的返回值通过作用域运算符使用类作用域内的内容。

名字查找与类的作用域

名字查找的步骤

  • 作用域内查找使用之前的声明。
  • 查找外层作用域的声明
  • 如果没找到报错。

类内名字查找比较特殊。

  • 首先编译成员声明。
  • 然后编译函数体。
  • 所以即使类的成员声明在类的末尾,对之前的函数来说也是可见的。

成员定义中普通块作用域的名字查找

  • 首先在成员函数内查找声明。
  • 类内查找。所有的类成员都被考虑。
  • 在成员函数定义之前的作用域内查找。

5 构造函数与初始化

  • 当成员是常量或引用的时候,初始化是必不可少的。
  • 成员初始化的书序与他们在类定义中的出现顺序一致。而非初始化列表中传入参数的顺序。

委托构造函数

  • 委托构造函数使用类的其他构造函数执行自己的初始化过程。

在这里插入图片描述

初始化执行的顺序

  1. 初始化列表
  2. 委托构造函数
  3. 初始化函数体
  4. 值初始化。(在成员变量定义的时候给出的值)
  5. 默认初始化(以上情况都没有的时候)

默认构造函数的作用

默认初始化在一下情况发生:

  • 块作用域内不适用任何初始值定义一个非静态变量
  • 一个类本身含有类类型的成员其而是用合成的默认构造函数时。(包含关系的外部合成默认构造函数会自动调用内部的默认构造函数。)如果有自定义的默认构造函数,需要自己手动初始化内部默认构造函数。
  • 类类型的成员没有在构造函数的初值列表中显式的初始化。

值初始化在一下情况发生

  • 数组初始化过程中,提供的初始值很少。
  • 不适用初始值顶一个局部静态变量。
  • 使用T()表达式,显式的请求值初始化。

抑制构造函数定义的隐式转换。

  • 使用explicit关键字。将函数声明为explicit。
class Hello{
publicHello()=default;explic Hello(const string s){}
}
  • explicit构造函数只能用于直接初始化。
  • 可以使用显式的强制类型转换。

聚合类

  • 用户可以直接访问其成员。具有特殊的初始化语法形式。

    • 所有成员都是public
    • 没有定义任何构造函数
    • 没有类内初始值
    • 没有基类。
  • 使用花括号括起来的成员初始值列表。并用它初始化聚合类的数据成员。

struct Person
{std::string name;int height;
};int main()
{Person person={"xiaohong",10};std::cout << person.name<<" "<<person.height << std::endl;system("pause");return 0;
}

字面值常量类

  • 数据成员都是字面值类型的聚合类。是字面值常量类。
    • 数据成员必须都是字面值类型。
    • 类必须至少有一个constexpr构造函数。
    • 内置类型成员初始值必须是常量表达式。
    • 类必须使用关系够函数的默认定义。

在这里插入图片描述

6 类的静态成员

与类本身直接相关,而不是与类的各个对象保持关联。

声明静态成员

在这里插入图片描述

使用静态成员

  • 使用作用域运算符访问静态成员
double r = Account::rate();
  • 使用对象、引用、指针访问静态成员
Account a,*b=&a;
a.rate();
b->rate;
  • 成员函数可以直接访问静态成员。

定义静态成员

  • 不能再类的内部初始化惊天成员。必须在类的外部定义和初始化静态成员。静态数据成员智能被定义依稀。

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

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

相关文章

Java使用FFmpeg实现mp4转m3u8

Java使用FFmpeg实现mp4转m3u8 前言FFmpegM3U8 一、需求及思路分析二、安装FFmpeg1.windows下安装FFmpeg2.linux下安装FFmpegUbuntuCentOS 三、代码实现1.引入依赖2.修改配置文件3.工具类4.Controlle调用5.Url转换MultipartFile的工具类 四、播放测试1.html2.nginx配置3.效果展示…

Web3.0:已经开启的互联网革命!

1 痛点 2 web发展形态 只读、封闭式、协作式。 3 一个高度联系、全球统一的数字经济体 去中心化架构通过计算几余打破数据垄断&#xff0c;同时实现数字确权大量的功能依靠智能合约自动实现&#xff0c;运转效率大大提升DAO大量涌现&#xff0c;全球范围实现资源配置 4 特…

【Element-ui】学习与使用

网站快速成型工具Element&#xff0c;一套为开发者、设计师和产品经理准备的基于vue2.0的桌面端组件库 安装 npm i element-ui -S 在项目中安装element-ui&#xff0c;安装了以后查看package.json中的依赖中有没有element-ui的版本&#xff0c;如果有&#xff0c;则说明安装成功…

Spring Boot 自定义启动画面

文章目录 自定 Banner获取属性设置颜色实操关闭 Banner参考 我们启动项目的之后&#xff0c;会在控制台上看到类似下面的画面&#xff1a; 那么&#xff0c;我们是否可以自定义呢&#xff1f; 肯定可以 自定 Banner 上面的截图信息就是 Banner 信息&#xff0c;我们可以在项目…

在Chrome(谷歌浏览器)中安装Vue.js devtools开发者工具及解决Vue.js not detected报错

文章目录 一、Vue.js devtools开发者工具安装1.打开谷歌浏览器——点击扩展程序——选择管理扩展程序2.先下载添加一个谷歌助手到扩展程序中&#xff08;根据提示进行永久激活&#xff09;3.点击谷歌浏览器的应用商店4.输入Vue.js devtools——搜索——选择下载 二、解决Vue.js…

如何为WordPress博客网站配置免费域名HTTPS证书

文章目录 如何为WordPress博客网站配置免费域名HTTPS证书前置条件&#xff1a;步骤1 申请免费的域名HTTPS证书步骤2 将HTTP证书配置到cpolar的配置文件中2.1 创建证书文件夹2.2 修改cpolar配置文件2.3 重启cpolar服务2.4 查看后台Wordpress隧道是否在线正常2.5 用浏览器打开站点…

MyBatis基础模块-类型转换模块

文章目录 1. 为什么需要类型转换模块2. TypeHandler 1. 为什么需要类型转换模块 执行sql&#xff0c;在PreparedStatement设置参数时&#xff0c;需要把java类型转换成jdbc类型&#xff0c;而从结果集中获取数据时&#xff0c;需要把jdbc类型转换为java类型。 2. TypeHandle…

Linux操作系统~必考面试题⑧

1、pwd 命令 pwd 命令用于查看当前工作目录路径。 实例&#xff1a; 查看当前路径 pwd 查看软链接的实际路径 pwd -P 2、rmdir 命令 从一个目录中删除一个或多个子目录项&#xff0c;删除某目录时也必须具有对其父目录的写权限。 注意&#xff1a;不能删除非空目录实例&…

Linux系统MySQL中用户的权限管理

本节主要学习用户权限管理的概述&#xff0c;用户权限类型&#xff0c;用户赋权&#xff0c;权限删除&#xff0c;用户删除等。 目录 一、概述 二、用户权限类型 三、用户赋权 四、权限删除 五、用户删除 一、概述 数据库用户权限管理是数据库系统中非常重要的一个方面&am…

统一观测丨使用 Prometheus 监控 Cassandra 数据库最佳实践

作者&#xff1a;元格 本篇内容主要包括四部分&#xff1a;Cassandra 概览介绍、常见关键指标解读、常见告警规则解读、如何通过 Prometheus 建立相应监控体系。 Cassandra 简介 Cassandra 是什么&#xff1f; Apache Cassandra 是一个开源、分布式、去中心化、弹性可伸缩、…

Vue3封装函数组件(ElImageViewer)预览图片

目录结构 index.vue <template><el-image-viewer v-if"show" v-bind"$attrs" hide-on-click-modal close"show false" /> </template><script setup> import { ref, watch } from "vue" import { ElImageV…

Linux基础以及常用命令

目录 1 Linux简介1.1 不同应用领域的主流操作系统1.2 Linux系统版本1.3 Linux安装1.3.1 安装VMWare1.3.2 安装CentOS镜像1.3.3 网卡设置1.3.4 安装SSH连接工具1.3.5 Linux和Windows目录结构对比 2 Linux常用命令2.0 常用命令&#xff08;ls&#xff0c;pwd&#xff0c;cd&#…

mysql的一些知识整理

这里整理一些mysql相关的知识点&#xff0c;是自己不太熟悉的内容 varchar(n) 中 n 最大取值为多少 MySQL 规定除了 TEXT、BLOBs 这种大对象类型之外&#xff0c;其他所有的列&#xff08;不包括隐藏列和记录头信息&#xff09;占用的字节长度加起来不能超过 65535 个字节。 …

docker+Jenkins

拉取镜像 docker pull jenkins/jenkins启动容器 8080端口映射58080 jenkins_home 映射本地/data/下方便查看 docker run -d -p 58080:8080 -p 5000:50000 -v /data/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime --name jenkins jenkins/jenkins访问ip:5…

Java多线程锁

多线程锁 本专栏学习内容又是来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 Synchronized Synchronized是Java中锁的一种实现方法&#xff0c;我们需要了解他锁在什么地方&#xff0c;锁的类型有哪些 阿里巴巴开发手册规定&#xff1a; 高并发时&#xff0c;同…

将Spring Session存储到Redis中实现持久化

文章目录 Session持久化1. 添加依赖2. 配置redis连接信息3. 存储和读取session从Redis Session持久化 1. 添加依赖 在项目中添加session依赖和redis依赖&#xff0c;如下所示&#xff1a; <dependency><groupId>org.springframework.boot</groupId><art…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)五:后台主页功能实现上

一、本章内容 本章实现后台主页框架实现、菜单的动态加载及生产、tab组件与菜单绑定、菜单与路由绑定等,工具栏按钮等界面及对应功能实现。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览

vue脚手架文件说明

vue脚手架文件说明 1、文件介绍2、脚手架里面主要文件和作用 1、文件介绍 2、脚手架里面主要文件和作用 node_modules 都是下载的第三方包public/index.html 浏览器运行的网页src/main.js webpack打包的入口src/APP.vue Vue页面入口package.json 依赖包列表文件

E2E工程问题:小周期转大周期Gateway

摘要&#xff1a; 本文讨论一个具体的工程问题&#xff0c;E2E报文对应的信号&#xff0c;由小周期转大周期导致的E2E校验失败问题。 工程中&#xff0c;网关节点很重要的一个功能就是路由。当然&#xff0c;E2E&#xff08;End to End&#xff09;报文也可路由&#xff0c;但…

5分钟开发一个AI论文抓取和ChatGPT提炼应用

5分钟开发一个AI论文抓取和ChatGPT提炼应用 第一步 点击“即刻开始” -选择模板 python -修改标题 “AIPaper”&#xff0c;项目标识“AIPaper”&#xff0c;点击“创建项目” 第二步 在编程区域右侧AI区域&#xff0c;输入框输入以下内容&#xff1a; 请根据下面的内容&…