gpt4 book ai didi

C++:按引用返回到按值返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:34 24 4
gpt4 key购买 nike

我一直在阅读 Myers 的书,并偶然发现了关于按引用/指针与按值返回的项目。重点是,如果我们的函数是这样的:

ClassA& AddSomething(ClassA classA)
{
ClassA tempClassA;
//... do something on tempClassA
return tempClassA;
}

这是行不通的,因为我们正在返回对在堆栈上创建的对象的引用,并且在函数完成后它已经死了。

他给出了两种解决方案:

  1. 在函数内部使用局部静态 ClassA。这有其问题,但至少我们可以确定该对象存在。
  2. 作为对象返回:

    ClassA AddSomething(ClassA classA)
    {
    ClassA tempClassA;
    //... do something on tempClassA
    return tempClassA;
    }

现在如果我要做:

ClassA obj1;
ClassA obj2 = AddSomething(obj1);

我现在的困惑是,当执行这一行时:

  1. 制作 tempClassA 的“拷贝”并将其传递给复制构造函数ClassA(初始化obj2)?或者
  2. tempClassA 将自身传递给 ClassA 的复制构造函数,因为复制构造函数需要引用。

所以基本上,传递给复制构造函数的是对 tempClassA 的引用(它是在函数内部的堆栈中创建的)或对 tempClassA 拷贝的引用。

此外,我的另一个问题是,我读到如果我获得函数局部变量的引用,在这种情况下局部变量将不会被删除。例如,

ClassA & classRef = AddSomething(obj1);

在这种情况下,如果 AddSomething() 返回一个引用,则 classRef 不会指向已删除的引用,因为局部变量将被保留。我的理解正确吗?

最佳答案

在最坏的情况下,您是对的:tempClassA 的拷贝被传递给复制构造函数。但是允许编译器删除该拷贝并在适当的位置构造结果 tempClassA。这称为“返回值优化”或 RVO。我不知道哪个编译器不这样做。

关于C++:按引用返回到按值返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12198770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com