声明:这个博文所有内容均来自于C++标准库-自学教程与参考手册(第二版)英文版 上册。如果转载,务必附带本声明,请注明出处。
1、nullptr与std::nullptr_t
C++11允许使用nullptr来替代0或者NULL,用于初始化一个空指针。nullptr是新关键字,可以将指针转换为空而不是任何的整数类型。nullptr类型为std::nullptr_t,在< cstddef>有定义。
2、auto
自动类型推断。
3、标准初始化与列表初始化(Uniform Initialization and Initializer Lists)
int values[] { 1, 2, 3};
std::vector<int> v{ 2, 3, 4, 5, 20};
std::vector<std::string> cities {
"Berlin", "New York", "London"
};
std::complex<double> c{4.0, 3.0};
int i;//未定义初始值
int j{}; //初始化为0
int *p; //未初始化
int *q{}; //初始化为nullptr
可以使用std::initializer_list进行初始化。
void print(std::initializer_list<int> vals)
{
for(auto p = vals.begin();p!=vals.end();++p)
std::cout << *p << "\n";
}
print({12, 3, 5, 11, 24, 44});//把一个列表传递到一个函数
4、C++11 的 range-based for loops
其通用语法如下:
for(decl: coll)
{
;
}
其中decl是申明的一个用于存储collection coll中每个元素的变量。
for(int i: {1, 2, 3, 4, 5})
std::cout << i << std::endl;
还可以使用引用:
std::vector<double> vec;
//自己对vec初始化
for(auto& elem: vec)
elem *= 3; //每个元素增大到原来的3倍
也可以使用模板:
template <typename T>
void printElements(const T& coll)
{
for(const auto& elem : coll)
std::cout << elem << std::endl;
5、New String literals
从c++11开始,我们可以定义raw string了,只需要在字符串前面加上R,具体格式为:R”(…)”.
例如:在以前我们使用”\\n”才能表示出”\n”这个字面字符串,现在没必要这么麻烦了,我们只需要 R”(\n)”。
Encoding String Literals:
u8: 定义一个utf-8编码
u: 定义一个 char16_t编码
U: 定义一个 char32_t 编码
L: 定义一个wchar_t 编码
6、lambdas
Lambda表达在其他语言早已出现,如python,从C++11开始, C++引入这个新特性。
给个例子吧:
int x = 0;
int y = 42;
auto qLambda = [x, &y] {
std::cout << "x: " << x << std::endl
<< "y: " << y << std::end;
++y;//可以改变y的值,因为我们传递的是引用,但是不能改变x的值,x在此是只读的变量
};
x = y = 77;
qLambda(); // 输出 x = 77, y = 77;
qLambda(); // 输出 x = 77, y = 78;
std::cout << "final y: " << y << std:: endl; // y = 79;
也可以使用mutable来修饰这个lambda表达,使得传进来的值即是不是引用,也是可以修改的。