Linux 学习记录45(C++篇)

news2024/10/6 8:34:25

Linux 学习记录45(C++篇)

在这里插入图片描述

本文目录

  • Linux 学习记录45(C++篇)
  • 一、纯虚函数和抽象类
    • 1. 纯虚函数
    • 2. 抽象类
  • 二、C++中的异常处理
    • 1. 抛出异常
    • 2. 处理/捕获异常
  • 三、模板(template)
    • 1. 模板函数
      • (1. 模板函数的定义和调用
      • (2. 模板函数需要显性调用的时机
    • 2. 模板类
    • 3. 模板函数和模板类实现的机制
  • 四、C++中的类型转换
  • 五、lambda表达式
    • 1. 定义
  • 六、标准模板库
    • 1. C++中的标准模板库STL
    • 1. 标准模板库Vectors
      • (1. 常用函数
  • 思维导图

@

一、纯虚函数和抽象类

1. 纯虚函数

直接让虚函数=0就是纯虚函数

虚函数:virtual void show(){};
纯虚函数:virtual void show()=0;

纯虚函数在子类中必须重写,如果不重写,子类也不能实例化对象

2. 抽象类

含有纯虚函数的类就叫抽象类
抽象类不能被实例化

/*抽象类*/
class test
{
private:
    string str;
    int num;
public:
    /*纯虚函数*/
    virtual void show()=0;

protected:

};

class cls1:public test
{
public:
	/*必须重写纯虚函数*/
    void show();
};

int main()
{
    cls1 buf;
    buf.show();
    return 0;
}

二、C++中的异常处理

异常指:程序在运行阶段出现的问题,即没有语法错误但是存在逻辑问题
在遇到问题时可以手动抛出异常的现象(throw)

抛出异常 → 处理/捕获异常

注意事项:
1. 抛出异常的位置要放在发生异常之前
2. try...catch中存放的是所有可能发生异常的代码
3. catch可以直接通过抛出异常的类型来判断是哪一种异常情况
4. 如果同一类型有多种情况,可以在catch里,对具体获取到的异常的数值再进行判断

1. 抛出异常

void fun(int a,int b)
{
    if(b==0)
    {   /*如果除数为0即为发生异常,同时抛出异常,并且异常为cahr类型*/
        throw 'e';
    }else
    {
        cout << "a/b=" << (a/b) << endl;
    }
}

int main()
{
    fun(6,2);
    cout << "---------------" << endl;
    fun(6,0);
    cout << "---------------" << endl;
    return 0;
}

输出>>
在这里插入图片描述

2. 处理/捕获异常

try...catch

void fun(int a,int b)
{
    if(b==0)
    {
//        throw 'e';
        throw char ('e');
        /*如果除数为0即为发生异常,同时抛出异常error*/
//        throw string ("error");
    }else
    {
        cout << "a/b=" << (a/b) << endl;
    }
}

int main()
{
    try
    {
        fun(6,0);
    } catch (int)//判断抛出异常的类型
    {
        cout << "int 类型的错误" <<endl;
    } catch (char b)//判断抛出异常的类型
    {
        cout << "char 类型的错误" <<endl;
        cout << b <<endl;
    } catch (string a)//判断抛出异常的类型
    {
        /*此时a接收到的字符串就是异常抛出的字符串*/
        cout << "string 类型的错误" <<endl;
        cout << a <<endl;
    }
    return 0;
}

三、模板(template)

模板也可以实现多态,也是泛式编程的一种,实现得上静态多态

1. 模板函数

一个模板仅对一个函数生效

1. 对于同一个函数,往往可以传多个不同的数据类型,需要实现多个,使用模板函数可以解决这个问题
2. 模板函数根据调用时传的参数,来具体实现函数的功能
3. 模板函数的调用方式:1、隐式调用(不给出模板中数据类型的调用方式)。2、显式调用(调用时给出模板中的数据类型

(1. 模板函数的定义和调用

模板定义:template<typename T1,typename T2>  定义了一个模板,模板可以接收两个不同的数据类型[T1/T2]

例:

/*定义模板*/
template<typename T1,typename T2>

T1 add(T1 a,T1 b)
{
    return a+b;
}
int main()
{
    int num1=10;
    int  num2=15;
    /*显式调用*/
    cout << add<int,int>(num1,num2) << endl;
    /*显式调用*/
    cout << add<int,double>(num1,num2) << endl;
    return 0;
}
=================================================
/*定义模板*/
template<typename T1>
T1 add(T1 a,T1 b)
{
    return a+b;
}
int main()
{
    int num1=10;
    int  num2=15;    
    cout << add(num1,num2) << endl;
    return 0;
}
==============模板类型特化================
/*class表示该类型使用默认数据类型*/
template<class T1,typename T2>
T2 add(int a,T2 b)
{
    return a+b;
}
==============模板类型特化================
template<typename T1 = int,typename T2>
T2 add(int a,T2 b)
{
    return a+b;
}

(2. 模板函数需要显性调用的时机

  1. 当模板提供了两种数据类型,但是模板函数只有一种数据类型时,需要在函数调用处显性调用模板函数:函数名<数据类型1、数据类型2···>(形参) -----><>对应的是模板,()对应参数
  2. 对于实参是字符串常量,想要不强转实现函数调用,需要显性调用模板函数

2. 模板类

1. 对于同一功能的类,由于数据类型的不同,可能会出现重复定义的现象(链表中的节点)
2. 如果定义模板类,只能显性调用
3. 如果模板类中的函数,想要实现类内声明,类外定义,需要在定义函数的位置重新写一遍模板
/*定义模板*/
/*class表示该类型使用默认数据类型*/
template<typename T1>
class test
{
    T1 buf;
public:
    test()
    {}
    test(T1 a):buf(a)
    {}
    /*类内声明*/
    void show(void);

};

/*类外定义*/
template<typename T1>//再次写出模板
void test<T1>::show(void)//显性调用
{
    cout << buf << endl;
}

3. 模板函数和模板类实现的机制

二次编译/延时编译

在编译过程中,第一次遇到模板时,之进行语法分析,并不实现,在继续编译到模板调用时,会根据得到的类型,再次对模板部分的代码编译,并实现模板类和模板函数。

四、C++中的类型转换

在C++中仍然支持C语言的强制类型转换

格式:关键字<新类型>原有变量
关键字功能
const_cast将常量指针的常属性取消
static_cast类型转换,基本上所有的类型都可以使用,类似于C中的类型转换
dynamic_cast将父类指针,转换成子类指针(依托于多态实现)如果转换失败返回空地址
reinterpret_cast重新解释数据类型(不建议使用,不会检测任何类型匹配问题)

五、lambda表达式

lambda表达式多用于实现轻量级函数

lambda表达式是C++11开始支持的特性

1. 定义

定义:[]()mutable->返回值{函数体};
[捕获列表](参数列表)mutable->返回值{函数体};
1. [捕获列表]:从外部获取数据
2. (参数列表):和普通函数一致
3. {函数体}:和普通函数一致
4. 返回值
*****************************************
int main()
{
    int num1=10;
    int num2=12;

//    auto fun=[++num1,num2++]()->int{return num1+num2;};//这里捕获列表内的值默认是常量
    auto fun1=[=]()->int{return num1+num2;};//按值捕获外部所有变量
    auto fun2=[&]()->int{return num1+num2;};//按引用捕获外部所有变量
    auto fun3=[=,&num1]()->int{return num1+num2;};//引用捕获指定变量,其他变量按值捕获
    auto fun4=[&,num1]()->int{return num1+num2;};//值捕获指定变量,其他变量引用捕获
    auto fun5=[num1,num2]()->int{return num1+num2;};//值捕获指定变量

    cout << fun1() << endl;
    cout << fun2() << endl;
    cout << fun3() << endl;
    cout << fun4() << endl;
    cout << fun5() << endl;

    return 0;
}

六、标准模板库

1. C++中的标准模板库STL

(Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等.

1. 标准模板库Vectors

类似于数据结构中的顺序表 #include <vector>

Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。

(1. 常用函数

1vector();  
vector( size_type num, const TYPE &val );  
vector( const vector &from );  
vector( input_iterator start, input_iterator end );
2、求实际的大小:size_type size();
3、求最大容量:size_type capacity();
4、弹出队尾元素:void pop_back();
5、插入元素:void push_back(const TYPE &val );
6、访问:TYPE at( size_type loc );   at会检查越界问题,并且at返回的是指定位置元素的引用
7、使用insert进行插入:iterator insert( iterator loc, const TYPE &val );
8、返回第一个元素的迭代器:iterator begin();
9、清空所有元素:void clear();
10、对Vector的判空:bool empty();
11、返回起始位置的引用:TYPE front();
12、返回末尾位置的引用:TYPE back();
13、返回末尾位置下一个位置的迭代器:  iterator end();
14、对Vector中的元素赋值,使用数据范围赋值: void assign( input_iterator start, input_iterator end );

思维导图

在这里插入图片描述

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

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

相关文章

【运维】GitLab相关配置优化等

默认 Git 设置 http post 的缓存为 1MB&#xff0c;使用命令将git的缓存设为500M&#xff0c;重新配置一下postBuffer值 git config --global http.postBuffer 524288000 解决方法2&#xff1a;直接修改config参数&#xff0c; windows: ./git/config中&#xff0c;加入以下…

构建无忧:探索 Linux 项目自动化构建神器-make/Makefile

目录 一.make/Makefile的介绍1.理解make/Makefile二.make/Makefile的使用1.基本使用2.PHONY3.特殊符号拓展 一.make/Makefile的介绍 1.理解make/Makefile 编写Makefile是Linux开发中一项重要的技能&#xff0c;熟练的运用这个工具能提高编译效率&#xff0c;帮助你完成大型工…

【Java系列】Java虚拟机—类加载器介绍

什么是Java虚拟机 Java虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是一个能够执行 Java 字节码的虚拟计算机。它是 Java 技术的核心部分&#xff0c;是 Java 应用程序运行的基础。 Java 程序在编译后会生成字节码&#xff08;bytecode&#xff09;&am…

【动手学习深度学习--逐行代码解析合集】07多层感知机的简洁实现

【动手学习深度学习】逐行代码解析合集 07多层感知机的简洁实现 视频链接&#xff1a;动手学习深度学习–softmax回归简洁实现 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、代码 import torch from torch import nn from d…

uni-app crypto-js DES 加解密 ,支持app , h5,小程序

crypto-js DES 加解密 &#xff0c;支持app,h5&#xff0c;小程序 第一步 npm install crypto-js 可以直接下载示例运行&#xff0c;看控制台打印 下载地址 https://ext.dcloud.net.cn/plugin?id13351 crypto-js DES 加解密 - DCloud 插件市场

科技富豪抑郁了

原美团二当家王慧文据说抑郁了 什么能解决抑郁问题&#xff1f; 趣讲大白话&#xff1a;科技富豪也抑郁 【趣讲信息科技216期】 **************************** 王富豪创立光年之外AI公司2个月就休息了 知识解决不了抑郁问题 抑郁是现代社会一个常见的症状 是压力所带来的综合症…

牛客网Verilog刷题——VL39

牛客网Verilog刷题——VL39 题目答案 题目 设计一个自动贩售机&#xff0c;输入货币有两种&#xff0c;为0.5/1元&#xff0c;饮料价格是1.5/2.5元&#xff0c;要求进行找零&#xff0c;找零只会支付0.5元。 1、投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1&#x…

HTML-表格、表单标签

目录 表格标签 表单标签 表单项标签 表格标签 场景&#xff1a;在网页中以表格&#xff08;行、列&#xff09;形式整齐展示数据&#xff0c;如班级表标签 标签描述属性/备注<table>定义表格整体&#xff0c;可以包裹多个<tr>border:规定表格边框的宽度width&am…

盖雅劳动力管理云完成多方信创适配,打造信创产业生态

为响应国产化和信创战略需求&#xff0c;盖雅工场积极推动产品适配国产操作系统、国产数据库、国产硬件设备和国产处理器&#xff0c;不断拓展公司信创产业链技术升级。 近日&#xff0c;盖雅工场顺利完成多方信创适配&#xff0c;成功与 麒麟Kylin、鲲鹏Kunpeng、达梦数据库…

一键ai绘画怎么使用你清楚吗?

在当代科技的浪潮中&#xff0c;人工智能绘画生成器犹如一位神奇的画笔&#xff0c;以其特别的创造力&#xff0c;将数字代码转化成令人惊叹的艺术杰作。它就像是一位天才魔术师&#xff0c;能从虚无中诞生出栩栩如生的图像&#xff0c;给人们带来触动和美感。 看着这些ai绘画…

VOC数据集介绍以及读取(目标检测object detection)

VOC&#xff08;Visual Object Classes&#xff09;数据集是一个广泛使用的计算机视觉数据集&#xff0c;主要用于目标检测、图像分割和图像分类等任务。VOC数据集最初由英国牛津大学的计算机视觉小组创建&#xff0c;并在PASCAL VOC挑战赛中使用。 VOC数据集包含各种不同类别…

今晚打老虎:用katalon解决接口/自动化测试拦路虎--参数化

#全局变量 右侧菜单栏中打开profile&#xff0c;点击default&#xff0c;打开之后&#xff0c;在default页面点击add添加全局变量 如果你想学习接口自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网第一的接口自动化测试教程&#xff0c…

ux-grid实现表格排序

需求说明&#xff1a; 1、第一行不参与排序 2、实现带%排序 3、实现null值排序 4、实现值相等不排序 5、实现含有占位符‘–‘排序放到最后 表格属性说明文档 效果图如下&#xff1a; 代码如下&#xff1a; <template><div><ux-gridhighlightCurrentRow:data&…

JavaScript 使用canvas绘制随机生成图形验证码

文章目录 HTML 结构准备CSS 样式准备JavaScript 逻辑部分首先做个准备&#xff1a;声明一个空数组用来随机生成验证码封装一个为canvas标签渲染的函数&#xff0c;用来随机生成验证码还需要封装一个用来生成随机颜色的函数获取到canvas标签为其绑定点击事件为按钮绑定判断点击事…

day1-若依项目前后端分离的初步使用

响应式布局: 做好的产品能在pc端,手机,平板都能正常浏览 开发项目两种方式 1.自己从0开始写代码 2.在若依中下载拥有基础功能的源码 若依使用的mysql版本 mysql5.7 导入别人的项目如何操作 若依项目下载地址**:https://gitee.com/y_project/RuoYi-Vue.git** 可以使用揉…

数学建模——曲线拟合

一、曲线拟合简介 1、曲线拟合问题的提法 已知一组数据&#xff08;二维&#xff09;&#xff0c;即平面上n个点 (xi,yi)(i1,2,…,n)&#xff0c; xi互不相同。寻求一个函数yf(x)&#xff0c;使得f(x)在某种准则下与所有的数据点最为接近&#xff0c;即拟合得最好。 2、…

LabVIEW仿真单频脉冲信号+线性调频信号+高斯白噪声信号

文章目录 前言一、单频脉冲信号1、信号参数2、仿真图①、前面板②、程序框图 二、线性调频信号1、信号参数2、仿真图①、前面板②、程序框图 三、高斯白噪声信号1、信号参数2、仿真图①、前面板②、程序框图 四、合成信号1、前面板2、程序框图 五、代码自取 前言 本文基于 Lab…

5.1.4.8 RDD 持久化

1) RDD Cache 缓存 RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存&#xff0c;默认情况下会把数据以缓存 在 JVM 的堆内存中。但是并不是这两个方法被调用时立即缓存&#xff0c;而是触发后面的 action 算 子时&#xff0c;该 RDD 将会被缓存在计算节点的内存中&…

应用案例 | 使用tManager ControlLogix模块优化食品生产研发流程

探索tManager在食品制造应用中如何创建实时时间戳的过程数据&#xff0c;从而改善产品的开发流程。 一 背景 为了在当今以数据驱动的制造环境中取得成功&#xff0c;车间控制系统必须能够与企业计算系统进行信息交换。对此&#xff0c;事务管理器&#xff0c;像Softing的tMana…