C++11的新特性简单汇总介绍 (一)

2020-01-06 15:36:04王旭

7. using类型别名

类型别名其实早在C语言中就有了,一般情况下我们使用关键字typedef来声明一个类型的别名,在C++11中增加了另一种声明类型别名的方法就是使用using关键字,using关键字在C++11以前一般用来引用命名空间。


typedef int INT; // 右侧符号代表左侧
using INT2 = int; // 左侧符号代表右侧
 
INT a = 20;
INT2 b = 30;

8. auto类型指示符

我们定义一个变量的时候首先必须确定该变量的类型,而很多时候并不是我们先需要一个变量然后为该变量赋值合适的数据,而是我们有一个值但是我们却不知道该用什么类型的变量存储它,特别是C++的模版使用的非常广泛,有时候要定义一个变量,其类型是很复杂的会带有模版的类型参数,例如一个最常见的例子:


map<string ,int> m ;
map<string,int>::iterator it = m.begin();

上面的例子中我们定义了一个map<string,int>::iterator类型的变量来存放 m.begin()的值,这个例子相对来说还不算困难但是我在开始使用map容器的时候也曾经被搞晕过,如果map是一个 map<string,double> 类型则需要定义一个  map<string.double>::iterator it 来存放了。特别是如果map和vector之间互相嵌套的情况就更容易弄错了。定义这种类型变量的另一个缺点就是一个类型的名字往往会很长,试想一下程序代码中通篇都是这种变量声明,恐怕不会有几个人看着舒服吧。不过没关系C++11为我们定义了一个新的关键字 auto 用来定义变量,而变量的类型由编译器自动根据赋值的表达式推导出来,不需要我们显示定义了。因为auto定义的变量的类型由编译器根据赋值的表达式推导,所以auto定义的变量必须有初始值,否则编译器没法确定该变量的类型。


auto x = 20; // x 是int
auto y = 3.14; // y 是double
map<string ,int> m ;
auto it = m.begin(); //it 是map<string,int>::iterator

这样是不是方便了不少,而且程序看起来更加简洁了
auto可以在一条语句中声明多个变量,但是要保证语句中的基础数据类型只有一个,例如:


auto i=10,*p=&i; // OK i是int,p是int*
auto a=10,b=3.14; // Error 类型是int还是double ?

9. decltype类型指示符

有时候会有这样的需求,我们需要知道一个表达式的类型,并使用该类型去定义一个变量,例如:


int a = 10;
int b = 20;
auto c = a + b; // OK a+b的类型是int,此时c的类型是int,并且c的值是 a+b

auto可以解决部分问题,例如我们定义的变量的类型就是表达式 a+b 的类型,但是如果我们仅仅需要定义一个与表达式 a+b 的类型相同的变量,但是我们又不希望将表达式a+b的值赋值给刚刚定义的变量,我们希望赋另外一个值或者是仅仅定义变量而不赋值呢。 这就需要用到C++11 提供的另一个类型说明符 decltype了。decltype作用于一个表达式,并且返回该表达式的类型,在此过程中编译器分析表达式的类型,并不会计算表达式的值。例如