C++ 考前难点总结
前言
后天考c++,但这几天得甲流了,特别难受!复习c++的时候复习着忘着,所以用csdn记录一下不熟悉的知识点,等后天考前再看一遍!
函数模板
#include <iostream>// 定义一个模板类
template <class T1, typename T2>
class Pair {
private:T1 first;T2 second;public:// 构造函数Pair(T1 f, T2 s) : first(f), second(s) {}// 获取第一个元素T1 getFirst() const {return first;}// 获取第二个元素T2 getSecond() const {return second;}
};int main() {// 使用模板类 Pair,其中 T1 为 int,T2 为 doublePair<int, double> myPair(1, 3.14);// 输出结果std::cout << "First: " << myPair.getFirst() << std::endl;std::cout << "Second: " << myPair.getSecond() << std::endl;return 0;
}
T:类型参数,实际上是一个虚拟的类型名;
class 和typename的作用相同,都表示“类型名”,可互换
引用
格式: <类型> &<引用变量名> = <原变量名>;
其中原变量名是定义好的变量
不能建立引用的引用,也没有引用的指针

引用的用途主要是用来作函数的参数或函数的返回值
类和结构体类型的异同
用struct声明的类,如果对其成员不作private或public的声明,系统将其默认为public
而用class定义的类,如果不作private或public声明,系统将其成员默认为private,在需要时也可以自己用显式声明改变
如果希望成员是公用的,使用struct比较方便,如果希望部分成员是私有的,宜用class
建议尽量使用class来建立类,写出完全体现C++风格的程序
成员函数的存储方式
每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间
不同的对象使用的是同一个函数代码段,它怎么能够分别对不同对象中的数据进行操作呢?
C++为此专门设立了一个名为this的指针,用来指向不同的对象
应当说明: 常说的“某某对象的成员函数”,是从逻辑的角度而言的,而成员函数的存储方式,是从物理的角度而言的,二者是不矛盾的
构造函数
如果用户未定义构造函数,系统会自动提供一个默认构造函数,但函数体是空的,不提供初始化作用
如果用户仅仅写了一个有参构造函数,那么上述这个默认构造函数就会“消失”,比如:


构造函数也可以由默认值,应该在声明构造函数时指定
声明构造函数时,形参名可以省略,Box(int = 10,int = 10,int = 10)
构造函数带默认值时很容易和重载的构造函数产生歧义性,比如
Box();
Box(int = 10,int = 10,int = 10);
析构函数
析构函数不能被重载;一个类可以有多个构造函数,只能有一个析构函数
static局部对象,只在main函数结束或调用exit函数结束程序时调用析构函数
全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时调用析构函数
对于静态局部对象,只在程序第一次调用此函数建立对象时调用构造函数一次,在调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数
常对象
定义常对象的形式为:
类名 const 对象名[(实参表列)];
或
const 类名 对象名[(实参表列)];
常对象必须要有初值,所有成员的值都不能被修改。凡希望保证数据成员不被改变的对象,可声明为常对象
如果一个对象被声明为常对象,则不能调用该对象的非const型的成员函数(除了由系统自动调用的隐式的构造函数和析构函数)
引用常对象中的函数成员,只需将该成员函数声明为const即可。如
void get_time( ) const; //将函数声明为const
t1.get_time( ); // 可行
修改常对象中的某个数据成员的值,需要对该数据成员声明为mutable,如
mutable int count;//可以用声明为const的成员函数来修改它的值
常数据成员
和一般常变量相似,常数据成员的值是不能改变
只能通过构造函数的参数初始化表对常数据成员进行初始化。不能在构造函数中对常数据成员赋初值的方法。
Time∷Time(int h){hour=h} //非法
Time∷Time(int h):hour(h){} //通过参数初始化表对常数据成员初始化
常对象的数据成员都是常数据成员,因此常对象的构造函数只能用参数初始化表对常数据成员进行初始化
常成员函数
如果将成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改它们,例如只用于输出数据等
常成员函数可以引用const数据成员,也可以引用非const的数据成员
const数据成员可以被const成员函数引用,也可以被非const的成员函数引用
如果已定义了一个常对象,只能调用其中的const成员函数,而不能调用非const成员函数
常对象只保证其数据成员是常数据成员,其值不被修改
常成员函数不能调用另一个非const成员函数
静态成员
如果想在同类的多个对象之间实现数据共享,也不要用全局对象,可以用静态的数据成员
静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间。静态数据成员是在所有对象之外单独开辟空间。只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被引用
静态数据成员不随对象的建立而分配空间,也不随对象的撤销而释放(一般数据成员是在对象建立时分配空间,在对象撤销时释放)。静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间
静态数据成员可以初始化,但只能在类体外进行初始化。
一般形式为
数据类型类名∷静态数据成员名=初值;
int Box∷height=10;
注意: 不能用参数初始化表对静态数据成员初始化
如果未对静态数据成员赋初值,编译系统会自动赋予初值0
静态成员函数没有this指针,在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员
在一个静态成员函数中:
cout<<height<<endl; //若height已声明为static,则引用本类中的静态成员,合法
cout<<width<<endl; //若width是非静态数据成员,不合法
如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”。如: cout<<a.width<<endl; //引用本类对象a中的非静态成员
假设a已定义为Box类对象,且在当前作用域内有效,则此语句合法
运算符重载
C++不允许用户自己定义新的运算符,只能对已有的运算符进行重载。
C++中绝大部分的运算符允许重载。不能重载的运算符只有5个:
. (成员访问运算符)
* (成员指针访问运算符)
∷ (域运算符)
sizeof (长度运算符)
?: (条件运算符)
重载不能改变运算符运算对象(即操作数)的个数。
重载不能改变运算符的优先级别。
重载不能改变运算符的结合性
重载运算符的函数不能有默认参数,否则就改变了运算符参数的个数。
重载的运算符必须和用户定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。参数不能全部是C++的标准类型,以防止用户修改用于标准类型数据的运算符的性质。
用于类对象的运算符一般必须重载,但运算符“=”和“&”不必用户重载
自增运算符重载示例:
#include <iostream>class Counter {
private:int count;public:Counter() : count(0) {}// 重载前置自增运算符 (++var)Counter& operator++() {count++;return *this; // 返回递增后的对象引用}// 重载后置自增运算符 (var++)Counter operator++(int) {Counter temp(*this); // 创建一个副本用于保存递增前的值count++;return temp; // 返回递增前的对象副本}void display() const {std::cout << "Count: " << count << std::endl;}
};int main() {Counter myCounter;// 使用前置自增运算符++myCounter;myCounter.display();// 使用后置自增运算符Counter anotherCounter = myCounter++;myCounter.display();anotherCounter.display();return 0;
}
剩下的内容,在下面三篇文章中写的比较详细:
c++ 运算符重载
c++ 继承和派生
c++ 多态和虚函数
相关文章:
C++ 考前难点总结
前言 后天考c,但这几天得甲流了,特别难受!复习c的时候复习着忘着,所以用csdn记录一下不熟悉的知识点,等后天考前再看一遍! 函数模板 #include <iostream>// 定义一个模板类 template <class T1…...
ARM 汇编语言知识积累
博文参考: arm中SP,LR,PC寄存器以及其它所有寄存器以及处理器运行模式介绍 arm平台根据栈进行backtrace的方法-腾讯云开发者社区-腾讯云 (tencent.com) 特殊功能寄存器: SP: 即 R13,栈指针,…...
k8s面试之——简述网络模型
kubernetes网络模型是kubernetes集群中管理容器网络通信的一种机制,用于实现pod间、pod与外部网络间的通信和互联,并提供了多种网络插件和配置选项来满足不同应用场景下的需求。kubernetes网络模型可以分为一下几个部分: 1. pod网络模型 在…...
C语言中关于if else的理解
if else我们可以理解为 if(条件1) //如果条件1成立 语句1; //执行语句1 else //如果条件1不成立 语句2; //执行语句2 这是一个经典的if els…...
Keil5软件仿真 定时器互补通道 波形输出(Logic Analyzer)
步骤一:管脚配置确认。 ①配置定时器的管脚模式为复用推挽输出模式(GPIO_MODE_AF_PP)!!!,注意:复用开漏模式软件仿真时无波形。 步骤二:编译程序。 ①点击编译按钮。 …...
华纳云:怎么实现Linux主机ssh无密码登录
实现Linux主机之间的SSH无密码登录可以通过使用SSH密钥对。以下是简单的步骤: 步骤 1: 生成SSH密钥对 打开终端,并在本地计算机上执行以下命令: ssh-keygen -t rsa 此命令将生成一对SSH密钥(公钥和私钥)。您可以选择在生成密钥时设置密码&…...
模型树实操
很多时候,数据都是有层级和分类的,使用laravel的Dcat框架,可以快速搭建一个结构清晰、且可以鼠标拖拽排序的后台;先上例子更直观: 这里是Dcat的模型树使用文档,戳一下; 重点注意事项有&#x…...
html table+css实现可编辑表格
要实现可编辑的 HTML 表格,你可以使用 JavaScript 和 HTML5 的 contenteditable 属性。 <!DOCTYPE html> <html> <head><style>table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid black;padding: 8px;text-align:…...
c语言:计算1+2+3……+n的和|练习题
一、题目 输入一个数n,计算123……n的和 二、代码截图【带注释】 三、源代码【带注释】 #include int main() { int num0; printf("请输入要运算的数:"); scanf("%d",&num); sumResult(num);//相加结果函数 } //计算打印…...
Yolov5水果分类识别+pyqt交互式界面
Yolov5 Fruits Detector Yolov5 是一种先进的目标检测算法,可以应用于水果分类识别任务。结合 PyQT 框架,可以创建一个交互式界面,使用户能够方便地上传图片并获取水果分类结果。以下将详细阐述 Yolov5 水果分类识别和 PyQT 交互式界面的实现…...
正式环境和sandbox中的RecordTypeId不一样应该怎么办
如果在 Salesforce 正式环境和 Sandbox 中,RecordTypeId 不一样,通常需要在代码或配置中进行适配,以确保代码在不同环境中的兼容性。以下是一些常见的方法: 使用自定义设置或自定义标签: 创建自定义设置或自定义标签来…...
7种常见的网络安全设备及其功能
网络安全设备在现代网络环境中起着至关重要的作用,帮助保护个人和组织免受恶意攻击。本文将介绍7种常见的网络安全设备,包括防火墙、入侵检测系统、反病毒软件、数据加密设备、虚拟私人网络、安全信息和事件管理系统以及网络访问控制设备,并详…...
vue3实现pinia仓库状态持久化
使用 pinia-plugin-persistedstate 实现pinia仓库状态持久化 安装 pnpm i pinia-plugin-persistedstate # or npm i pinia-plugin-persistedstate # or yarn add pinia-plugin-persistedstatemain.ts引入 import persist from pinia-plugin-persistedstate const app creat…...
Node.js(三)-模块的加载机制
1. 优先从缓存中加载 模块在第一次加载后会被缓存,这就意味着多次调用require()不会导致模块的代码被执行多次。 注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率. 2. 内置模块的加…...
函数
1、概述 1.1、函数分类 1)系统函数(库函数) 2)用户定义函数 1.2、函数的作用 降低代码重复率让程序更加模块化,利于阅读、修改和完善 1.3、函数的调用:随机数 函数调用 5 要素: 头文件&…...
第四周:机器学习知识点回顾
前言: 讲真,复习这块我是比较头大的,之前的线代、高数、概率论、西瓜书、樱花书、NG的系列课程、李宏毅李沐等等等等…那可是花了三年学习佳实践下来的,现在一想脑子里就剩下几个名词就觉得废柴一个了,朋友们有没有同感…...
韩版传奇 2 源码分析与 Unity 重制(一)服务端 TCP 状态管理
专题介绍 该专题将会分析 LOMCN 基于韩版传奇 2,使用 .NET 重写的传奇源码(服务端 + 客户端),分析数据交互、状态管理和客户端渲染等技术,此外笔者还会分享将客户端部分移植到 Unity 和服务端用现代编程语言重写的全过程。 相关资料 官方论坛: https://www.lomcn.org/fo…...
python编程(2)之灯光秀的按钮
今天小编带领大家开始学习python编程的第二节,灯关秀的按钮。 按键在后续的学习和开发过程中,都是很重要的内容,是帮助我们获取外界信息的基础通道,识别按键的方式,在上节的内容给大家介绍了,大家可以进行学…...
pandas将dataframe列中的list转换为多列
在应用机器学习的过程中,很大一部分工作都是在做数据的处理,一个非常常见的场景就是将一个list序列的特征数据拆成多个单独的特征数据。 比如数据集如下所示: data [[John, 25, Male,[99,100,98]],[Emily, 22, Female,[97,99,98]],[Michae…...
小巧的Windows Memory Cleaner内存清理工具-释放内存,提升电脑的性能-供大家学习研究参考
软件介绍 Windows Memory Cleaner是一款非常不错的内存清理工具大小仅200KB,这款免费的 RAM 清理器使用本机 Windows 功能来清理内存区域,帮助用户释放内存,提升电脑的性能,有时程序不会释放分配的内存,从而使计算机变…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
