(新特性)12

P12:类型的化名Type Alias(类似于typedef)

 

typedef void(*func)(int,int);          //等同于下面的写法

using func = void(*)(int,int);         //等同于上面的写法

func是一个类型type,是一个函数指针,func有两个参数(int,int),func的返回值类型是void

对于第二种情况func的类型type是等号右面,即void(*)(int,int)

函数的名称就是函数指针,也就是函数的地址

void example(int,int){

                      }
func fn = example

 

第二种用法

using value_type = T

等同于

typedef T value_type

第三种用法alias template

template<class CharT>
using mystring = std::basic_string<CharT,std::char_traits<CharT>>;

对于第一种、第二种-------------->type alias和typedef没有差别

对于第三种

//标准库的写法
typedef basic_string<char> string

标准库的写法,实际上有两个参数,第二个默认参数取决于第一个参数char

标准库的写法等同于第三种用法

 

下面是using在2.0之前就有的一些特性

一、

完全的打开命名空间--------------->using namespace std

只打开命名空间中需要的--------->using std::count

 

二、

写代码,写出一个名称、写出一个名字,要找出来,当初是在哪里定义的,C++有一定的搜寻规则,但是我们也可以避免这种,我们可以写的很清楚-------------->using _Base::_M_allocate,后面写代码的时候,可以只写_M_allocate,编译器就会去_Base里面去找

异常是一门大学问

void foo() noexcept-------------->保证函数foo不会抛出异常

void foo() noexcept{
                    //等同于下面的写法
}              


void foo() noexcept(true){

}

noexcept是有条件的

当noexcept满足条件为true的时候,函数foo不会抛出异常

noexcept是有条件的----------->函数x.swap(y)不抛出异常,那么函数swap()就不抛出异常

void swap(Type& x,Type& y)noexcept(noexcept(x.swap(y)))

 

异常一定会被处理,A调用B,如果B发出异常,异常是一包东西,会传递给调用端,也就是异常传递给A,如果A没有处理异常,那么异常就会传递给A的调用端

如果foo没有处理异常,那么遗产最终就会被std::terminate()中的std::abort()处理

你必须通知C++(特别是std::vector)你的move constructor和move destructor不丢异常。那么当vector成长的时候,move constructor才会被调用。如果move constructor会抛出异常,std::vector就不会用move

只有vector才有成长的动作,如果我们没写搬移构造,那么就会调用拷贝构造;如果我们写了搬移构造,那么就会调用搬移构造

也就是说,只有copy版本的,就调用copy版本;有move版本的就调用move版本,move相比于copy,更加有效率

如何通知C++特别是std::vector我们有move函数呢?--------------------------->写noexcept通知,这样vector才会放心的调用这个move版本

override复写,改写,应用在虚函数virtual身上

父类Base,子类Derived1继承Base

所谓的override,函数的signature一定是完全相同

对于Derived1里面的函数------------->virtual void vfunc(int),这个函数不是override父类中的vietual void vfunc(float)函数,因为参数类型不相同,这只是子类Derived1定义的一个普通的虚函数

现在有override,告诉编译器,这个虚函数就是想要override,希望编译器帮我们侦错

Error:marked标明了要overried,但是并没有override

关键字final,可以用在两个地方------------>针对class、针对虚函数

1)对于父类Base1,写上final,也就是说Base1类就是继承体系最后的那一个,不要在有人继承我了

2)对于父类Base2中的虚函数virtual void f() final,可以被继承,但是在子类中不可以被override

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值