首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++复制构造函数

C++复制构造函数
EN

Stack Overflow用户
提问于 2009-01-02 12:08:00
回答 5查看 1.2K关注 0票数 0

我最近写了一段代码

代码语言:javascript
复制
SomeClass someObject;
mysqlpp::StoreQueryResult result = someObject.getResult();

其中SomeClass::getResult()如下所示:

代码语言:javascript
复制
mysqlpp::StoreQueryResult SomeClass::getResult()
{
mysqlpp::StoreQueryResult res = ...<something>...;
return res;
}

现在,使用第一个代码片段中的示例,当我编译和运行时,程序崩溃并发出ABORT信号。然后,我将第一个代码片段更改为:

代码语言:javascript
复制
SomeClass someObject;
mysqlpp::StoreQueryResult result(someObject.getResult());

它工作得很好。此外,为了尝试一下,我再次将其更改为:

代码语言:javascript
复制
SomeClass someObject;
mysqlpp::StoreQueryResult result;
result = someObject.getResult();

它也运行得很好。

现在,我只是弄不明白为什么第一个例子失败了,而接下来的两个例子成功了。据我所知,在第一个示例中,复制构造函数用于初始化结果。但这不也是第二个例子中的情况吗?那么为什么第二个例子会成功呢?第三个例子更有意义--因为没有使用复制常量,所以我们只是在构造之后赋值。

简而言之,这两者的区别是什么:

代码语言:javascript
复制
FooClass a = someObject.someMethodReturningFooClassInstance();

代码语言:javascript
复制
FooClass a(someObject.someMethodReturningFooClassInstance());?

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-01-02 12:10:44

我不认为这两种情况有什么不同。两次都调用相同的复制构造函数。

您确定这就是您在代码中编写的内容吗?

票数 4
EN

Stack Overflow用户

发布于 2009-01-02 12:14:00

您只需在复制构造函数中放置一个断点(甚至是printf语句),您就可以确切地知道它被调用的时间。所以不能代替基本的调试。;)

但是的,在前两种情况下应该调用复制构造函数。第三种情况使用赋值运算符。

您是否尝试过在调试器中运行它?它应该在一个ABORT信号时中断。

票数 1
EN

Stack Overflow用户

发布于 2009-01-02 12:15:42

在最纯粹的理论中,这两种情况都应该调用复制构造函数。但是,在这些情况下,编译器可以使用一种称为返回值优化(RVO)的方法。如果使用RVO,则不会调用复制构造函数。也许您的编译器在一种情况下使用RVO,而在另一种情况下不使用RVO?

编辑:仅适用于案例

代码语言:javascript
复制
SomeClass someObject;
mysqlpp::StoreQueryResult result;
result = someObject.getResult();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/406613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档