C++其他语法总结

news2024/11/16 6:58:16
  • 目录
    • 《C++基础语法总结》
    • 《C++面向对象语法总结(一)》
    • 《C++面向对象语法总结(二)》
    • 《C++面向对象语法总结(三)》

一、运算符重载

  • 运算符重载可以为运算符增加一些新的功能
  • 全局函数、成员函数都支持运算符重载
  • 常用的运算符重载示例
class Point {
	// friend Point operator+(const Point &, const Point &);
	friend ostream &operator<<(ostream &, const Point &);
	friend istream &operator>>(istream &cin, Point &point);
	int m_x;
	int m_y;
public:
	Point(int x, int y) :m_x(x), m_y(y) {}
	void display() {
		cout << "(" << m_x << ", " << m_y << ")" << endl;
	}
	Point(const Point &point) {
		m_x = point.m_x;
		m_y = point.m_y;
	}

	const Point operator+(const Point &point) const {
		return Point(m_x + point.m_x, m_y + point.m_y);
	}

	const Point operator-(const Point &point) const {
		return Point(m_x - point.m_x, m_y - point.m_y);
	}

	Point &operator+=(const Point &point) {
		m_x += point.m_x;
		m_y += point.m_y;
		return *this;
	}

	bool operator==(const Point &point) const {
		return (m_x == point.m_x) && (m_y == point.m_y);
	}

	bool operator!=(const Point &point) const {
		return (m_x != point.m_x) || (m_y != point.m_y);
	}

	const Point operator-() const {
		return Point(-m_x, -m_y);
	}

	// 前置++
	Point &operator++() {
		m_x++;
		m_y++;
		return *this;
	}

	// 后置++
	const Point operator++(int) {
		Point old(m_x, m_y);
		m_x++;
		m_y++;
		return old;
	}
};

// output stream -> ostream
ostream &operator<<(ostream &cout, const Point &point) {
	cout << "(" << point.m_x << ", " << point.m_y << ")";
	return cout;
}

// input stream -> istream
istream &operator>>(istream &cin, Point &point) {
	cin >> point.m_x;
	cin >> point.m_y;
	return cin;
}
  • 子类调用父类的运算符重载函数:需要指定类名
    在这里插入图片描述
  • 单例模式中,可以将=号重载成为私有的,这样可以避免被重新赋值
    在这里插入图片描述
  • 运算符重载的注意事项
    • 有些运算符不可以被重载,比如
      • 对象成员访问符号:.
      • 域运算符:::
      • 三目运算符: ? :
      • sizeof
    • 有些运算符只能重载为成员函数,比如:
      • 赋值运算符:=
      • 下表运算符:[]
      • 函数运算符:()
      • 指针访问成员:->

二、仿函数

  • 仿函数:将一个对象当作一个函数一样来使用
  • 对比普通函数,它作为对象可以保存状态
    在这里插入图片描述

三、模板(template)

  • 泛型,是一种将类型参数化以达到代码复用的技术,C++中使用模板来实现泛型
  • 模板的使用格式如下:
    • template <typename\class T>
    • typename和class是等价的
  • 模板没有被使用时,是不会被实例化出来的,在编译时如果有几次不同类型的调用,编译器就会实现多少类的模板
  • 模板的声明和实现如果分离到.h和.cpp文件中,会导致链接错误,一般将模板的声明和实现统一放到一个.hpp文件中
  • 函数模板的实现如下:
    在这里插入图片描述
  • 多参数模板如下:
    在这里插入图片描述
  • 类模板示例如下:
    在这里插入图片描述
  • 类模板中的友元函数如下:
    在这里插入图片描述

四、类型转换

  • c语言风格的类型转换

    • (type)expression
    • type(expression)
  • c++中有4个类型转换符(适用格式:xxx_cast(expression)

    • static_cast
    • dynamic_cast
    • reinterpret_case
    • const_case
  • const_cast:一般用于去除const属性,将const转换成非const
    在这里插入图片描述

  • dynamic_cast:一般用于多态类型的转换,有运行时安全检测,会将不安全的转换设置为null
    在这里插入图片描述

  • static_cast:

    • 对比dynamic_cast,缺乏运行时安全监测
    • 不能交叉转换(不是同一继承体系的,无法转换)
    • 常用于基本数据类型的转换、非const转成const
    • 适用范围较广
      在这里插入图片描述
  • reinterpret_cast

    • 属于比较底层的强制转换,没有任何类型检查和格式转换,仅仅是简单的二进制数据拷贝
    • 可以交叉转换
    • 可以将指针和整数互相转换
      在这里插入图片描述

五、c++ 11新特性

  • auto

    • 可以从初始化表达式中推断出变量的类型,大大简化编程工作
    • 属于编译器特性,不影响最终的机器码质量,不影响运行效率
      在这里插入图片描述
  • decltype :可以获取变量的类型
    在这里插入图片描述

  • nullptr:可以解决NULL的二义性问题
    在这里插入图片描述

  • 快速便利
    在这里插入图片描述

  • 更简洁的初始化
    在这里插入图片描述

六、Lambda表达式

  • 有点类似于javascript中的闭包,IOS中的Block,本质就是函数
  • 完整结构:[capture list] (params list) mutable exception ->return type { function body }
    • capture list:捕获外部变量列表
    • params list:形参列表,不能使用默认参数,不能省略参数名
    • mutable:用来说明是否可以修改捕获的变量
    • exception:异常设定
    • return type:返回值类型
    • function body:函数体
  • 有时可以省略部分结构:不能省略[],因为[]是lambda表达式的标志
    • [capture list] (params list) ->return type { function body }
    • [capture list] (params list) -> { function body }
    • [capture list] {function body}
  • lambda表达式示例
    • 定义一个lambda表达式变量,后期使用
      在这里插入图片描述
      在这里插入图片描述
    • 将lambda表达式直接执行
      在这里插入图片描述
    • 将lambda表达式当作函数实参传递
      在这里插入图片描述
  • lambda表达式-外部变量捕获示例
    在这里插入图片描述
  • lambda表达式-mutable
    在这里插入图片描述

七、异常

  • 异常是一种在程序运行的过程中可能会发生的错误

  • 异常没有被处理,会导致程序终止

  • c++中的异常可以被try…catch…,但是没有finally

  • throw异常后,会在当前函数中查找匹配的catch,找不到就终止当前函数代码,去上一层函数中查找。如果最终找不到匹配的catch,整个程序就会终止
    在这里插入图片描述

  • 异常的抛出声明:为了增强可读性和方便团队协作,如果函数内部可能会抛出异常,建议函数声明一下异常类型
    在这里插入图片描述

  • 自定义异常类型
    在这里插入图片描述

  • 拦截所有异常类型
    在这里插入图片描述

  • 标准异常(std中定义的标准异常)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

八、智能指针

  • 智能指针就是在指针变量销毁时自动释放指向对象的内存(会调用类的析构函数)

  • 传统指针存在的问题

    • 需要手动管理内存
    • 容易发生内存泄漏(忘记释放、出现异常等)
    • 释放后产生野指针
  • 智能指针就是为了解决传统指针存在的问题

    • auto_ptr:属于c++98标准,在c++11中已经不推荐使用(有缺陷,比如不能用于数组等)
    • shared_ptr:属于C++11标准
    • unique_ptr:属于C++11标准
  • shared_ptr:共享指针

    • shared_ptr的设计理念:多个shared_ptr可以指向同一个对象,当最后一个shared_prt在作用域范围内结束时,对象才会被释放

    • 可以通过一个已存在的智能指针初始化一个新的智能指针
      在这里插入图片描述

    • 在数组中的用法如下:
      在这里插入图片描述

    • shared_ptr的原理

      • 一个shared_ptr会对对象产生强引用(strong reference)
      • 每个对象都有个与之对应的强应用计数器,记录着当前对象被多少个shared_ptr强引用着。
      • 可以通过shared_ptr的use_count函数获得强引用计数器
      • 当有一个新的shared_ptr指向对象时,对象的强引用计数就会+1
      • 当有一个shared_ptr销毁时,对象的强引用计数就会-1
      • 当一个对象的强引用计数为0时,对象就会自动销毁(析构)
    • shared_ptr的循环引用:智能指针指向的对象不会被销毁,导致内存泄漏
      在这里插入图片描述

  • weak_ptr:弱指针

    • weak_ptr会对一个对象产生弱引用
    • weak_ptr可以指向对象解决shared_ptr的循环引用问题
      在这里插入图片描述
      在这里插入图片描述
  • unique_ptr:唯一引用

    • unique_ptr也会对一个对象产生强引用,它可以确保同一时间只有1个指针指向对象
    • 当unique_ptr销毁时,其指向的对象也会自动销毁
    • 可以使用std::move函数转移unique_ptr的所有权
      在这里插入图片描述
  • 自我模拟实现智能指针
    在这里插入图片描述


后记
  个人总结,欢迎转载、评论、批评指正

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

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

相关文章

Python私有变量的定义与访问

class Student():def __init__(self, name, age):self.name nameself.age ageself.__score 0def marking(self, score):if score < 0:return 分数不能为0self.__score scoreprint(self.name 同学本次得分是: str(self.__score)) def __talk(self): # 私有的类可通过在…

qss设置某一个widget下的Checkbox的样式

#ObjectName 控件名称{属性&#xff1a;值&#xff1b;属性1&#xff1a;值1} 如下&#xff1a; 效果&#xff1a;

【大数据】分布式协调系统 Zookeeper

分布式协调系统 Zookeeper 1.Zookeeper 的特点2.Zookeeper 的数据结构3.Zookeeper 的应用场景3.1 统一命名服务3.2 统一配置管理3.3 统一集群管理3.4 服务器动态上下线3.5 软负载均衡 Zookeeper 是 Apache 开源的一个顶级项目&#xff0c;目的是为分布式应用提供协调服务&#…

910b上跑Chatglm3-6b进行流式输出【pytorch框架】

文章目录 准备阶段避坑阶段添加代码结果展示 准备阶段 配套软件包Ascend-cann-toolkit和Ascend-cann-nnae适配昇腾的Pytorch适配昇腾的Torchvision Adapter下载ChatGLM3代码下载chatglm3-6b模型&#xff0c;或在modelscope里下载 避坑阶段 每个人的服务器都不一样&#xff0…

01-连接池项目背景:C++的数据库操作

从0开始学习C与数据库的联动 1.原始方式-使用MySQL Connector/C 提供的API查询 1.1 数据库预操作 我的本地电脑上有mysql数据库&#xff0c;里面预先创建了一个database名叫chat&#xff0c;用户名root&#xff0c;密码password。 1.2 Visual Studio预操作 在Windows上使用…

分析一个项目(微信小程序篇)一

分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够知道每个组件所处在哪个位置&#xff0c;发挥什么作用。 本次所介绍的是微信小程序项目&#xff08;甑选商场&#xff09;&#xff1a; 其首页…

深度解析HubSpot数据分析:洞察未来商业趋势

在当今数字化的商业环境中&#xff0c;数据是推动决策和业务增长的关键。作为业内领先的CRM平台&#xff0c;HubSpot不仅为企业提供了高效的客户关系管理工具&#xff0c;同时也成为了数据分析的利器。 1. HubSpot数据分析的核心价值 1.1 洞察客户行为和趋势 HubSpot数据分析…

【SkyWant.[2304]】路由器操作系统,移动【Netkeeper】使用教程校园网

目录 步骤一&#xff1a;正确连接网线&#xff0c;插电开机正确连接网线&#xff1a; 认识系统灯&#xff1a; 插电开机&#xff1a; 步骤二&#xff1a;开机之后&#xff0c;系统的基本设置 1.进入设置界面&#xff1a; 2.设置辅助热点wifi&#xff1a; 3.设置日常…

domain adapation

假设测试资料和训练资料分布不一样&#xff0c; 训练为黑白数字&#xff0c;测试为彩色数字时&#xff0c;识别率很低 称之为 Domain shift Domain adaptation : 可以看做 transfer 的一种 输出分布也有可能不一样 target domain 有部分数据&#xff0c;但是无标签 分布也不…

css中的变量和辅助函数

变量 --name 两个破折号加变量名称&#xff08;可以在当前的选择器内定义&#xff09;var(--*) 命名规则 body {--深蓝: #369;background-color: var(--深蓝); } 变量值只能做用属性值&#xff0c;不能用做属性名。变量命名不能包含 $,[,^,(,% 等字符 普通字符局限在只要是数…

如何快速编写高效的测试用例? -5个建议让你的测试更准确、更全面

逛知乎的时候&#xff0c;经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力理论及经验加持。 但这并不意味着…

【每日论文阅读】Do Perceptually Aligned Gradients Imply Robustness?

近似人眼梯度 https://icml.cc/virtual/2023/oral/25482 对抗性鲁棒分类器具有非鲁棒模型所没有的特征——感知对齐梯度&#xff08;PAG&#xff09;。它们相对于输入的梯度与人类的感知非常一致。一些研究已将 PAG 确定为稳健训练的副产品&#xff0c;但没有一篇研究将其视为…

windows同时安装mysql5.0和8.0步骤(完美测试)

mysql5.0和mysql8.0配置如下 1.把如下配置复制下替换到my.ini中 mysql5.0配置如下 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirF:\mysql-5.7.38 # 设置mysql数据库的数据的存放目录 datadirF:\mysql-5.7.38\data # 允许最大连接数 max_connections200 #…

串口乱码原因

开发板上外部时钟的晶振与代码中的外部时钟的晶振不一致&#xff0c;使用cubemx配置时钟时要格外注意&#xff0c;选好芯片之后再看外部晶振是啥&#xff0c;不然随便设置可能乱码 重写fputc函数之后&#xff0c;需要自己手动勾选下面选项

【Linux系统编程二十七】:线程的互斥与同步(互斥锁的使用与应用)

【Linux系统编程二十七】&#xff1a;线程的互斥与同步(互斥锁的使用与应用&#xff09; 一.问题:数据不一致(混乱/不安全)1.多线程并发计算不安全2.将数据加载到寄存器的本质 二.解决方法--互斥锁三.互斥锁的概念与接口1.定义锁2.加锁/解锁 四.互斥锁实现原理与应用1.原理&…

AArch64 Exception Model学习

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网文档为准。 1 Privilege and Exception Levels 1.1 为什么要划分权限&#xf…

swaggerUI不好用,试试这个openapiUI?

title: swaggerUI不好用&#xff0c;试试这个openapiUI? date: 2024-01-08 categories: [tool] tags: [openapi,工具] description: 基于swaggger2, openapi3规范的UI文档 1.背景 由于长期使用 swaggerUI 工具&#xff0c;它的轻量风格个人觉得还是不错的&#xff0c;但是它…

npm v10.2.4 is known not to run on Node.js v14.16.1.

报错&#xff1a; ERROR: npm v10.2.1 is known not to run on Node.js v10.24.1. This version of npm supports the following node versions: ^18.17.0 || >20.5.0. You can find the latest version at https://nodejs.org/. 这种情况降级npm&#xff0c;降不了&…

目标检测-One Stage-YOLOv6

文章目录 前言一、YOLOv6的网络结构和流程二、YOLOv6的创新点总结 前言 YOLOv6 是美团视觉智能部研发的一款目标检测框架&#xff0c;致力于工业应用。论文题目是《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》。 和YOLOv4、YOLOv5等不…

Linux——firewalld防火墙(一)

一、Linux防火墙基础 Linux 的防火墙体系主要工作在网络层.针对TCP/P数据包实时过滤和限制.属于典型的包过滤防火墙&#xff08;或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现&#xff0e;具有非常稳定的性能和高效率,也因此获得广泛的应用.在CentOS 7系统中几种…