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