【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{
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;
  • 成员函数可以直接访问静态成员。

定义静态成员

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

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

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

相关文章

数据服务:保障数据安全、提升数据价值的利器

04-08把元数据以及在它基础上的五大应用场景&#xff1a;数据发现&#xff08;数据地图&#xff09;、指标管理、模型设计、数据质量、成本优化&#xff0c;全部讲完。这部分内容对应的就是数据中台OneData 方法论。学完这部分内容&#xff0c;你已了解OneData方法论在企业内部…

【业务功能篇55】Springboot+easyPOI 导入导出

Apache POI是Apache软件基金会的开源项目&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 代码实现复杂&#xff0c;学习成本较高。 Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出…

MySQL基础扎实——MySQL中各种数据类型之间的区别

在MySQL中&#xff0c;有各种不同的数据类型可供选择来存储不同类型的数据。下面是一些常见的数据类型以及它们之间的区别&#xff1a; 整数类型&#xff1a; TINYINT&#xff1a;1字节&#xff0c;范围为-128到127或0到255&#xff08;无符号&#xff09;。SMALLINT&#xff1…

项目文档管理的基本指南

项目文档是一种关键的项目管理资源&#xff0c;它可以提供清晰度&#xff0c;保证参与项目的每个人都在同一页面上&#xff0c;从而确保项目按时、按预算完成。 本文将讨论项目文档的重要性、如何在项目中使用项目文档以及选择好合适的项目文档管理软件的技巧。 什么是项目文…

代码随想录算法学习心得 49 | 647.回文子串、516.最长回文子序列...

一、最长回文子序列 链接&#xff1a;力扣 描述&#xff1a;给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 思…

【C++】开源:Boost网络库Asio配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

Form Generator 扩展子表单组件之表单校验(超详细)

一、form-generator是什么?✨ ⭐️ 🌟 form-generator的作者是这样介绍的:Element UI表单设计及代码生成器,可将生成的代码直接运行在基于Element的vue项目中;也可导出JSON表单,使用配套的解析器将JSON解析成真实的表单。 但目前它提供的组件并不能满足我们在项目中的…

【搜索引擎Solr】Apache Solr 神经搜索

Sease[1] 与 Alessandro Benedetti&#xff08;Apache Lucene/Solr PMC 成员和提交者&#xff09;和 Elia Porciani&#xff08;Sease 研发软件工程师&#xff09;共同为开源社区贡献了 Apache Solr 中神经搜索的第一个里程碑。 它依赖于 Apache Lucene 实现 [2] 进行 K-最近邻…

【Apollo学习笔记】—— Routing模块

Routing模块功能 Apollo的routing模块读取高精地图原始信息&#xff0c;用于根据输入RoutingRequest信息在base_map中选取匹配最近的点作为导航轨迹的起点和终点&#xff0c;读取依据base_map生成的routing_map作为生成topo_graph的&#xff0c;然后通过Astar算法在拓扑图中搜…

SSIS对SQL Server向Mysql数据转发表数据 (一)

开发工具 Visual Stuido 2019 、SSIS、SQL Server 2016、Mysql 8.0.30 1、配置VS2019的添加相应的功能&#xff0c;勾选SQL Server Data Tools,下载就行我用的VS2019版本还需要下载下面几个插件&#xff0c;链接我放在下面了 Microsoft Analysis Services Projects - Visual St…

[linux--->应用层网络通信协议]

文章目录 [TOC](文章目录) 一、应用层通信概念1.协议2.信息接收 二、网络计算器实战应用三、http协议1.基本认识2.宏观理解http3.网站内部跳转4.请求方法5.状态码5.1重定向5.2错误码 6.常见报头7.http会话保持功能8.模拟http协议服务器编程 四、https协议1.加密概念2.加密的作用…

esp32_arduino的开发库安装笔记

1.1 Arduino软件下载与安装 Arduino官网下载地址&#xff1a;https://www.arduino.cc/en/software。 1.2在线安装 选择文件 - 首选项。 在附加开发板管理器网址中添加以下链接中的一个。 (1)Stable release link: https://raw.githubusercontent.com/espressif/arduino-es…

opencv-17 脸部打码及解码

使用掩模和按位运算方式实现的对脸部打码、解码实例 代码如下&#xff1a; import cv2 import numpy as np #读取原始载体图像 lenacv2.imread("lena.png",0) #读取原始载体图像的 shape 值 r,clena.shape masknp.zeros((r,c),dtypenp.uint8) mask[220:400,250:350…

MLagents 多场景并行训练

MLagents多场景并行训练调试总结 摘要 关于Unity MLagents的环境安装已经有了很多的blog和Video&#xff0c;本文针对MLagents的多场景的并行训练&#xff0c;以及在探索过程中出现的问题进行总结。 内容 Unity MLagents 多场景并行训练可以同时设置开多个场景进行并行探索…

账号列表的删除编辑提交

<template><div><plan title"账号列表"><!-- selection-change"handleSelectionChange"添加这个属性就是点击可以得到你想要的value值 --><el-tablestyle"width: 100%":data"list"selection-change"h…

Python 生成随机图片验证码

使用Python生成图片验证码 Python 生成随机图片验证码安装pillow包pillow包生成图片基本用法生成图片验证码 Python 生成随机图片验证码 在写一个Web项目的时候一般要写登录操作&#xff0c;而为了安全起见&#xff0c;现在的登录功能都会加上输入图片验证码这一功能&#xff…

上海VR全景展示,快速了解VR全景拍摄

导语&#xff1a; 随着科技的不断进步&#xff0c;虚拟现实技术的应用日益广泛。在这其中&#xff0c;VR全景图片作为一种数字化助力的全景拍摄方式&#xff0c;正逐渐成为人们关注的焦点。通过数字化技术&#xff0c;VR全景图片能够以360度全方位的视角呈现真实的场景&#x…

功率放大器在电光调制中的应用有哪些

电光调制是一种利用光电效应将电信号转化为光信号的技术。在实现电光调制的过程中&#xff0c;功率放大器作为一个重要的组件&#xff0c;具有对输入电信号进行放大和控制的功能。本文将介绍功率放大器的基本原理、特点以及在电光调制中的应用。 基本原理 功率放大器是一种能够…

小程序 methods方法互相调用 this.onClickCancel is not a function

背景 做了一个自定义的弹出对话窗口&#xff0c;主要是自定义一些文本颜色。 问题 但是点击按钮事件&#xff1a;取消与确认&#xff0c;调用了同一个接口&#xff0c;然后想着走不同方法&#xff0c;需要调用methods其他方法。然后报错了&#xff1a; VM1081 WAService.js:…

Vue style中的 scoped 属性

Vue 中存在 scoped 属性&#xff0c;HTML5中也存在一个 scoped 属性&#xff0c;而且&#xff0c;这两者都是针对 css 样式处理的属性&#xff0c;所以很多文章在 解释 Vue scoped 的时候&#xff0c;都会把两者混为一谈&#xff0c;直接进把 HTML5 scoped 的定义搬到 Vue scop…