C++11新特性

因工作需要,近期了解了一下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);

 

  • 不同数据类型的初始化
    • 说明:在引入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"};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值