Visual C++ 2010 / QT:为啥调用类的赋值运算符?

Posted

技术标签:

【中文标题】Visual C++ 2010 / QT:为啥调用类的赋值运算符?【英文标题】:Visual C++ 2010 / QT : Why assignment operator of the class was called?Visual C++ 2010 / QT:为什么调用类的赋值运算符? 【发布时间】:2014-06-18 19:59:21 【问题描述】:

我正在编写一个前同事编写的 ApxTrace 类

外部类会调用copyTrace()公共成员函数来复制一个ApxTrace类。 ApxTrace 类包含QVector 数据成员

代码如下:

void ApxTrace::copyTrace(ApxTrace& trace)

    *this = trace;

但是它给出了未处理的异常(QTCored4.dll):在软件的调试版本中写入位置0xfeeeefeee的访问冲突。有趣的是,代码在软件的发布版本中运行良好且正常。

callStack 显示调用了ApxTrace::operator=(const APxTrace &_that),但是,ApxTrace 类不支持赋值运算符。

请指教:

    为什么在这种情况下调用赋值运算符? 评论上面的CopyTrace() ?我知道这里不处理自我分配。 为什么它在软件的发布版本中运行良好?

【问题讨论】:

嗯,您的函数将trace 分配给*this。如果不调用赋值运算符,您希望发生什么? 至于 Q3,您的代码可能在某个地方存在未定义的行为,编译器会在您的调试版本中帮助您检查。未定义的行为包括看似有效、崩溃或getting you pregnant。 要回答“为什么它在软件的发布版本中运行良好”,答案是有缺陷的软件行为不可预测。修复错误,谜团就会消失。 非常感谢您的回复。非常感谢 【参考方案1】:

1.为什么在这种情况下调用赋值运算符?

因为它是在函数体中显式调用的

*this = trace;

如果没有显式定义,那么编译器会隐式定义它,前提是它没有被编译器定义为删除。

至于第三个问题,那么程序可能有未定义的行为。

【讨论】:

以上是关于Visual C++ 2010 / QT:为啥调用类的赋值运算符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥以下无法在 Visual Studio 2010 C++ 下编译?

如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?

为啥VS2013没有QT菜单 ??

Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?

Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?

为啥某些 Microsoft 语言被称为“视觉”? (Visual C#、Visual Basic .NET、Visual C++)