我用C ++编写了这个小代码片段,输出也附加了。 我无法理解为什么构造函数只被调用一次,而我可以看到两个调用是为了析构函数。
据我所知,默认构造函数和重载赋值运算符应该在第28行调用。
有人可以对此有所了解:
1 #include <iostream>
2 using namespace std;
3
4 class ABC {
5 char c;
6 public:
7 ABC() {
8 cout << "default" << endl;
9 }
10 ABC(char c) {
11 this->c = c;
12 cout << c << endl;
13 }
14 ~ABC() {
15 cout << hex << this << " destructor " << c << endl;
16 }
17 void method() {
18 cout << "method" << endl;
19 }
20 void operator= (const ABC& a) {
21 cout << "operator" << endl;
22 }
23
24 };
25
26 int main() {
27 ABC b('b');
28 ABC a = b;
29 }
Output in g++ version 4.0.1:
~/src$ g++ test.cpp
~/src$ ./a.out
b
0xbffff0ee destructor b
0xbffff0ef destructor b
答案 0 :(得分:15)
ABC a = b;
复制构造函数不是赋值运算符!你可以像这样重新定义它是由编译器生成的:
ABC(const ABC& other)
{
c = other.c;
cout << c << " copy constructor" << endl;
}
如果你真的坚持不使用复制构造函数,你可以像你的类一样添加转换操作符并忘记复制构造函数!
operator char()
{
return c;
}
答案 1 :(得分:11)
您刚刚调用复制构造函数的代码,这是定义:
ABC(const ABC& a):c(a.c){
cout << "copying " << hex << &a << endl;
}
你应该看到这样的输出:
b
copying 0x7fffebc0e02f
0x7fffebc0e02e destructor b
0x7fffebc0e02f destructor b
如果要调用默认构造函数,然后调用赋值运算符,则必须使用两个单独的语句:
ABC b('b');
ABC a;
a = b;
答案 2 :(得分:0)
查看您的修改后的代码
#include <iostream>
using namespace std;
class ABC {
char c;
public:
ABC() {
cout << "default" << endl;
}
ABC(char c)
{
cout<<"parameterized constructor called\n";/////overloaded constructor called for the first line in main
this->c = c;
cout << c << endl;
}
ABC(ABC &c)
{
cout<<"Copy cons\n";//copy constructor is called for the second line in main
}
~ABC() {
cout << hex << this << " destructor " << c << endl;
}
void method() {
cout << "method" << endl;
}
void operator= (const ABC& a) {
}
};
int main()
{
ABC b('b');//////here parameterized constructor is called i.e <ABC(char c)>
ABC a = b;/////////Here the copy constructor is called not the default one.(total 2 object created so the destructor is called twice!)
}
程序的输出是
parameterized constructor called
b
Copy cons
0x7fff5fbff820 destructor �
0x7fff5fbff828 destructor b
现在让我们来解释一下原因 复制构造函数在3种情况下被调用 1.当一个对象初始化时 2.将对象作为参数传递给函数时 3.当从函数返回一个对象时。
如果您没有指定自己的复制构造函数,那么编译器会实现自己的复制构造函数,该构造函数会逐位复制对象。您尚未指定自己的复制构造函数,这就是为什么您无法跟踪从代码创建的两个对象的原因。 感谢