gpt4 book ai didi

c++ - 当它被忽略时,返回值(返回一个对象)会发生什么?

转载 作者:行者123 更新时间:2023-11-30 02:00:18 28 4
gpt4 key购买 nike

我正在通过 Thinking in C++ - Bruce Eckel 中的这个特定示例。我可以理解语句 1(在评论中提到)和语句 2,但很难理解 语句3 即使函数声明和定义需要返回一个对象用于复制目的,也没有返回。现在这里到底发生了什么?对于其他两个语句(1 和 2),我可以推断 编译器阻止了位复制,因为我们在我们的类中指定了一个复制构造函数,而是通过我们为在类中传递的对象定义的复制构造函数来处理它函数以及函数返回的对象。就在函数结束之前,函数内部的临时对象被复制为返回值,然后被销毁。我这样做对吗?

#include <fstream>
#include <string>
using namespace std;
ofstream out("HowMany2.out");
class HowMany2 {
string name; // Object identifier
static int objectCount;
public:
HowMany2(const string& id = "") : name(id) {
++objectCount;
print("HowMany2()");
}
~HowMany2() {
--objectCount;
print("~HowMany2()");
}
// The copy-constructor:
HowMany2(const HowMany2& h) : name(h.name) {
name += " copy";
++objectCount;
print("HowMany2(const HowMany2&)");
}
void print(const string& msg = "") const {
if(msg.size() != 0)
out << msg << endl;
out << '\t' << name << ": "<< "objectCount = "<< objectCount << endl;
}
};
int HowMany2::objectCount = 0;
// Pass and return BY VALUE:
HowMany2 f(HowMany2 x) {
x.print("x argument inside f()");
out << "Returning from f()" << endl;
return x;
}
int main() {
HowMany2 h("h");//statement 1
out << "Entering f()" << endl;
HowMany2 h2 = f(h);//statement 2
h2.print("h2 after call to f()");
out << "Call f(), no return value" << endl;
f(h);//statement 3
out << "After call to f()" << endl;
}

根据 Eckel 的说法,输出是:

HowMany2()
h: objectCount = 1
Entering f()
HowMany2(const HowMany2&)
h copy: objectCount = 2
x argument inside f()
h copy: objectCount = 2
Returning from f()
HowMany2(const HowMany2&)
h copy copy: objectCount = 3
~HowMany2()
h copy: objectCount = 2
h2 after call to f()
h copy copy: objectCount = 2
Thinking in C++ www.BruceEckel.com
Call f(), no return value
HowMany2(const HowMany2&)
h copy: objectCount = 3
x argument inside f()
h copy: objectCount = 3
Returning from f()
HowMany2(const HowMany2&)
h copy copy: objectCount = 4
~HowMany2()
h copy: objectCount = 3
~HowMany2()
h copy copy: objectCount = 2
After call to f()
~HowMany2()
h copy copy: objectCount = 1
~HowMany2()
h: objectCount = 0

另外,为什么我们不能为返回值分配额外的存储空间,以便我们可以在函数调用之前将它们存储在那里。它可以替代使用引用吗?提前致谢!!!

最佳答案

由于忽略了函数的返回值,因此没有复制构造函数调用。
请注意,即使在某些情况下可能需要复制,也允许大多数编译器通过复制省略 避免调用复制构造函数。

因为 x 是函数的局部对象(有值传递),一旦函数作用域 x 就会被销毁>{ } 结束。

关于c++ - 当它被忽略时,返回值(返回一个对象)会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15298760/

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