c++对象的位拷贝失败?为什么
C++ bitwise copy of object failing? Why?
这个问题是关于类对象的按位复制的。为什么没有调用构造函数,而是在下面的代码中调用析构函数?输出如下
HowMany h2 = f(h);//这里没有调用构造函数get;s。
after construction of h: objectCount = 1
x argument inside f(): objectCount = 1
~HowMany(): objectCount = 0
after call to f(): objectCount = 0
~HowMany(): objectCount = -1
~HowMany(): objectCount = -2
class HowMany {
static int objectCount;
public:
HowMany() { objectCount++; }
static void print(const string& msg = "") {
if(msg.size() != 0) cout << msg << ": ";
cout << "objectCount = "
<< objectCount << endl;
}
~HowMany() {
objectCount--;
print("~HowMany()");
}
};
int HowMany::objectCount = 0;
// Pass and return BY VALUE:
HowMany f(HowMany x) {
x.print("x argument inside f()");
return x;
}
int main() {
HowMany h;
HowMany::print("after construction of h");
HowMany h2 = f(h);
HowMany::print("after call to f()");
} ///:~
首先,c++没有"按位复制"。默认复制机制由编译器提供的复制构造函数实现。编译器提供的复制构造函数通过调用每个数据成员的特定复制语义递归地复制每个数据成员。在某些情况下,最终结果可能确实看起来像"逐位复制",但该语言并没有使用这样的低级概念。
其次,在本例中调用的构造函数还是复制构造函数。它的签名是HowMany::HowMany(const HowMany&)
这个构造函数是由编译器提供的,它确实被调用了,但你只是没有计算它。这就是为什么你的objectCount
计数器显示不平衡的结果。
因为缺少复制构造函数。在复制构造函数中也必须加1
添加这一行
HowMany(const HowMany& r) { objectCount++; }
您遇到的问题是,在您的函数f()
中调用复制构造函数,这不是正常的构造函数。当函数超出作用域时,将调用析构函数。提供像
HowMany::HowMany(const HowMany& other){
objectCount++;
}
尝试为HowMany创建一个复制构造函数。默认情况下,编译器会为您创建复制构造函数,您不会感觉到它被调用。
相关文章:
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 当给定默认值时,为什么此模板参数推导失败
- 为什么在使用typedef时类推导指南会失败
- 为什么 KMS drmModeSetCrtc() 在 X11 会话中运行时会失败并被拒绝权限?
- 如果我重新定义 sqrt 函数,为什么使用 std::sqrt 失败?
- 为什么模板参数推导失败?
- 为什么此对箭头 (->) 运算符的调用失败?
- 使用"std::function"和先前推断的模板参数替换失败 - 为什么?
- MSVS2010 C 控制台代码移植到MSVS2010 C GUI失败.为什么
- C++全局对象初始化失败——为什么?以及是否可以将对象放入.DATA部分
- RAII 失败 - 为什么此C++代码泄漏?- 在尝试块中加入 CTOR 阻止 DTOR
- 自动键入到自动方法失败.为什么
- C++模板参数推断失败.为什么
- c++对象的位拷贝失败?为什么
- 代码意外编译失败.为什么
- 尝试在构造函数中初始化数据成员,但失败.为什么
- 由于ECHILD错误,C++中的system()函数在一段时间内运行良好,但在返回-1时失败.为什么?
- BOOST/CSTDINT类型BOOST稀疏向量数组失败,为什么