本文主要是介绍侯捷C++ 2.0 新特性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
关键字
nullptr and std::nullptr_t
auto
一致性初始化:Uniform Initialization
11之前,初始化方法包括:小括号、大括号、赋值号,这让人困惑。基于这个原因,给他来个统一,即,任何初始化都能够使用大括号来实现。实现的方法使用另外一个新特性:初始化列表。下一个特性介绍。
// 11之前
Rect r1 = {3, 7, 30};
Rect r2(3, 7, 20);
int ia[6] = {27, 89, 20};// 11之后
int values[] {1, 2, 3};
vector<int> v {1, 2, 3};
complex<double> c {4.0, 3.0};
初始化列表:Initializer Lists
ERROR:narrowing 不允许窄化的转换
前面的一致性初始化中的大括号会形成一个初始化列表。具体实现代码如下:
explicit
struct complex{int real, imag;// explicitcomplex(int re, int im = 0) : real(re), imag(im){}complex operator+(const complex& x){return complex((real + x.real), (imag + x.imag));}
}
11之前,用于一个参数的构造函数。有上面的代码,那么在执行complex c1(12, 5); complex c2 = c1 + 5;的时候,构造函数不用explicit修饰,则会把5变成一个复数类,但是如果用explicit修饰了,这两句代码就会报错。也就是,让编译器知道,用户希望只在显式调用构造函数的时候才会调用,其他时候不允许调用。
11之后,explicit可用在接受一个以上参数的构造函数。突破了一个参数的限制,阻止任意多个参数的构造函数的隐式调用。
class p {public:p(int a, int b){cout << "p(int a, int b)" << endl;}explicit p(int a, int b, int c){cout << "expilict p(int a, int b, int c)" << endl;}
}p p1(1, 2); //p(int a, int b)
p p2 = {1, 2, 3}; // 报错,因为initializer想要去调用用explicit修饰的构造函数,被编译器阻止
参考文章:侯捷C++八部曲笔记(四、C++2.0新特性)_2.0/3+1c++-CSDN博客
这篇关于侯捷C++ 2.0 新特性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!