- 增强
for
循环,可以使用auto
关键字 auto
类型说明符- 编译器进行推导
auto
一般会忽略顶层const
,并且保留底层const
。如果希望推断出来的类型是一个顶层const
那么需要在声明前面增加const
关键字auto
和引用,顶层const
保留
int a=1; //b是常量引用 auto &b=a; // 错误,非常量引用不能绑定字面值 auto &c=42; // 常量引用可以绑定字面值 const auto &d=42; int i = 0; const int ci=1; //错误,i是int而&ci则是const int auto &n = i, * p = &ci;
auto
对数组推断的结果是指针
int ia[]={0,1,2}; auto ia2(ia); // 初始化过程类似于如下,显然结果是int* auto ia2(&ia[0]) // 错误,ia2是一个指针不能用int赋值 ia2=42;
- 对表达式来说,如果结果是一个左值则得到的是引用类型。取地址运算符得到的是地址,为右值。
int *p; int c; // a是int& decltype(*p) a=c; // b是int ** decltype(&p) b;
decltype
类型说明符- 选择并返回操作数的数据类型,由编译器得到类型,但是不会实际计算表达式的值
- 如果
decltype
表达式是一个变量,则返回变量的类型(包括顶层const
和引用在内)
const int ci=0,&cj=ci; // x的类型是const int decltype(ci) x=0; // y的类型是const int & decltype(cj) y=x;
- 如果不是变量则
decltype
返回表达式结果对应的类型,指针解引用得到的也是引用。
int i=42,*p=&i,&r=i; // b是int decltype(r+0) b; // 错误,c是int &,必须初始化 decltype(*p) c;
- 与括号的作用,在表达式为变量的条件下,如果没有括号则结果就是变量的类型,如果有括号则编译器将变量当作表达式,变量是一种可以作为赋值语句左值的特殊表达式,所以这种情况下会得到引用
// int类型 decltype(i) d; // int & decltype((i)) e;
- 推断数组的结果是数组
- 在函数返回值中使用
int odd[]={1}; decltype(odd) *arrPtr(int i);
- 模板类型中含有模板,两个尖括号之间不需要额外的空格
- 列表初始化
vector
类型(类类型),根据赋值运算符重载的情况来初始化
vector<int> a = {1,2,3}; // 当列表初始化无法执行的时候,会将花括号替换成小括号来当成构造初始化 vector<string> a={10,"hi"}
- 基本类型,初始值类型最多只能包含一个值,并且该值即使发生转换所占用的空间也不应该大于目标类型的空间
int a{1};
begin
和end
函数,用来取原生数组的头尾指针- 除法运算,如果符号相同则为正,否则结果为负,向
0
取整(即直接切除小数部分)。 - 取余运算,如果
m
和n
是整数且n
非0
,则表达式m/n*n+m%n
的求值结果与m
相等,这样根据除法的定义,m%n
不为0
的结果的符号和m/n
相同。并且有-(m/n)=(-m)/n
initializer_list
标准库类型。如果所有实参类型相同,则可以传递这个类型initializer_list<T> list;
默认初始化,T
类型的空列表initializer_list<T> list{a,b,c...}
,列表初始化。list
的元素数量和初始值一样多,list
的元素是对应初始值的副本;列表中的元素是const
list2(list)
拷贝或赋值一个initializer_list
对象不会拷贝列表中的元素;拷贝后原始列表和副本共享元素list2=list
同上list.size()
列表中的元素数量list.begin()
返回指向list
中首元素的指针list.end()
返回指向list
尾元素下一个位置的指针
- 定义别名
using my_double = double; using intArr=int[10]; // 如果要使用原来的typedef则如下 typedef int intArr[10];
using
相对于typedef
还增加了对模板的支持
通过using
可以导出模板类型 - 尾置返回类型
// 清除的看到func函数返回的是一个指针 auto func(int i)->int (*)[10];
- 委托构造函数
delegating constructor
,类似于java
的构造函数,有多个参数,部分参数可以指定初始化,然后通过调用其他的构造函数,最后初始化剩下的参数或者其他参数直接是提供默认值class Sale{ private: int id; string name; public: Sale(int id):Sale(id,nullptr){}; Sale(int id,string name):id(id),name(name){}; }
operator bool()
提供本类型到bool
的隐式转换。比如iostream
库就是这样做的。(利用iostream
库做读取的时候,while
判断是否读取完成以及读取成功)
c++11新特性
最新推荐文章于 2020-11-04 01:14:02 发布