[英]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.