当前位置: 首页 > news >正文

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&#xff0c;但这几天得甲流了&#xff0c;特别难受&#xff01;复习c的时候复习着忘着&#xff0c;所以用csdn记录一下不熟悉的知识点&#xff0c;等后天考前再看一遍&#xff01; 函数模板 #include <iostream>// 定义一个模板类 template <class T1…...

ARM 汇编语言知识积累

博文参考&#xff1a; arm中SP&#xff0c;LR&#xff0c;PC寄存器以及其它所有寄存器以及处理器运行模式介绍 arm平台根据栈进行backtrace的方法-腾讯云开发者社区-腾讯云 (tencent.com) 特殊功能寄存器&#xff1a; SP&#xff1a; 即 R13&#xff0c;栈指针&#xff0c;…...

k8s面试之——简述网络模型

kubernetes网络模型是kubernetes集群中管理容器网络通信的一种机制&#xff0c;用于实现pod间、pod与外部网络间的通信和互联&#xff0c;并提供了多种网络插件和配置选项来满足不同应用场景下的需求。kubernetes网络模型可以分为一下几个部分&#xff1a; 1. pod网络模型 在…...

C语言中关于if else的理解

if else我们可以理解为 if(条件1) //如果条件1成立 语句1&#xff1b; //执行语句1 else //如果条件1不成立 语句2; //执行语句2 这是一个经典的if els…...

Keil5软件仿真 定时器互补通道 波形输出(Logic Analyzer)

步骤一&#xff1a;管脚配置确认。 ①配置定时器的管脚模式为复用推挽输出模式&#xff08;GPIO_MODE_AF_PP&#xff09;&#xff01;&#xff01;&#xff01;&#xff0c;注意&#xff1a;复用开漏模式软件仿真时无波形。 步骤二&#xff1a;编译程序。 ①点击编译按钮。 …...

华纳云:怎么实现Linux主机ssh无密码登录

实现Linux主机之间的SSH无密码登录可以通过使用SSH密钥对。以下是简单的步骤&#xff1a; 步骤 1: 生成SSH密钥对 打开终端&#xff0c;并在本地计算机上执行以下命令&#xff1a; ssh-keygen -t rsa 此命令将生成一对SSH密钥(公钥和私钥)。您可以选择在生成密钥时设置密码&…...

模型树实操

很多时候&#xff0c;数据都是有层级和分类的&#xff0c;使用laravel的Dcat框架&#xff0c;可以快速搭建一个结构清晰、且可以鼠标拖拽排序的后台&#xff1b;先上例子更直观&#xff1a; 这里是Dcat的模型树使用文档&#xff0c;戳一下&#xff1b; 重点注意事项有&#x…...

html table+css实现可编辑表格

要实现可编辑的 HTML 表格&#xff0c;你可以使用 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&#xff0c;计算123……n的和 二、代码截图【带注释】 三、源代码【带注释】 #include int main() { int num0; printf("请输入要运算的数:"); scanf("%d",&num); sumResult(num);//相加结果函数 } //计算打印…...

Yolov5水果分类识别+pyqt交互式界面

Yolov5 Fruits Detector Yolov5 是一种先进的目标检测算法&#xff0c;可以应用于水果分类识别任务。结合 PyQT 框架&#xff0c;可以创建一个交互式界面&#xff0c;使用户能够方便地上传图片并获取水果分类结果。以下将详细阐述 Yolov5 水果分类识别和 PyQT 交互式界面的实现…...

正式环境和sandbox中的RecordTypeId不一样应该怎么办

如果在 Salesforce 正式环境和 Sandbox 中&#xff0c;RecordTypeId 不一样&#xff0c;通常需要在代码或配置中进行适配&#xff0c;以确保代码在不同环境中的兼容性。以下是一些常见的方法&#xff1a; 使用自定义设置或自定义标签&#xff1a; 创建自定义设置或自定义标签来…...

7种常见的网络安全设备及其功能

网络安全设备在现代网络环境中起着至关重要的作用&#xff0c;帮助保护个人和组织免受恶意攻击。本文将介绍7种常见的网络安全设备&#xff0c;包括防火墙、入侵检测系统、反病毒软件、数据加密设备、虚拟私人网络、安全信息和事件管理系统以及网络访问控制设备&#xff0c;并详…...

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. 优先从缓存中加载 模块在第一次加载后会被缓存&#xff0c;这就意味着多次调用require()不会导致模块的代码被执行多次。 注意:不论是内置模块、用户自定义模块、还是第三方模块&#xff0c;它们都会优先从缓存中加载&#xff0c;从而提高模块的加载效率. 2. 内置模块的加…...

函数

1、概述 1.1、函数分类 1&#xff09;系统函数&#xff08;库函数&#xff09; 2&#xff09;用户定义函数 1.2、函数的作用 降低代码重复率让程序更加模块化&#xff0c;利于阅读、修改和完善 1.3、函数的调用&#xff1a;随机数 函数调用 5 要素&#xff1a; 头文件&…...

第四周:机器学习知识点回顾

前言&#xff1a; 讲真&#xff0c;复习这块我是比较头大的&#xff0c;之前的线代、高数、概率论、西瓜书、樱花书、NG的系列课程、李宏毅李沐等等等等…那可是花了三年学习佳实践下来的&#xff0c;现在一想脑子里就剩下几个名词就觉得废柴一个了&#xff0c;朋友们有没有同感…...

韩版传奇 2 源码分析与 Unity 重制(一)服务端 TCP 状态管理

专题介绍 该专题将会分析 LOMCN 基于韩版传奇 2,使用 .NET 重写的传奇源码(服务端 + 客户端),分析数据交互、状态管理和客户端渲染等技术,此外笔者还会分享将客户端部分移植到 Unity 和服务端用现代编程语言重写的全过程。 相关资料 官方论坛: https://www.lomcn.org/fo…...

python编程(2)之灯光秀的按钮

今天小编带领大家开始学习python编程的第二节&#xff0c;灯关秀的按钮。 按键在后续的学习和开发过程中&#xff0c;都是很重要的内容&#xff0c;是帮助我们获取外界信息的基础通道&#xff0c;识别按键的方式&#xff0c;在上节的内容给大家介绍了&#xff0c;大家可以进行学…...

pandas将dataframe列中的list转换为多列

在应用机器学习的过程中&#xff0c;很大一部分工作都是在做数据的处理&#xff0c;一个非常常见的场景就是将一个list序列的特征数据拆成多个单独的特征数据。 比如数据集如下所示&#xff1a; data [[John, 25, Male,[99,100,98]],[Emily, 22, Female,[97,99,98]],[Michae…...

小巧的Windows Memory Cleaner内存清理工具-释放内存,提升电脑的性能-供大家学习研究参考

软件介绍 Windows Memory Cleaner是一款非常不错的内存清理工具大小仅200KB&#xff0c;这款免费的 RAM 清理器使用本机 Windows 功能来清理内存区域&#xff0c;帮助用户释放内存&#xff0c;提升电脑的性能&#xff0c;有时程序不会释放分配的内存&#xff0c;从而使计算机变…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...