如果值来自成员变量,则复制初始化和参考初始化之间的C 差异

C++ Difference between copy initialization and const reference initialization if value comes from member variable

本文关键字:初始化 参考 之间 差异 复制 成员 变量 如果      更新时间:2023-10-16

考虑以下内容:

#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;
};

通常,如果您使用对R值的常数引用,则延长R值的寿命以匹配参考的寿命...

1。但是,如果r值是对象的成员变量?

要么复制该值,要么对成员变量进行引用,但只要成员变量的值不更改即可有效...

2。因此,在我的理解中,必须复制该值,对

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引用myObj成员返回的临时性,并且永远无法重新分配。

在这两种情况下,都制作了一个副本...并添加const承诺编译器这些值不会被重新分配。

通常,如果您使用对R值的常数引用,则延长R值的寿命以匹配参考的寿命。

这是不正确的。正确的语句是"如果您创建const rvalue引用和未命名的临时对象,则该临时对象的寿命会延长以匹配rvalue参考的寿命"。

没有临时对象意味着没有生命周期扩展。特别是,当方法返回参考时,它会返回参考。没有创建未命名的临时对象,因此没有什么可以延长其生命周期了。只有当它按值返回非参考的实际对象并且该对象未命名,因此有一个实际未命名的临时返回值对象,而RVO不会忽略RVO,是否有机会扩展该临时性的寿命。<<<<<<<</p>