- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 64 位 Win7 上运行的 Visual C++ 2010 Express 中的 Win32 控制台项目。
#include "stdafx.h"
#include <conio.h>
class Num
{
private:
int value;
public:
friend Num operator+(Num, Num);
// Constructor
Num(int i)
{
printf("buidling %p\n", this);
this->value = i;
}
// Deconstructor
~Num()
{
printf("destroying %p\n", this);
}
// Getter for value
int getVal()
{
return value;
}
};
// Overload "+" operator
Num operator+(Num i, Num j)
{
printf("in operator+\n");
return (i.value + j.value);
}
int _tmain(int argc, _TCHAR* argv[])
{
Num a = Num(42) + 17;
printf("done %p %d\n", &a, a.getVal());
// Hold up
printf("Press any key to continue...\n");
_getch();
return 0;
}
当我在 VC++ 中观察构建过程时,创建了 Num(17) 的对象,然后是 Num(42) 的对象,然后是 Num a。到目前为止一切都很好。在销毁时,在销毁临时的 17 和 42 个对象之前销毁了第 4 个对象,最后是 a。 printf
表明这与重载的 operator+ 有关。看起来 VC++ 创建了 1 个额外的临时 Num 对象而不使用构造函数,然后将其复制到 a 并调用析构函数。相比之下,GCC 似乎创建了这个拷贝,然后将 a 分配给该内存,而不是创建这个拷贝。
两个问题:
最佳答案
您没有在Num
的复制构造函数 中输出任何内容,您需要添加:
Num(const Num &i)
{
printf("buidling %p\n", this);
this->value = i.value;
}
您的operator+()
实现正在按值 获取其输入Num
对象,因此正在制作拷贝。更改 operator+()
以通过const
引用 来获取对象以避免这种情况:
Num operator+(const Num &i, const Num &j)
最后,考虑将 operator+()
实现为 Num
的成员而不是独立函数:
class Num
{
private:
int value;
public:
//...
// Getter for value
int getVal() const
{
return value;
}
// Overload "+" operator
Num operator+(const Num &j) const
{
printf("in operator+\n");
return (value + j.getVal());
}
};
或者:
class Num
{
private:
int value;
public:
//...
// Getter for value
int getVal() const
{
return value;
}
// Overload "+=" operator
Num& operator+=(const Num &j)
{
printf("in operator+=\n");
value += j.getVal();
return *this;
}
// Overload "+" operator
Num operator+(const Num &j) const
{
printf("in operator+\n");
Num tmp(*this);
tmp += j;
return tmp;
}
};
关于c++ - 为什么 Visual Studio 会在这里调用析构函数,而 GCC 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31438084/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!