yang131

导航

c++ 关于返回值、将亡值的调用研究

c++11引入右值引用,而出现右值引用的有这几种:返回值(将亡值),常量。

class Obj
{
public:
    Obj() { cout << "构造函数" << endl; }
    ~Obj() { cout << "析构函数" << endl; }
    Obj(const Obj& l)
    {
        cout << "拷贝构造函数" << endl;
    }
  /*  Obj(Obj&& l)
    {
        cout << "移动构造函数" << endl;
    }*/

    void operator=(Obj& r)
    {
        cout << "赋值函数" << endl;

    }
    void operator=(Obj&& r)
    {
        cout << "移动赋值函数" << endl;
    }

};
Obj getObj()
{
    Obj oo;
    return oo;
}

void Call(Obj o)
{
    cout << "Call" << endl;
}


int main()
{
   // Obj o;
    Obj o = getObj();
    cout<<"obj call"<<endl;
    Call(getObj());
    return 0;
}

Obj对象如果没有移动构造函数,那么Call(getObj()), 这里产生的Obj临时对象,会进入Call的时候会调用拷贝构造函数,如果有移动构造函数,则使用移动构造函数,如果都没有则编译不过去,拷贝构造函数和移动构造函数至少有一个。

Obj o = getObj();接收赋值这一块延长了返回值的生命周期,而getObj的最终返回值也同样是调用的移动构造函数或者拷贝构造函数,移动构造函数优先。

延长的时间为o的生命周期,getObj()如果被Call调用的时候,Call函数对象的调用延长了getObj函数的生命周期。

运行结果  会有一次构造函数,一次拷贝构造函数,析构函数会看是否有人接收或者直接调用来延长其生命周期

 

由于目前的限制,编译器使用的是VS,为了尽可能的减少对象的构造,以及延长生命周期

#include <iostream>
using namespace std;
class Obj
{
public:
    Obj() { cout << "构造函数" << endl; }
    ~Obj() { cout << "析构函数" << endl; }
    Obj(const Obj& l)
    {
        cout << "拷贝构造函数" << endl;
    }
    Obj(Obj&& l)
    {
        cout << "移动构造函数" << endl;
    }

    void operator=(Obj& r)
    {
        cout << "赋值函数" << endl;

    }
    void operator=(Obj&& r)
    {
        cout << "移动赋值函数" << endl;
    }

};
Obj&& getObj()
{
    Obj oo;
    return move(oo);
}

void Call(Obj o)
{
    cout << "Call" << endl;
}


int main()
{
    // Obj o;
    Obj o = getObj();
    cout << "obj call" << endl;
    //Call(getObj());
    return 0;
}

目前的实验方式中,只是将已经析构的将亡值的右值引用抬了出来。如何延长其生命周期??

 

posted on 2022-07-11 11:56  NoNight  阅读(29)  评论(0编辑  收藏  举报