c++对象的位拷贝失败?为什么

C++ bitwise copy of object failing? Why?

本文关键字:失败 为什么 拷贝 对象 c++      更新时间:2023-10-16

这个问题是关于类对象的按位复制的。为什么没有调用构造函数,而是在下面的代码中调用析构函数?输出如下

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创建一个复制构造函数。默认情况下,编译器会为您创建复制构造函数,您不会感觉到它被调用。