【发布时间】:2018-02-24 22:30:24
【问题描述】:
学习 C++,关于构造函数的问题很少。
请考虑以下代码:
#include<stdio.h>
#include<iostream>
// Case 1
class CFoo
{
public:
CFoo() { printf("CFoo constructor: user-defined default\n"); }
~CFoo() { printf("CFoo destructor\n"); }
};
void testFoo()
{
CFoo foo0; // A way to use default constructor
CFoo foo1 = CFoo(); // Another way to use default constructor
CFoo foo2 = CFoo(foo1); // Using implicit copy constructor
// Output:
// CFoo constructor: user-defined default
// CFoo constructor: user-defined default
// CFoo destructor
// CFoo destructor
// CFoo destructor
// CFoo destructor
}
// Case 2
class CBar
{
public:
CBar() { printf("CBar constructor: user-defined default\n"); }
CBar(CBar & other) = delete;
~CBar() { printf("CBar destructor\n"); }
};
void testBar()
{
CBar bar0;
// line 44: error C2280: 'CBar::CBar(CBar &)': attempting to reference a deleted function
// line 34: note: see declaration of 'CBar::CBar'
// line 34: note: 'CBar::CBar(CBar &)' : function was explicitly deleted
// CBar bar1 = CBar(); // Why this has anything to do with the copy constructor?
// Output:
// CBar constructor: user-defined default
// CBar destructor
}
// Case 3
class CBaz
{
public:
CBaz() { printf("CBaz constructor: user-defined default\n"); }
CBaz(CBaz & other) { printf("CBaz constructor: user-defined copy\n"); }
~CBaz() { printf("CBaz destructor\n"); }
};
void testBaz()
{
CBaz baz0;
CBaz baz1 = CBaz();
CBaz baz2 = CBaz(baz1);
// Output:
// CBaz constructor: user-defined default
// CBaz constructor: user-defined default
// CBaz constructor: user-defined copy
// CBaz destructor
// CBaz destructor
// CBaz destructor
}
// main
void main() {
testFoo();
testBar();
testBaz();
std::cin.get();
}
问题:
为什么我不能像使用
CFoo那样创建CBar的实例为CBar bar1 = CBar();?testFoo调用 4 个析构函数。其中 3 个用于 foo0、foo1 和 foo2。 4th从哪里来?testBaz具有相同的结构,但只调用了 3 个析构函数。CFoo和CBaz之间的唯一区别是CBaz具有用户定义的复制构造函数。
【问题讨论】:
-
CBar bar1 = CBar();不是赋值,而是使用复制/移动构造函数进行的初始化。
标签: c++ constructor copy destructor