c++11新特新

特殊,常用的几个

 智能指针

string的数值转换函数-----链接

范围for()语句

用来逐一遍历string对象,容器,或者序列的每一个值,每循环一次,变量获取序列中的一个值。

string str("adbcdccd");
//遍历输出每一个字符
for(auto c:str)
    cout<<c<<endl;

for(declaration:expression)

    statement;

declaration是要定义的一个变量,expression是string对象或者,或者容器,或者序列。

右值引用

链接

完美转发--std::forward()

保持右值性质转发,防止产生拷贝。

链接

lambda表达式

什么是lambda表达式

5=3+2

lambda表达式更准确的应该叫lambda函数。

就是特定的形式来完成函数功能的代码块。

链接1

链接2

lambda表达式原理

默认生成const结构体

补充:

lambda参数列表不允许有默认参数

捕获列表的参数传递方式为---值传递。

#include<iostream>
using namespace std;
 
int main()
{
    int a=9;
    auto fun1=[=]{return a+1;};//你是你,我是我,如果是值传递捕获,被捕获变量和lambda表达式
    auto fun2=[&]{return a+1;};//中的变量互不影响,只是值传递。
    cout<<"fun1:"<<fun1()<<endl;
    cout<<"fun2:"<<fun2()<<endl;
    ++a;
    cout<<"++a执行之后的值"<<endl;
    cout<<"fun1:"<<fun1()<<endl;
    cout<<"fun2:"<<fun2()<<endl;
 
    return 0;
}

#include<iostream>
using namespace std;
 
int main()
{
    int a=9;
    auto fun1=[=]{return a+1;};
    auto fun2=[&]{return ++a;};//区别
    cout<<"fun1:"<<fun1()<<endl;
    cout<<"fun2:"<<fun2()<<endl;
    ++a;
    cout<<"++a执行之后的值"<<endl;
    cout<<"fun1:"<<fun1()<<endl;
    cout<<"fun2:"<<fun2()<<endl;
 
    return 0;
}

注意区分捕获列表和参数列表

捕获列表中的数据,第一次调用lambda函数的时候进行初始化,就不变了。

lambda函数的返回对象和函数返回值

lambda函数是一个一定会返回函数指针的函数;

而lambda函数本身可以想普通函数一样指定一个返回值;

返回对象和返回值说不同的。

lambda表达式(函数)返回的是一个函数指针

而且注意:lambda表达式可写可不写,就算有返回值,也可以让编译器自动推导

int (*pf)(int a, int b) = nullptr;
	pf = [](int a, int b) {
		return a + b;
	};
cout<<pf(10,20);

auto f=[]{....};

lambda函数之后要加分号

调用

lambda是函数,既然是函数,就不会自动调用。

int main()
{
	auto f = [] {cout << "get" << endl; };
	return 0;
}
//执行函数无输出
int main()
{
	auto f = [] {cout << "get" << endl; };
	f();//()是函数调用符
	return 0;
}

//输出get

也可以定义的时候就执行----只需要在函数体之后加上函数调用符()

   int m = 0;
   int n = 0;
   [&, n] (int a) mutable { m = ++n + a; }(4);
   cout << m << endl << n << endl;

lambda函数作为函数参数

调用 一个函数的原理就是需要通过函数地址找到函数的位置,开始执行函数。

lambda函数作为函数参数返回一个函数指针(函数的调用地址),那么函数机会通过这个函数指针去调用lambda函数.

所以:lambda函数作为函数参数,会完成lmabda 函数的调用过程。

lambda表达式作为函数参数捕获指针问题

test1([this](std::weak_ptr<IObserver> observer){
    auto action = new std::function<void()>([this,observer]{
        std::shared_ptr<IObserver> shared_observer = observer.lock();
        if(shared_observer) {
            shared_observer->Connected(ip_);
        }
    });
});

lambda捕获的指针,可能会出现,还没有执行lambda函数,指针就被释放,或者指针崩溃的问题。

所以,lambda表达式除非保证指针在使用的范围内不会出现问题,否则当需要某些数据时,最好直接捕获(拷贝)数据,而不要通过捕获指针,从指针中获取值的方式。

什么是闭包

定义在函数内部的函数,用来连接内部和外部函数

闭包在c++中的实现就是lambda表达式,体现就是捕获列表。

链接

链接

decltype

链接

链接

参数为函数调用

编译器分析得到的类型为函数返回值;

decltype (vec.size()) i = 0;

i的类型为size()的返回类型--int

参数为表达式

一些其他的特性 

auot

作为函数返回值类型

constexpre

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值