C++11

来源:互联网 发布:手机电影软件哪个最好 编辑:程序博客网 时间:2024/06/15 19:50

1.auto

在C++11之前,auto关键字用来指定存储期。在新标准中,它的功能变为类型推断。auto现在成了一个类型的占位符,通知编译器去根据初始化代码推断所声明变量的真实类型。各种作用域内声明变量都可以用到它。例如,名空间中,程序块中,或是for循环的初始化语句中。

auto i = 42;        // i is an intauto l = 42LL;      // l is an long longauto p = new foo(); // p is a foo

使用auto通常意味着更短的代码(除非你所用类型是int,它会比auto少一个字母)。试想一下当你遍历STL容器时需要声明的那些迭代器(iterator)。现在不需要去声明那些typedef就可以得到简洁的代码了。

std::map<std::string, std::vector<int>> map;for(auto it = begin(map); it != end(map); ++it) {}

2. nullptr

以前都是用0来表示空指针的,但由于0可以被隐式类型转换为整形,这就会存在一些问题。关键字nullptr是std::nullptr_t类型的值,用来指代空指针。nullptr和任何指针类型以及类成员指针类型的空值之间可以发生隐式类型转换,同样也可以隐式转换为bool型(取值为false)。但是不存在到整形的隐式类型转换。

3.基于范围的for循环

为了在遍历容器时支持”foreach”用法,C++11扩展了for语句的语法。用这个新的写法,可以遍历C类型的数组、初始化列表以及任何重载了非成员的begin()和end()函数的类型。如果你只是想对集合或数组的每个元素做一些操作,而不关心下标、迭代器位置或者元素个数,那么这种foreach的for循环将会非常有用

std::map<std::string, std::vector<int>> map;std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);map["one"] = v;for(const auto& kvp : map) {  std::cout << kvp.first << std::endl;  for(auto v : kvp.second)  {     std::cout << v << std::endl;  }}int arr[] = {1,2,3,4,5};for(int& e : arr) {  e = e*e;}

4.override和final

我总觉得 C++中虚函数的设计很差劲,因为时至今日仍然没有一个强制的机制来标识虚函数会在派生类里被改写。vitual关键字是可选的,这使得阅读代码变得很费劲。因为可能需要追溯到继承体系的源头才能确定某个方法是否是虚函数。为了增加可读性,我总是在派生类里也写上virtual关键字,并且也鼓励大家都这么做。

override,表示函数必须重写基类中的虚函数,如果派生类没有重写到将编译报错。(放在子类中)

final,表示派生类不应当重写这个虚函数,如果派生类重写了基类的虚函数将编译报错。(放在基类中)

class A{public:    virtual void f(short) { std::cout << "A::f" << std::endl; }    virtual void g(int) final { std::cout << "A::g" << std::endl; }};class B : public A{public:    virtual void f(short)  override  { std::cout << "B::f" << std::endl; }    //virtual void g(int) { std::cout << "A::g" << std::endl; } // error C3248: “main::A::g”:  声明为“final”的函数无法被“main::B::g”重写    virtual void g(float) { std::cout << "A::g" << std::endl; } // 重载};

Smart Pointers 智能指针

0 0
原创粉丝点击