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


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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

已安装MySQL5.7的基础上安装MySQL8教程

类似文章很多&#xff0c;但部分问题解决方案并不是很完整&#xff0c;且对细节描述不够清楚&#xff0c;特意总结一篇 在本机已经安装MySQL5.7的情况下新安装MySQL8.x的方案如下&#xff08;请按照步骤详细操作&#xff09;&#xff1a; 1.进入官网下载 https://dev.mysql.c…

大数据 MapReduce如何让数据完成一次旅行?

专栏上一期我们聊到MapReduce编程模型将大数据计算过程切分为Map和Reduce两个阶段&#xff0c;先复习一下&#xff0c;在Map阶段为每个数据块分配一个Map计算任务&#xff0c;然后将所有map输出的Key进行合并&#xff0c;相同的Key及其对应的Value发送给同一个Reduce任务去处理…

单调栈练习(二)— 柱状图中最大的矩形

题目&#xff1a; 这是一道LeetCode上的原题&#xff1a;链接地址 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 思路 因为是力扣原题&#xff0c;所…

Copilot 插件的使用介绍:如何快速上手

GitHub Copilot 本文主要介绍如何通过脚本工具激活 GitHub Copilot 插件&#xff0c;提供安装及激活图文教程&#xff0c;大家按下面操作即可激活GitHub Copilot插件&#xff0c;免费使用Ai编码工具 一、GitHub Copilot 介绍 GitHub Copilot 是由 GitHub 和 OpenAI 共同开发的…

49寸OLED拼接屏:技术、应用与市场前景

作为“49寸OLED拼接屏”技术总监&#xff0c;我深知这一产品对于显示行业的重要性。随着显示技术的不断进步&#xff0c;OLED拼接屏在高端显示市场占据了一席之地。下面&#xff0c;我将从技术的角度深入剖析这一产品。 一、参数 49寸OLED拼接屏是一款高端大屏显示产品&#x…

大数据Doris(五十二):SQL函数之数学函数

文章目录 SQL函数之数学函数 一、abs(double a)

海外社媒运营为什么需要选择优质IP代理?

跨境电商卖家尤其需要关注海外社媒运营&#xff0c;想要更好地运营Instagram、Facebook、TikTok 或 Twitter等&#xff0c;挖掘社媒潜力需要采取战略方法&#xff0c;而社交媒体IP代理在这一活动中发挥着至关重要的作用&#xff0c;下面为你详细介绍。 一、社交媒体代理IP及其运…

Prometheus Blackbox_exporter笔记

一、安装Promtheus 在 Prometheus 官网 Download | Prometheus 获取适用于 Linux 的 Prometheus 安 装包&#xff0c;这里我选择最新的 2.46.0 版本&#xff0c;我是 Linux 系统&#xff0c;选择下载 prometheus-2.46.0.linux-amd64.tar.gz 下载安装包&#xff1a; wget htt…

JS 作用域和预解析

作用域 通常来说&#xff0c;一段程序代码中所用到的名字并不总是有效和可用的&#xff0c;而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性&#xff0c;增强了程序的可靠性&#xff0c;减少了名字冲突。 作用域分为全局作用域和局…

Win10 自带微软输入法怎么切换成简体字 快捷鍵是什么?

环境&#xff1a; Win10专业版 问题描述&#xff1a; 微軟輸入法怎麽切換中文簡體 快捷鍵&#xff0c;之前不小心按了快捷键 解决方案&#xff1a; 1.按CtrlShiftF快捷键转换简体字或繁体字 2.可以在“设置-时间和语言-区域和语言-语言-中文&#xff08;中华人民共和国&a…

最全最详细ChatGPT预设词Prompt教程

使用指南 1、可直复制使用 2、可以前往已经添加好Prompt预设的AI系统测试使用&#xff08;可自定义添加使用&#xff09; https://ai.sparkaigf.com 雅思写作考官 我希望你假定自己是雅思写作考官&#xff0c;根据雅思评判标准&#xff0c;按我给你的雅思考题和对应答案给我…

小H靶场笔记:DC-6

DC-6 January 6, 2024 12:06 PM Tags: nmap提权&#xff0c;WordPress Owner&#xff1a;只惠摸鱼 信息收集 apr-scan和nmap探测主机后&#xff0c;发现靶机ip&#xff1a;192.168.199.136&#xff0c;端口22和80开放 扫描端口服务、版本、操作系统、默认脚本扫描 扫描开…