C++按位副本对象失败?为什么?

RDX*_*RDX 0 c++ bit-manipulation copy-constructor

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

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()");
} ///:~
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 6

首先,C++没有"按位复制".默认复制机制由编译器提供的复制构造函数实现.编译器提供的复制构造函数通过调用每个数据成员的特定复制语义来递归复制每个数据成员.在某些情况下,最终结果可能看起来像"按位复制",但是语言并没有使用这种低级概念.

其次,在这种情况下调用的构造函数也是复制构造函数.它的签名是

HowMany::HowMany(const HowMany&)
Run Code Online (Sandbox Code Playgroud)

这个构造函数是由编译器提供的,它确实被调用,但你根本就没有计算它.这就是为什么你的objectCount计数器显示失衡的结果.