[英]When is a c++ constructor not called?
我有一种情况,似乎没有调用构造函数:
#include <iostream>
using namespace std;
int main ()
{
class yoyo
{
public:
int i;
yoyo()
{
i = 0;
cout << "defaultly initialized to 0" << endl;
}
yoyo (int j) : i(j)
{
cout << "initialized to " << j << endl;
}
};
int i;
yoyo a;
cout << "Hello1, i: " << a.i << endl;
yoyo b(5);
cout << "Hello2, i: " << b.i << endl;
yoyo c = b; /* 1 */
cout << "Hello3, i: " << c.i << endl;
return 0;
}
输出是:
defaultly initialized to 0
Hello1, i: 0
initialized to 5
Hello2, i: 5
Hello3, i: 5
(注意:Hello2和Hello3之间没有任何内容)
如果我将程序更改为如下所示:
#include <iostream>
using namespace std;
int main ()
{
class yoyo
{
public:
int i;
yoyo()
{
i = 0;
cout << "defaultly initialized to 0" << endl;
}
yoyo (int j) : i(j)
{
cout << "initialized to " << j << endl;
}
};
int i;
yoyo a;
cout << "Hello1, i: " << a.i << endl;
yoyo b(5);
cout << "Hello2, i: " << b.i << endl;
yoyo c; c = b; /* 1 */
cout << "Hello3, i: " << c.i << endl;
return 0;
}
(唯一的区别在于他标有/ * 1 * /的行)
现在的输出是:
defaultly initialized to 0
Hello1, i: 0
initialized to 5
Hello2, i: 5
defaultly initialized to 0
Hello3, i: 5
现在Hello2和Hello3之间有一个构造函数调用。 我的问题是,为什么在第一种情况下没有(可见)构造函数调用?
在第一种情况下:
yoyo c = b;
调用copy constructor
,在这种情况下,编译器会隐式生成copy constructor
。
yoyo c = b;
这称为复制初始化 ; 将调用编译器生成的复制构造函数,并使用该副本初始化c
。 此外,将调用c
的默认构造函数。
c = b;
这里,这不是初始化,这是赋值。 将在该行上调用编译器生成的赋值运算符。
在你的代码中,
yoyo c=b
将调用复制构造函数。如果要查看它被调用,则必须明确定义它。
例如:
yoyo(const yoyo& obj)
{
this->i=obj.i; cout<<"copy constructor"<<endl;
}
在第二种情况下,它将调用构造函数,然后调用赋值运算符
yoyo c; //constructor
c = b; //assignment operator for which only copying occurs
你可以重载赋值运算符,如下所示
yoyo& operator=(yoyo& obj)
{
i = obj.i;
cout << "assignment operator" << endl;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.