[英]Conversion constructor clarification
#include<iostream>
using namespace std;
class Test
{
private:
int x;
public:
Test(int i)
{
cout<<"Conversion constructor called..."<<endl;
x = i;
}
~Test()
{
cout<<"Destructor called..."<<endl;
}
void show()
{
cout<<" x = "<<x<<endl;
}
};
int main()
{
Test t(20);
t.show();
t = 30;
t.show();
return 0;
}
輸出:
Conversion constructor called...
x = 20
Conversion constructor called...
Destructor called...
x = 30
Destructor called...
當我在做t = 30時,為什么要調用構造函數和析構函數? 請解釋。非常感謝。
沒有重載=
可用於直接從int
值賦值。 您的轉換構造函數允許將30
轉換為Test
對象,然后可以使用隱式生成的復制構造函數(復制每個成員)來分配該對象。 所以你的任務相當於
t = Test(30);
創建和銷毀要分配的臨時對象。
您可以通過提供賦值運算符來避免這種情況:
Test & operator=(int i) {x = i;}
在這種情況下,分配可以直接使用它,等效於
t.operator=(30);
當您寫t = 30
,編譯器將創建一個臨時Test
變量,該變量將使用轉換構造函數創建。 在將t
設置t
等於此臨時變量之后,該臨時變量將被銷毀,並調用析構函數。
由於已經定義了t
,因此無法通過轉換構造函數對其進行初始化。
而是創建一個temporay Test
對象,調用operator =,然后將其刪除。
“為什么要調用構造函數和析構函數?”
因為構造了一個(隱式的) Test
臨時實例,將其分配給t
並在分配后銷毀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.