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++11——Type Alias(类型化名)、noexcept(异常)、override(重写)、final(终止继承/重写) -> 正文阅读

[C++知识库]C++11——Type Alias(类型化名)、noexcept(异常)、override(重写)、final(终止继承/重写)

Type Alias

和typedef类似,甚至可以说作用一模一样,都是给类型起别名,Type Alias需要借助关键字using。有三种使用场景:

场景1:给函数指针起别名

//typedef void (*func)(int,int);//C语言就有的写法,这里定义了一个函数指针类型——func,指向的函数类型有两个int类型参数,返回值为void。只是显然这种语法无法凸显出func是一个类型
using func=void(*)(int,int);//使用这样的类型化名方式就可以很清晰的表明func是一个指针函数类型
......

//使用方式如下
void example(int a,int b){}
func fun=example;//使用func类型创建一个对象,指向一个函数

场景2:为模板参数起别名

template<typeneme T>
class Container{
using velue_type=T;//相当于typedef T value_type;
};
......

//使用方式如下
template<typename Container>
void fun(const Container& c)
{
	typename Container::value_type n;//获取Container容器中的元素类型,并创建一个该类型的变量
}

这种方式再C++标准库中非常常见,容器、迭代器、仿函数中大量使用。

场景3:为模板类型起别名

即Alias Template(化名模板),用以隐藏模板参数,简化书写。

template<typename Char>
using mystring=std::basic_string<Char,std::char_traits<Char>>;
......

//使用方式如下
mystring<char> str;

在标准库中有typedef basic_string string.

拓展

using的几种使用形式:
1、命名空间的使用指令

using namespace std;

2、命名空间成员的使用声明

using std::cout;

3、类成员的使用声明

class HH {
protected://保护成员
	int hh;
};
class XX:public HH {//继承
protected://保护成员
	using HH::hh;//这里使用父类的成员
public:
	void test() {
		hh = 1;//这里不再需要父类的作用域限定
	}
};

4、C++2.0以后有Type Alias和Alias Template使用using关键字

noexcept

异常(exception)是一门大学问,值得程序员认真研究。

//一般形式如下:
//void fun()noexcept(expression->bool);//该函数是否抛出异常取决于表达式的返回值,为true则不抛出异常,为false则抛出异常

void fun()noexcept;//保证该函数一定不抛出异常,相当于void fun()noexcept(true);

void swap(Type& a,Type& b)noexcept(noexcept(a.swap(b)))//意思是当表达式a.swap(b)没有异常时就不会抛出异常
{
	a.swap(b);
}

异常若在本函数中被抛出后没有被处理,就会向上传递异常到调用该函数的函数中,等待处理,若还是没有被处理,就再向上传递,直到没有函数调用关系为止。
若直到最后异常都没有被处理,程序会触发调用std::terminate(),而在std::terminate()中会调用std::abort()终止程序。
注意:移动构造函数和移动赋值函数一般声明为noexcept,这两者往往只意味着内存所有权的转让,而不涉及内存的分配,因此一般不会有异常。使用noexcept声明一方面有助于程序员推断程序逻辑,另一方面编译器可以更好地优化代码。

class MyString{
private:
	char* _data;
	size_t _len;
	...
public:
	//移动拷贝
	MyString(MyString&& str)noexcept:_data(str._data),_len(str._len){...}
	//移动赋值
	MyString& operator=(MyString&& str)noexcept{
		...
		return *this;
	}
};

override

override用于修饰子类重写的父类的虚函数,用于显示告诉编译器所修饰的函数为重写父类的虚函数,防止出现笔误造成实质上重新在子类中定义了一个函数。

class Base{
public:
	virtual void func(int a){}
};
class Derived:public Base{
public:
	void fun(int a){};//这里本来想重写父类虚函数,但笔误实质上重新定义了一个函数,编译器不会报错
	//void fun(int a)override {};//error:这里显示指明该函数为重写父类的虚函数,通过检查发现父类没有同名函数,因此报错
	void func(int a){};
};

final

用于修饰有继承体系的类,以及类中的虚函数。
**用于修饰类:**表明 该类(被final修饰)是继承体系中最下层的类,不会再有其他类去继承该类

class Base1 {};
class Base2 final :public Base1 {};
class Base3:public Base2{};//error:不能将已声明为final的类作为基类

用于修饰虚函数:表明所有继承自 该虚函数(被final修饰)所在类的类,不再有权利重写该虚函数

class Base1 {
public:
	virtual void fun(){}
};
class Base2:public Base1 {
public:
	virtual void fun()final{}
};
class Base3:public Base2{
public:
	virtual void fun(){}//error:声明为final的函数无法被其子类重写
};
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 13:42:06  更:2022-01-01 13:42:26 
 
开发: 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年11日历 -2024/11/24 10:22:52-

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