编译器何时在C++中创建复制构造函数?

Luv*_*Luv 2 c++ copy-constructor

例如,在下面的代码中:

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)

为什么编译器不会为HowMany类自动创建复制构造函数,并且在调用f(h)时会发生逐位复制?

在什么情况下,编译器会创建默认的复制构造函数,在什么情况下它不会创建?

它输出为:

在构造h之后:objectCount = 1

f()中的x参数:objectCount = 1

~HowMany():objectCount = 0

在调用f()之后:objectCount = 0

~HowMany():objectCount = -1

~HowMany():objectCount = -2

许多人提前感谢

Mat*_*lia 9

在C++ 98和C++ 03中,编译器总是创建一个复制构造函数,它执行字段的成员复制,除非您明确指定自己编写了1.

这就是你的代码中发生的事情:编译器生成的拷贝构造函数没有做任何特别的事情 - 特别是,它没有增加objectCount- 所以你最终得到一个负对象计数(所有复制的对象都没有递增计数器) ,但他们确实减少了它).

要获得预期的结果,您必须编写如下内容:

HowMany(const HowMany &) { 
        objectCount++; 
}
Run Code Online (Sandbox Code Playgroud)
  1. 即使您编写了复制构造函数原型但未实现它,并且/或将其标记为私有,也不会创建默认的复制构造函数 - 实际上,这就是创建不可复制类的方法.C++ 11还支持一种特殊的语法,告诉编译器不要生成任何拷贝构造函数.