IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 进击的C++(七) -> 正文阅读

[C++知识库]进击的C++(七)


仅作个人笔记学习交流使用

进击的C++(一)
进击的C++(二)
进击的C++(三)
进击的C++(四)
进击的C++(五)
进击的C++(六)


函数模板

泛型编程——不考虑具体数据类型的编程方式
C++中使用函数模版实现泛型编程,函数模板是一种可用不同类型进行调用的特殊函数,类型可被参数化,是C++重要的代码复用方式。

template <typename T>
void fun(T& a,T& b)
{
}

template关键字声明开始进行泛型编程
typename关键字声明泛指类型

函数模板可以自动类型推导调用,也可以具体类型显式调用。

int a=0,b=1;
fun(a,b);	//自动推导
float m=0,n=0;
fun<float>(m,n);	//显式调用
  • 编译器从函数模板通过具体类型产生不同的函数
  • 编译器对函数模板进行两次编译(对模板代码本身进行编译和对参数替换后的代码进行编译)
  • 不允许隐式类型转换(自动推导类型时必须严格匹配,显式类型指定时能够进行隐式类型转换)

多参数函数模板(任意多个不同的类型参数)

template <typename T1,typename T2,typename T3>
T1 fun(T2& a, T3& b)
{
	return T1;
}
  • 无法自动推导返回值类型,返回值必须显式指定
  • 可以从左至右部分指定类型参数
int r1 = fun<int>(0.5, 0.5);
int r2 = fun<int,float>(1, 0.5);
int r3 = fun<int,float,double>(0.5, 0.5);

函数重载VS函数模板

  • 函数模板可以像普通函数一样被重载
  • C++编译器优先考虑普通函数
  • 函数模板能产生更好的匹配,则选择函数模板
  • 空模板(<>)实参列表限定编译器只匹配函数模板
double r = fun<>(0.5, 0.5);

类模板

泛型编程的思想也可以应用于类,类模板是主要用于存储和组织数据元素的类,类中数据组织的方式和数据元素的具体类型无关,以相同的方式处理不同的类型。
C++类模版——只能显式指定具体类型,无法自动推导,使用具体类型定义对象。

template <typename T>
class class_name
{
public:
	T op(T& m,T& n);
}

class_name<int> op1;
class_name<int> op2;
  • 声明的泛指类型T可以出现在类模板的任意地方
  • 编译器从类模板通过具体类型产生不同的类
  • 编译器在声明的地方对类模板代码本身进行编译
  • 编译器在使用的地方对参数替换后的代码进行编译

PS:类模板工程应用

  • 类模板必须在头文件中定义
  • 类模板不能分开实现在不同的文件中
  • 类模板外部定义的成员函数需加上模板<>声明

多参数类模板

template <typename T1, typename T2>
class class_name
{
public:
	void fun(T1 a,T2 b);
}
class_name<int,float> t;
t.fun(1,0.5);

特化

类模板可以被部分特化和完全特化,函数模板只支持完全特化。
部分特化:用特定规则约束类型参数
完全特化:完全显式指定类型参数
类模板被特化

  • 指定类模板的特定实现
  • 部分类型参数必须显式指定
  • 根据类型参数分开实现类模板
  • 特化是模版的分开实现,因此本质上是同一个类模板
  • 特化类模板的使用方式是统一的,必须显式指定每一个类型的参数
template <typename T>
class class_name <T>
{
}
template <typename T1, typename T2>
class class_name <T1, T2>
{
}

重定义VS特化

重定义: 一个类模板和一个新类(或两个类模板),使用的时候需要考虑如何选择

template <typename T>//函数模板定义
bool isequal<T a, T b>	
{
return a==b;
}

特化: 以统一的方式使用类模板和特化类,编译器自动优先选择特化类。

template <> //函数模板完全特化
class isequal<void*>(void* a,void*b)	
{
return a==b;
}

PS:当需要重载函数模板时,优先考虑使用模板特化,当模板特化无法满足需求时,再使用函数重载。

异常处理

程序在运行过程中可能产生异常,异常(exception)是程序运行时可预料的执行分支,不同于bug(程序中的错误,不能被预料)。
异常

  • 运行时产生除0情况
  • 需要打开的外部文件不存在
  • 数组访问越界
  • 。。。

bug

  • 使用野指针
  • 堆空间使用结束后未释放
  • 。。。
    C++异常处理
  • try 语句试图处理正常代码逻辑
  • catch 语句处理异常情况
  • throw 语句抛出异常信息
double divide(double a,double b)
{
	const double delta =0.0000000000000000000001;
	double ret=0;
	if( (-delta<b) && (b<delta))
	{
		throw 0;
	}
	else
	{
		ret = a/b;
	}
	return ret;
}

try
{
	double r=divide(1,0);
}
catch(...)
{
	cout<<"divide zero ..."<<endl;
}

throw抛出的异常必须被catch处理——当前函数能够处理异常,程序继续往下执行,否则函数停止执行并返回。
异常处理顺序

  • 同一个try语句可以跟多个catch语句
  • catch语句可以定义具体处理的异常类型
  • 不同类型的异常由不同的catch语句处理,自上而下严格匹配类型
  • 异常处理匹配时,不进行任何的类型转换
  • try语句中可以抛出任何类型的异常
  • 任何异常都只能被catch一次
  • catch(…)用于处理所有类型的异常,一般被置于最后
  • catch抛出的异常需要外层的catch捕获,即捕获的异常可以重新解释后抛出

类型识别

静态类型:变量(对象)自身的类型
动态类型:指针(引用)所指向对象的实际类型

typeid关键字用于获取类型信息

  • typeid关键字返回对应参数的类型信息
  • 返回的是type_info类对象
  • 参数为NULL时抛出异常
  • 当参数为类型时,返回静态类型信息
  • 当参数为变量时,不存在虚函数表则返回静态类型信息,存在虚函数表则返回动态类型信息
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-04 19:21:28  更:2021-07-04 19:21:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 2:28:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码