C++11对类、模板和异常等方面的修改
基于范围的for循环
- C++11引入了基于范围的for循环,这种for循环对数组或容器中的每个元素执行指定的操作
int nums[5] = {1, 2, 3, 4, 5};
for(int x : nums)
cout<<x<<" ";
for(int &x : nums) //使用引用不会产生副本而是直接引用数组中的元素,
x = x + 1; //因此可以修改元素值
for(auto x : nums)
cout<<x<<" "; //将基于范围的for循环与auto结合
对STL的修改
- 增加了新的STL容器:C++11新增了array(固定长度的数组)、forward_list(单链表)、unordered_set、unordered_multiset、unordered_map、unordered_multimap
- C++11新增了
rbegin()
和rend()
方法,用于对容器进行反向遍历
vector<int> nums{ 1, 2, 3, 4, 5 };
for (auto iter = nums.begin(); iter != nums.end(); iter++)
cout << *iter << " ";
cout << endl; // 1 2 3 4 5
for (auto iter = nums.rbegin(); iter != nums.rend(); iter++)
{
cout << *iter << " ";
}
cout << endl; // 5 4 3 2 1
-
C++11新增了
cbegin()
和cend()
方法,类似于const int *
常量指针,无法修改所指向的值
-
在C++中要求,在声明嵌套模板时,用空格将尖括号隔开,防止与>>混淆,C++11不再要求这样
vector<list<int>>; //在C++11中这么写对正确的
对异常的修改
- 异常规范:指出函数可能引发哪些异常
void func() throw (bad_dog); //可能会引发bad_dog异常
void func() throw(); //不会引发异常
- C++11摒弃了异常规范,但增加了
noexcept
关键字,指出函数不会引发异常
void func() noexcept; //指出不会引发异常
作用域内枚举
- C++11新增了一种称为
作用域内枚举
的枚举,使用struct
或class
进行定义,解决同一作用域内两个枚举体,枚举成员不能重名的问题 作用域内枚举
,其枚举量的作用域为类
enum old_egg {Small, Medium, Large, Jumbo};
enum t_shirt {Small, Medium, Large, Xlarge}; //两个枚举题发生了冲突
enum class egg {Small, Medium, Large, Jumbo};
enum struct t_shirt{Small, Medium, Large, Xlarge}; //不会发生冲突
- 某些情况下,常规的枚举会自动转为整型,但作用域内枚举不能隐式转为整型,提高了作用域内枚举的类型安全
int x = Medium; //常规枚举,正确的
int x = egg::Medium; //作用域内枚举,错误的,不能隐式转为整型
t_shirt rolf = t_shirt::Medium;
old_egg one = Medium;
if(one <= Large) //对于传统的枚举类型是正确的
if(rolf <= t_shirt::Large) //对于作用域内枚举是错误的,但在vs中测试是可以的
- 默认情况下,C++11作用域内枚举的底层类型为int
- C++ 11提供了一种语法,可用于选择不同的底层类型,但如果没有指定,编译器选择的底层类型将随实现而异
enum struct t_shirt:short{Small, Medium, Large, Xlarge}; //选择short作为底层类型