gpt4 book ai didi

c++ - 如何使 C++ 类成为 "return"? (或用户定义类型的返回动态)

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

当我们在函数内部使用 return 语句返回用户定义的类型(特别是类)时会发生什么。假设我们有一个名为“DMatrix”的 c++ 类

DMatrix someFunc()
{
DMatrix mymat;
/* Some operations on this matrix */
return mymat;
};

在 main() 内部的某处,我想做:

DMatrix d;
d = someFunc();

在堆栈操作方面究竟调用了什么?
我想为了使类 DMatrix 可返回,有一个复制构造函数(以便可以通过引用传递此类的实例)和定义 = 运算符就足够了。我对吗?

背后的动机:这个问题背后的动机有两个。 1)我使用一个定义了矩阵类型的库,比方说 DMatrix。我可以编写返回 DMatrix 类型的函数吗?
2)第二个原因当然是为了更深入地了解自定义数据类型的返回与基本数据类型(如 int 或 double)的返回之间在堆栈级别的区别。因此,在 C++ 中编写更好的类。可能这必须成为一个单独的问题。

最佳答案

您应该实现复制构造函数,但请注意,这实际上是您可能会在二进制文件的“调试”版本和“发布”版本之间看到语义差异的有趣场景之一。大多数编译器将优化对复制构造函数的调用并执行 return value optimization在这种情况下。在这种情况下,规范特别允许编译器使用复制构造函数执行此操作。

尝试在你的复制构造函数中打印一些东西,你会发现当你运行发布版本时它不会被打印但它会在调试版本中打印。

此外,如果您使用的是 C++11,则当您返回 mymat 时,mymat 将成为所谓的右值(临时对象)。在 C++11 中声明一个 move constructor 是可能的以及一个复制构造函数,它将显式地将您的对象移动到外部范围而不执行任何复制。

关于c++ - 如何使 C++ 类成为 "return"? (或用户定义类型的返回动态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13290431/

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