C ++如果值来自成员变量,则复制 初始化和const引用初始化之间存在差异

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++如果值来自成员变量,则复制 初始化和const引用初始化之间存在差异相关的知识,希望对你有一定的参考价值。

考虑以下:

#include <iostream>

using namespace std;

class MyClass {
    public:
        MyClass(string myMemberInitValue);
        const string getMyMember1();
    private:
        string myMember;
};

MyClass::MyClass(string myMemberInitValue) :
    myMember(myMemberInitValue)
{}

const string MyClass::getMyMember1()
{
    return myMember;
}

int main()
{
    MyClass myObj("Hello World");

    const string myVal1 = myObj.getMyMember1(); // Ok
    const string &myRef1 = myObj.getMyMember1(); // A reference to an rvalue

    ...

    return 0;
};

通常,如果你使用恒定的reference to a r-value lifetime of the r-value is extended to match the lifetime of the reference ...

但是,如果r值是对象的成员变量怎么办?

要么复制值,要么对成员变量进行引用,但只要成员变量的值不改变,它就会有效...

所以在我的理解中,无论如何必须复制价值,对吧?

3. const string myVal1 = myObj.getMyMember1()const string &myRef1 = myObj.getMyMember1()(编译器行为,性能)之间有区别吗?

答案

技术差异可以忽略不计。 (正如M.M在评论中指出的那样。)

首先,这个:

const string myVal1 = myObj.getMyMember1();

初始化一个字符串const,它是myObj成员值的副本。

但是这个:

const string &myRef1 = myObj.getMyMember1();

初始化由const成员返回的字符串reference to a temporary myObj,永远不能重新分配。

在这两种情况下,都会制作副本... And adding const承诺编译器不会重新分配这些值。

另一答案

通常,如果使用对r值的常量引用,则会延长r值的生命周期以匹配引用的生命周期。

这是不正确的。正确的语句是“如果您创建一个const rvalue引用和未命名的临时对象,则该临时对象的生命周期将被扩展以匹配rvalue引用的生命周期”。

没有临时对象意味着没有终身延长。特别是,当方法返回引用时,它返回一个引用。没有创建未命名的临时对象,因此没有任何东西可以延长其生命周期。只有当它按值返回非引用的实际对象并且该对象未被命名时,才有一个实际未命名的临时返回值对象,RVO没有将其删除,是否有机会延长该临时对象的生命周期。

以上是关于C ++如果值来自成员变量,则复制 初始化和const引用初始化之间存在差异的主要内容,如果未能解决你的问题,请参考以下文章

若已定义了如下的共用体类型变量x,则x所占用的内存字节数为()

Java String引用传递问题

java成员变量默认赋值和初始化

java语言中,类的成员变量分配在哪个内存区?

在类中添加方法和成员变量

[c++11]右值引用移动语义和完美转发