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++的易用性方面起到的巨大作用。
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实际上有点像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是为了解决原来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循环的新写法:
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;
}