簡體   English   中英

C++ 顯式轉換和隱式轉換

[英]C++ explicit conversion and implicit conversion

看下面兩種方式新建class Y的object:

(1)

X x;
Y y(x);//explicit conversion

(2)

X x;
Y y = x;//implicit conversion

第一種方式使用顯式轉換,另一種方式使用隱式轉換。但是,我不太明白它們是如何工作的。它們有什么區別?有人可以為我解釋一下嗎?越詳細越好。非常感謝。

第一個稱為直接初始化,而第二個稱為復制初始化 假設Y有一個接受X (或對它的引用)的構造函數,直接初始化將直接調用該構造函數,而不管該構造函數是否被標記為implicit 語義上的復制初始化等同於:

Y y( implicit_conversion<Y>(x) );

也就是說,通過隱式轉換將參數轉換為目標類型,然后調用復制構造函數來初始化變量。 在現實生活中,編譯器將刪除復制並轉換為目標變量,但編譯器必須檢查是否存在從XY隱式轉換,並且復制構造函數是可訪問的。

實際上,兩者都是隱式轉換,假設您的 class "Y" 具有如下構造函數:

public:
  Y(X &x)

帶有單個參數的 class 構造函數將為您執行轉換。

為避免隱式構造,請使用以下其中一項(根據您的情況可能更適合您):

  • 不要用單個參數聲明構造函數
  • 在構造函數聲明中使用explicit關鍵字
  • 使用中間值 class(換句話說,只允許“Y”由“Z”初始化,class 永遠不會直接分配給“Y”)
  • 使用 static 成員 function 使用“X”顯式“創建”“Y”的實例(因為成員 function 與 class 的實例無關

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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