C++学习 匿名函数 和 智能指针

匿名函数

原文链接:C++匿名函数_晚睡的人没对象的博客-CSDN博客_c++ 匿名函数

一.匿名函数的简单使用

  • 匿名函数(英文名:lambda)就是没有名字的函数。最简单的匿名函数是[](){},它没有参数也没有返回值。在匿名函数中,[]里面用来捕获函数外部的变量,而()里面就是匿名函数的参数,{}里面就是函数的执行代码。
  • #include
    using namespace std;
    int main(){
    	// 注:
    	/**
    		[=]表示值传递方式捕捉所有父作用域的变量包, 括this
    		[&s]表示引用传递捕捉变量s
    		[&]表示引用传递方式捕捉所有父作用域的变量, 包括this
    		[this]表示值传递方式捕捉当前的this指针
    		可以连用如:[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量
    		注意:捕捉列表不允许变量重复传递比如[&,&a]
    	*/
    	// 匿名函数 - ->返回值类型 - lambda表达式
    	auto fun = [](int a)->int{ // 定义匿名函数 并引用
            cout << a << endl;
            return 1;
    	};
    	int num = fun(10);// 调用
    	cout << num << endl;// 测试返回值
    	return 0; 
    }
    
    #include  // std::sort()
    #include  // std::string
    #include  // std::cout std::endl
    
    int main(void)
    {
        std::string text = "banana";
        std::sort(text.begin(), text.end(),[](char x, char y)
        {
            return x > y;
        });
        std::cout << "从大到小排序:" << text << std::endl;
        return 0;
    }
    

  • 匿名函数作为形参

关于函数OnPostProcessCaptureARLayer_RenderThread中有一段代码:
    GraphBuilder.AddPass(
        RDG_EVENT_NAME("CaptureAR"),
        Parameters,
        ERDGPassFlags::Raster,
        [&View,
        VertexShader,
        PixelShader,
        DefaultBlendState,
        DepthStencilState,
        SceneColorViewport,
        BackBufferViewport,
        Parameters,
        this](FRHICommandListImmediate& RHICmdList)
其中用到了匿名函数,这个匿名函数作为形参传入了AddPass函数中,并且传入的之后作为ExecuteLambdaFunc存了起来
调用处的代码是:ExecuteLambdaFunc(static_cast(RHICmdList));

  • 智能指针

  • (原文链接:c++11之智能指针_峰上踏雪的博客-CSDN博客_智能指针 )
  • 共享的智能指针shared_ptr

C++中用的最多的是下面三种智能指针
C++11中提供了三种智能指针,使用这些智能指针时需要引用头文件

std::shared_ptr:共享的智能指针
std::unique_ptr:独占的智能指针
std::weak_ptr:弱引用的智能指针,它不共享指针,不能操作资源,是用来监视shared_ptr的。

1. shared_ptr的初始化
 共享智能指针是指多个智能指针可以同时管理同一块有效的内存,共享智能指针shared_ptr 是一个模板类,如果要进行初始化有三种方式:通过构造函数、std::make_shared辅助函数以及reset方法。共享智能指针对象初始化完毕之后就指向了要管理的那块堆内存,如果想要查看当前有多少个智能指针同时管理着这块内存可以使用共享智能指针提供的一个成员函数use_count


    //1.通过构造函数初始化
    shared_ptr ptr1(new int(3));
    cout << "ptr1管理的内存引用计数: " << ptr1.use_count() << endl;
 
    //2.通过移动和拷贝构造函数初始化
    shared_ptr ptr2 = move(ptr1);
    cout << "ptr1管理的内存引用计数: " << ptr1.use_count() << endl;
    cout << "ptr2管理的内存引用计数: " << ptr2.use_count() << endl;
 
    shared_ptr ptr3 = ptr2;
    cout << "ptr2管理的内存引用计数: " << ptr2.use_count() << endl;
    cout << "ptr3管理的内存引用计数: " << ptr3.use_count() << endl;
 
    //3.通过 std::make_shared初始化
    shared_ptr ptr4 = make_shared(8);
    shared_ptr ptr5 = make_shared(7);
    shared_ptr ptr6 = make_shared("GOOD LUCKLY!");
 
    //4.通过reset初始化
    ptr6.reset(); //重置ptr6, ptr6的引用基数为0
    cout << "ptr6管理的内存引用计数: " << ptr6.use_count() << endl;
 
    ptr5.reset(new Test("hello"));
    cout << "ptr5管理的内存引用计数: " << ptr5.use_count() << endl;

2.获取原始指针

 对应基础数据类型来说,通过操作智能指针和操作智能指针管理的内存效果是一样的,可以直接完成数据的读写。但是如果共享智能指针管理的是一个对象,那么就需要取出原始内存的地址再操作,可以调用共享智能指针类提供的get()方法得到原始地址


    Test* t = ptr5.get();
    t->setValue(1000);
    t->print();
 
    //2.方法二
    ptr5->setValue(7777);
    ptr5->print();

3. 指定删除器
 当智能指针管理的内存对应的引用计数变为0的时候,这块内存就会被智能指针析构掉了。另外,我们在初始化智能指针的时候也可以自己指定删除动作,这个删除操作对应的函数被称之为删除器,这个删除器函数本质是一个回调函数,我们只需要进行实现,其调用是由智能指针完成的。


     //1.简单举例
    shared_ptr ppp(new Test(100), [](Test[] t) {
        //释放内存
        cout << "Test对象的内存被释放了......." << endl;
        delete t;
        });
    printf("----------------------------------------------------------------------\n");
 
    2.如果是数组类型的地址,就需要自己写指定删除器,否则内存无法全部释放
    //shared_ptr p1(new Test[5], [](Test* t) {
    //    delete[]t;
    //    });
 
    //3.也可以使用c++给我们提供的 默认删除器函数(函数模板)
    shared_ptr p2(new Test[3], default_delete());
 
    //4.c++11以后可以这样写 也可以自动释放内存
    shared_ptr p3(new Test[3]);

独占的智能指针unique_ptr


首先了解一下基本概念,再看代码,会学的很快


 1. 初始化
std::unique_ptr是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针,可以通过它的构造函数初始化一个独占智能指针对象,但是不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr。

 2. 删除器
 unique_ptr指定删除器和shared_ptr指定删除器是有区别的,unique_ptr指定删除器的时候需要确定删除器的类型,所以不能像shared_ptr那样直接指定删除器
 

你可能感兴趣的:(c++,学习)