C++其他语法总结

  • 目录
    • 《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的所有权
      在这里插入图片描述
  • 自我模拟实现智能指针
    在这里插入图片描述


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

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

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

相关文章

【前端素材】bootstrap5实现绿色果蔬电商Frutin

一、需求分析 绿色果蔬电商网站是指专门提供绿色、有机、天然果蔬产品在线销售的电子商务平台。这类网站通常提供以下功能&#xff1a; 产品展示和搜索&#xff1a;网站上展示各种绿色果蔬产品的图片、描述、产地等信息。用户可以通过搜索功能查找特定的果蔬产品或根据分类浏览…

我的年度总结(大一程序员的自述)

呀哈喽&#xff0c;我是结衣。 我也来参加这个年度总结的话题咯&#xff0c;喜欢的话可以点个赞哦。 作为一个大一新生&#xff0c;我从1级的编程小白到了现在的2级编程小白。在7月份之前我可以说是完全不了解编程的一位新人&#xff0c;对应电脑的了解也就只会打游戏看电视和浏…

66、python - 代码仓库介绍

上一节,我们可以用自己手写的算法以及手动搭建的神经网络完成预测了,不知各位同学有没有自己尝试来预测一只猫或者一只狗,看看准确度如何? 本节应一位同学的建议,来介绍下 python 代码仓库的目录结构,以及每一部分是做什么? 我们这个小课的代码实战仓库链接为:cv_lea…

安达发|APS排程系统之产品工艺约束

在制造业中&#xff0c;生产计划和排程是至关重要的环节。为了提高生产效率、降低成本并满足客户需求&#xff0c;企业需要采用先进的生产计划和排程系统。APS&#xff08;Advanced Planning and Scheduling&#xff0c;高级计划与排程&#xff09;系统是一种集成了多种先进技术…

设计模式-规格模式

设计模式专栏 模式介绍模式特点应用场景规格模式和策略模式的区别和联系代码示例Java实现规格模式Python实现规格模式 规格模式在spring中的应用 模式介绍 规格模式&#xff08;Specification Pattern&#xff09;是一种行为设计模式&#xff0c;其目的是将业务规则封装成可重…

[后端] 微服务的前世今生

微服务的前世今生 整体脉络: 单体 -> 垂直划分 -> SOA -> micro service 微服务 -> services mesh服务网格 -> future 文章目录 微服务的前世今生单一应用架构特征优点&#xff1a;缺点&#xff1a; 垂直应用架构特征优点缺点 SOA 面向服务架构特征优点缺点 微服…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷④

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷4 模块一 …

Every Nobody Is Somebody 「每小人物都能成大事」

周星驰 NFT Nobody即将发售&#xff0c;Nobody共创平台 Every Nobody Is Somebody Nobody 关于Nobody&#xff1a;Nobody是一款Web3共创平台&#xff0c;旨在为创作者提供一个交流和合作的场所&#xff0c;促进创意的产生和共享。通过该平台&#xff0c;创作者可以展示自己的作…

在群晖NAS上搭建私有部署笔记软件——Blossom

一、Blossom 简介 Blossom 是一个需要私有部署的笔记软件&#xff0c;虽然本身定位是一个云端软件&#xff0c;但你仍然可以在本地部署&#xff0c;数据和图片都将保存在本地&#xff0c;不依赖任何的图床或者对象存储。 Blossom | Blossom (wangyunf.com)https://www.wangyun…

【教学类-45-01】X-Y之间的“三连加“题(a+b+c=)

作品展示&#xff1a; 背景需求&#xff1a; 我常去的大4班孩子们基本都适应了0-5之间的加法题&#xff0c;做题速度极快。 为了增加“花样”&#xff0c;吸引幼儿参与&#xff0c;修改参数&#xff0c;从二连加12变为三连加111。 素材准备: 代码重点 代码展示 X-Y 之间的3…

备战2024美赛数学建模,文末获取历史优秀论文

总说&#xff08;历年美赛优秀论文可获取&#xff09; 数模的题型千变万化&#xff0c;我今天想讲的主要是一些「画图」、「建模」、「写作」和「论文结构」的思路&#xff0c;这些往往是美赛阅卷官最看重的点&#xff0c;突破了这些点&#xff0c;才能真正让你的美赛论文更上…

计算机图形学流体模拟 blender 渲染脚本

做流体模拟的时候&#xff0c;想要复现别人的成果&#xff0c;但是别人的代码都是每帧输出 ply 格式的文件&#xff0c;渲染部分需要自己完成 看了一下&#xff0c;似乎用 blender 是最简单的&#xff0c;于是记录一下过程中用到的代码 Blender 版本 4.0 批量导入 ply 假设…

Federated Unlearning for On-Device Recommendation

WSDM 2023 CCF-B Federated Unlearning for On-Device Recommendation 本文工作的主要介绍 本文主要介绍了一种名为FRU&#xff08;Federated Recommendation Unlearning&#xff09;的联邦学习框架&#xff0c;用于在设备端的推荐系统中实现用户数据的有效擦除和模型重建。…

专业课128分总分400+南京理工大学818信号系统与数字电路南理工考研经验分享

专业课128分总分400南京理工大学818信号系统与数字电路南理工电光院考研经验分享&#xff0c;希望自己的经历对大家有借鉴。 我是在六月底确认自己保不上研然后专心备考的&#xff0c;时间确实比较紧张。虽然之前暑假看了一点高数&#xff0c;但因为抱有保研的期望&#xff0c…

JMeter之Windows安装

JMeter之Windows安装 一、安装JDK二、安装JMeter1、下载JMeter2、配置环境变量3、验证JMeter 三、扩展知识1、汉化 一、安装JDK 略 二、安装JMeter 1、下载JMeter 官网地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 放到本地目录下 2、配置环境变量 变量…

探索浏览器的内心世界:渲染机制的奥秘

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

im6ull学习总结(三-4)freetype显示单个字体

矢量字体引入 使用点阵字库显示英文字母、汉字时&#xff0c;大小固定&#xff0c;如果放大缩小则会模糊甚至有锯齿出现&#xff0c;为了解决这个问题&#xff0c;引用矢量字体。 矢量字体形成分三步&#xff1a; 第1步 确定关键点&#xff0c; 第2步 使用数学曲线&#xff08…

软件测试|Windows系统配置pytest+allure环境教程

前言 allure可以输出非常精美的测试报告&#xff0c;也可以和pytest进行完美结合&#xff0c;不仅可以渲染页面&#xff0c;还可以控制用例的执行。本文我们将介绍Windows系统中如何配置allure环境。 第一步&#xff1a;配置Java环境 因为allure的运行依赖于Java环境&#x…

Java中CompletableFuture 异步编排的基本使用

一、前言 在复杂业务场景中&#xff0c;有些数据需要远程调用&#xff0c;导致查询时间缓慢&#xff0c;影响以下代码逻辑运行&#xff0c;并且这些浪费时间的逻辑与以后的请求并没有关系&#xff0c;这样会大大增加服务的时间。 假如商品详情页的每个查询&#xff0c;需要如下…

2024年3月10日PMI认证考试的报名时间确定!

⏰中国大陆地区2024年第1期PMI认证考试于3月10日举办 ⏰报名时间&#xff1a; 为减少同一时间集中报名造成的网络拥堵&#xff0c;本次报名将采取以下形式分地区、分批次开放报名。&#x1f447; 1️⃣第1批报名城市&#xff1a;⏰2024年1月11日10:00至1月18日16:00&#xff0c…