簡體   English   中英

轉換構造函數說明

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM