因工作需要,近期了解了一下C++11(不得不说,C++11的设计真的很命中我的审美),特整理如下:
参考链接: https://developer.51cto.com/art/201312/422379.htm
- Auto:声明一个变量,自动类型推导(包含已有数据类型及自定义数据类型),用于从初始化表达式中推断出变量的数据类型。
1、可简化编程工作;
2、在编译时对变量进行了类型推导,故不影响程序运行效率;
3、编译时本来也要右侧推导然后判断与左侧是否匹配,故auto不影响编译速度;
- 几个典型样例:
auto str = "hello world"; |
auto ch = 'a'; |
auto func = less<int>(); |
vector<int> iv; |
auto ite = iv.begin(); |
auto p = new foo(); |
- 模板中的应用:
template <typename Product, typename Creator> void processProduct(const Creator& creator){ Product* val = creator.makeObject(); } | template <typename Creator> void processProduct(const Creator& creator){ auto val = creator.makeObject(); } |
- Decltype : 从变量或表达式中得到类型
- 样例:
int x = 3; decltype(x) y = x; |
- 模板中的应用:
- 返回值类型后置-放在函数名之后函数体之前,解决作用域问题
template<class T, class U> auto mul(T x, U y) -> decltype(x*y){ return x*y; } |
- Nullptr:为了解决原C++中的NULL二义性问题而引进的一种新类型。C++中的NULL实际代表的是0
- NULL二义性说明:
void F(int a){ cout << a << endl; } void F(int *p){ assert(p != NULL); cout << p << endl; } int main(){ F(0); //在C++98中编译失败,有二义性;在C++11中调用F(int) return 0; } |
- 简化的for循环(用于序列)
map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}}; for(auto p:m){ cout << p.first << ":" << p.second << endl; } |
- lambda表达式
- 用于创建并定义匿名函数,以简化编程
- 语法: [函数对象参数/构造函数参数] (函数参数) mutable或exception声明 -> 返回值类型 {函数体}
- 示例:
vector<int> iv{5, 4, 3, 2, 1}; int a = 2, b = 1; for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x + b)<<endl;}); //(1) for_each(iv.begin(), iv.end(), [=](int &x){x *= (a + b);}); // (2) for_each(iv.begin(), iv.end(), [=](int &x)->int{return x * (a + b);});//(3) |
- 说明:
1、[]内的参数指的是lambda表达式可以取得的全局变量,如果是等号(=),则表示可以取得所有的外部变量;例如(1)的lambda表达式中可以取得外部变量b,(2)中的lambda表达式可以取得外部变量iv,a,b;
2、(3)中的->是返回值的后置声明;
lambda参考: https://www.cnblogs.com/jimodetiantang/p/9016826.html
- 变长参数(可变模板参数)
1、可变模板参数(variadic templates)是C++11新增的最强大特性之一,它对参数进行了高度泛化,能表示0到任意个数、任意类型的参数(c++98/03,类模板和函数模板中只能含固定数量的模板参数)。
2、可变参数模板和普通模板的语义是一样的,只是写法上稍有区别:声明可变参数模板时需要在typename或class后带上省略号“…”
- 示例一:
template <class… T> void f(T… args){ cout << sizeof…(args) << endl; //打印变参的个数 } f(); f(1, 2); f(1, 2.5, ""); |
- 示例二:
template<typename T, typename… Args> T* Instance(Args&&… args){ return new T(std::forward<Args>(args)…); } struct A{ A(int){} }; struct B{ B(int, double){} }; A* pa = Instance<A>(1); B* pb = Instance<B>(1, 2); |
- 可变模板参数,参考这里: https://www.cnblogs.com/qicosmos/p/4325949.html
- 不同数据类型的初始化
- 说明:在引入C++11之前,只有数组能使用初始化列表;在C++11中,可使用大括号进行数据初始化
int arr[3]{1,2,3}; |
vector<int> iv{1,2,3}; |
map<int, string> m {{1,"a"}, {2, "b"}}; |
string str{"hello world"}; |