在信息科学技术学院的《程序设计实习》课程中,C++新标准11引入了一系列重要的特性,旨在提升代码的简洁性和可读性。本篇专讲将详细介绍其中几个关键点,包括统一的初始化方法、成员变量的默认初始值、auto关键字的应用以及decltype关键字的功能。
1. 统一的初始化方法:C++11引入了更简洁的初始化方式,如数组(如`int arr[3] = {1,2,3}`)、向量(`vector<int> iv = {1,2,3}`)和映射(`map<int, string> mp = {{1, "a"}, {2, "b"}}`)。同时,字符串可以直接用引号包围内容,无需显式构造,如`string str = "HelloWorld"`。动态内存分配也得到了简化,如`int* p = new int[20] {1,2,3}`,结构体可以通过构造函数指定默认参数,如`A* pa = new A(3, 7)`。
2. 成员变量默认初始值:类的成员变量可以在声明时提供默认值,如`class B { public: int m = 1234; int n; }`,这样在创建对象时不需显式初始化成员变量,如`B b;`会自动设置m的值为1234。
3. auto关键字:这个特性使得编译器可以根据上下文自动推断变量类型,例如`auto i = 100;`,`auto p = new A*;`,`auto k = 34343LL;`。在循环中,`auto i = mp.begin()`会推断出i的类型为`map<string, int, greater<string>>::iterator`。
4. auto关键字的高级用法:C++11允许在函数返回类型和模板参数推导中使用auto。例如,`auto add(int n, const A& a) { return a; }`中的`auto`使返回类型根据函数参数自动确定。另一个例子是模板函数`add`,`auto d = add(100, 1.5);`将返回类型推导为`double`,而`auto k = add(100, A());`则由于参数类型不同,返回类型被推导为`A`类型。
5. decltype关键字:decltype用于获取表达式的类型,这对于函数返回类型和模板元编程非常有用。如`decltype(i)`会返回变量`i`的类型,`decltype(x+y)`在模板函数`add`中获取`x`和`y`操作后的类型。
这些新特性显著改善了C++的代码可读性和一致性,同时也提高了程序员的开发效率。在C++11的学习和实践中,理解并掌握这些特性是提高编程技能的关键。