C++11新标准特性介绍

C++11新标准特性介绍

C++简介

C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外)。

C++11包括大量的新特性:包括l**ambda表达式,类型推导关键字auto、decltype,和模板的大量改进**。

本文将对C++11的以上新特性进行简单的讲解,以便大家能够快速了解到C++11对C++的易用性方面起到的巨大作用。

新的关键字

auto

C++11中引入auto第一种作用是为了自动类型推导。auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推
导,可以大大简化我们的编程工作 auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响。

另外,似乎auto并不会影响编译速度,因为编译时本来也要右侧推导然后判断与左侧是否匹配。

int main () {
    auto a = 1;
    auto b = "yan";
    cout << b << endl;
    b += a; // b被解析成一个指针char*,指向字符串的第一个地址。
    cout << b << endl;
    return 0;
}
/*output: yan an */

auto不光有以上的应用,它在模板中也是大显身手,比如下例这个加工产品的例子中,如果不使用auto就必须声明Product这一模板参数:

template <typename Product, typename Creator>
void processProduct(const Creator& creator) {
    Product* val = creator.makeObject();
    // 必须明确指出val的类型!
    ...
}

如果使用auto,就简单得多了。

template <typename Creator>
void processProduct(const Creator& creator) {
    auto val = creator.makeObject();
    // creator.makeObject会返回一个Product的类型,于是就不必再指出val的类型了。
    ...
}

decltype

decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个 变量或表达式中得到类型,有实例如下:

    auto b = "yan";
    decltype(b) c = "1";

我们接着上边的例子继续说下去,如果上文中的加 工产品的例子中我们想把产品作为返回值该怎么办呢?我们可以这样写:

template <typename Creator>
void processProduct(const Creator& creator) -> decltype(creator.makeObject()) {
// decltype会解析出creator.makeObject的类型作为返回类型。
    auto val = creator.makeObject();
    // creator.makeObject会返回一个Product的类型,于是就不必再指出val的类型了。
    ...
}

nullptr

nullptr是为了解决原来C++中NULL的二义性问题而引进的一种新的类型,因为NULL实际上代 表的是0,

#include <iostream> // std::cout
#include <assert.h> // std::assert
using namespace std;
void test(int p) {
    cout << p << endl;
}
void test(int* p) {
    assert(p != NULL);
    cout << p << endl;

}
int main () {
    test(0); // ok. refer to int.
    test(NULL); // ambiguous! NULL can stand for both pointer of null and 0.
    test(nullptr); // ok! refer to int*
    return 0;
}

for循环

for循环的新写法:

int main () {
    int test[4] = {1, 2, 3, 4};
    for (auto p : test) {
        cout << p << endl;
    }
    return 0;
}

在C++中for循环可以使用类似java的简化的for循环,可以用于遍历数组,容器,string以及由begin和end函数定义的序列(即有Iterator),示例代码如下:

int main () {
    map<string, int> test{{"yan", 1}, {"ze", 2}, {"xin", 3}};
    for (auto p : test) {
        cout << p.first << ", " << p.second << endl;
    }
    return 0;
}

变长参数的模板

我们在C++中都用过pair,pair可以使用make_pair构造,构造一个包含两种不同类型的数据的 容器。比如,如下代码:

auto p = make_pair(1, "c++ 11");

由于在C++11中引入了变长参数模板,所以发明了新的数据类型:tuple,tuple是一个N元组, 可以传入1个, 2个甚至多个不同类型的数据。

auto t1 = make_tuple(1, 2.0, "C++ 11");

更方便的初始化方法

在C++11之前,我们使用初始化只能用数组:

int array[3] = {1, 2, 3};
vector<int> v(array, array + 3);

但在c++11中,我们可以使用以下语法:

int main () {
    vector<int> iv{1, 2, 3};
    map<int, string> temp{{1, "a"}, {2, "b"}};
    for (auto p : temp) {
        cout << p.first << ", " << p.second << endl;
    }
    for (auto p : iv) {
        cout << p << endl;
    }
    return 0;
}

你可能感兴趣的:(C++11新标准特性介绍)