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

news2025/1/12 4:00:25

类的基本特性

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

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{
public
    Hello()=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.coloradmin.cn/o/795076.html

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

相关文章

645. 错误的集合

645. 错误的集合 class Solution { public static int[] findErrorNums(int[] nums) {Arrays.sort(nums);int dup-1;int miss1;for (int i 1; i < nums.length; i) {if(nums[i]nums[i-1]){dupnums[i];}if(nums[i]-nums[i-1]>1){missnums[i]-1;}}return new int[]{dup,…

Vmware vSphere 5.0系列

Vmware vSphere 5.0 我们都用过 vmware workstation 这款产品&#xff0c;可以使我们安装很多虚拟机&#xff0c;但是 vmware 的核心产品远非局限于 workstation。 vSphere 是 VMware 推出的基于云的新一代数据中心虚拟化套件&#xff0c;提供了虚拟化基础架构、高可用性、集…

Tesseract开源的OCR工具及python pytesseract安装使用

一 、介绍 Tesseract是一款由Google赞助的开源OCR。 pytesseract是python包装器&#xff0c;它为可执行文件提供了pythonic API。 Tesseract 已经有 30 年历史&#xff0c;开始它是惠普实验室的一款专利软件&#xff0c;在2005年后由Google接手并进一步开发和完善。Tesseract支…

【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学

前言 【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学一、XCharts介绍1.1 特性1.2 相关网站链接1.3 效果展示 二、XCharts导入三、XCharts快速使用3.1 添加一个简单图表3.2 添加多个Seire3.3 给图表添加其他组件3.4 添加Serie组件&#xff0c;如…

什么是Maven,Maven的概述及基本使用

MAVEN 一、Maven简介1.1、Maven概述1.2、Maven仓库1.3项目获取jar包过程 二、Maven使用2.1Maven安装配置2.1.1配置环境变量2.1.2配置本地仓库2.1.3配置阿里云私服 2.2Maven基本使用2.2.1Maven常用指令2.2.2Maven生命周期 总结 一、Maven简介 Apache Maven是一个项目管理和构建…

自动驾驶数据标注有哪些?

自动驾驶汽车&#xff1a;人工智能(AI)的焦点 人工智能驱动汽车解决方案的市场规模预计到 2025年将增长十倍以上&#xff0c;提升车内体验的商机领域以及 AI 模型的无偏见训练数据的重要性。在本篇中&#xff0c;我们将介绍车外体验的关键组成部分&#xff0c;以及自动驾驶数据…

Python 爬虫的学习 day01 ,爬虫的基本知识, requests 和 charde模块, get函数的使用

1.Python 爬虫 1.1什么是网络爬虫 网络爬虫&#xff0c;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本&#xff0c;另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 1.2 网络爬虫的特…

2023/7/26总结

最近都花时间在项目上 修改了发布文章的界面 然后文章可以上传图片了 修改了个人主页的界面&#xff08;这里把js代码注释掉了&#xff0c;所以没用内容&#xff09; 大概画了一下管理员的界面 和消息列表的界面 做了评论的界面&#xff1a;&#xff08;还没开始写&#xff0c…

“华为杯”研究生数学建模竞赛2019年-【华为杯】F题:多约束条件下智能飞行器航迹快速规划

目录 摘 要&#xff1a; 一、 问题重述 1.1 问题背景 1.2 需要解决的问题 二、 模型假设 三、符号说明 四、问题一 4.1 问题描述与分析 4.2 模型建立 4.2.1 数据处理 4.2.2 航迹规划模型建立 4.3 求解算法建立 4.3.1 最短路径数学表达 4.3.2 自适应改进型 Dijkstr…

力扣热门100题之合并区间【中等】

题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;interv…

Docker啥是数据持久化?

文章目录 数据持久化数据卷相关命令创建读写数据卷创建只读数据卷数据卷共享数据卷容器实现数据卷共享nginx实现数据卷共享nfs总结 Dockerfile持久化Dockerfile方式docker run总结 数据持久化 ​ 在容器层的 UnionFS&#xff08;联合文件系统&#xff09;中对文件/目录的任何修…

动态分段的JavaScript实现【线性参考】

有许多很酷的 GIS 应用程序将海拔和距离结合在一起。 当用户沿着高程图拖动光标时&#xff0c;地图上的位置通常会更新。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 在尝试将此功能构建到我的一个项目中时&#xff0c;我了解到它需要一种称为线性参考&#xff08;…

java排序算法之插入排序

文章目录 &#x1f4cb;插入排序概念&#x1f4d6;实现步骤&#x1f516;代码示例 &#x1f4c8;总结 &#x1f4cb;插入排序概念 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它将数组划分为已排序和未排序两个部分&#xff0c;每次从未排序部分…

iTOP-RK3568开发板Docker 安装 Ubuntu 18.04

Docker 下载安装 Ubuntu18.04&#xff0c;输入以下命令&#xff1a; sudo apt update docker pull ubuntu:18.04 切换 Shell 到 Ubuntu 18.04&#xff0c;输入以下命令&#xff1a; docker container run -p 8000:3000 -it ubuntu:18.04 /bin/bash -p 参数&#xff1a;容器的…

Shell脚本学习-shift语句的使用

[rootvm1 scripts]# help shift shift: shift [n]Shift positional parameters.Rename the positional parameters $N1,$N2 ... to $1,$2 ... If N isnot given, it is assumed to be 1.Exit Status:Returns success unless N is negative or greater than $#.说明&#xff1a…

vue解决跨域访问问题(个人学习笔记六)

目录 友情提醒第一章、跨越问题解决1.1&#xff09;什么是跨域问题&#xff1f;1.2&#xff09;第一种解决方式&#xff1a;后端设置允许跨域访问1.3&#xff09;第二种解决方式&#xff1a;前端配置代理 第二章、配置代理服务器2.1&#xff09;配置简单代理服务器2.2&#xff…

GPT-AI 使用的技术概览

ChatGPT 使用的技术概览 智心AI-3.5/4模型&#xff0c;联网对话&#xff0c;MJ快速绘画 从去年 OpenAI 发布 ChatGPT 以来&#xff0c;AI 的能力再次惊艳了世人。在这样的一个时间节点&#xff0c;重新去学习相关技术显得很有必要。 ChatGPT 的内容很多&#xff0c;我计划采用…

Git下载与安装

文章目录 一、Git下载二、Git安装1.双击下载好的安装包进行安装2.Next3.选择Git的安装目录(不要带有中文和空格)→Next4.Next5.Next6.Next7.Next8.Next9.Next10.Next11.Next12.Next13.Next14.Next15.Next16.Install17.等待安装18.Finish19.鼠标光标放到系统桌面右击看到如下图所…

【Python】数据分析+数据挖掘——探索Pandas中的索引与数据组织

前言 在数据科学和数据分析领域&#xff0c;Pandas是一个备受喜爱的Python库。它提供了丰富的数据结构和灵活的工具&#xff0c;帮助我们高效地处理和分析数据。其中&#xff0c;索引在Pandas中扮演着关键角色&#xff0c;它是一种强大的数据组织和访问机制&#xff0c;使我们…

Java那些“锁”事 - 公平锁和非公平锁

在Java中&#xff0c;锁可以分为公平锁&#xff08;Fair Lock&#xff09;和非公平锁&#xff08;Nonfair Lock&#xff09;&#xff0c;它们的区别在于线程获取锁的顺序是否遵循公平性原则。 公平锁 公平锁是指多个线程按照它们发出请求的顺序获取锁&#xff0c;即先到先得的原…