簡體   English   中英

構造函數轉換在C ++中如何工作?

[英]How does constructor conversion work in C++?

構造函數轉換如何工作?

#include <iostream>
using namespace::std;

class One {
public:
    One() { cout<<"One"<<endl;}
};

class Two {
public:
    Two(const One&) {cout<<"Two(const One&)"<<endl;}
};

void f(Two) {cout<<"f(Two)"<<endl;}

int main() {
    One one;
    f(one); 
}

產生輸出

One
Two(const One&)
f(Two)

可以使用單個參數調用的任何構造函數都被視為implicit conversion constructor 這包括簡單的一參數情況和默認參數的用法。

在需要X並提供Y的任何上下文中都可以考慮此轉換,並且Y具有這種隱式轉換的可能性。 請注意,其他許多內置轉換也可以混合使用(例如調整const-ness,積分和fp促銷,轉換等)。規則是,在代碼中最多允許一個“用戶定義”隱式轉換混合。

在某些情況下,這可能非常令人驚訝,因此一般的建議是使任何此類ctor explicit 該關鍵字使轉換成為可能,但不是隱含的:您必須使用T()語法強制進行轉換。

例如,考慮一個std::vector ,它的ctor取size_t,設置初始大小。 這是明確的-否則您的foo(vector<double> const& )函數可能會被foo(42)錯誤地調用。

是正確的結果。 由於constructor不是explicit -隱式轉換有效(此處One被隱式轉換為Two )。

創建one ,然后在傳遞給f轉換為Two

編譯器必須在堆棧上創建Two實例的副本。 當您使用作為類One (或任何其他對象f()對象的參數調用f() ,編譯器將查看類Two定義,並嘗試查找以One (或任何其他)對象(或引用)作為參數的構造函數。 找到這樣的構造函數后,它將使用它構造對象。 之所以稱其為隱式,是因為編譯器在沒有干擾的情況下執行了此操作。

class Foo {
public:
    Foo(int number) {cout<<"Foo(int number)"<<endl;}
};

void f(Foo) {cout<<"f(Foo)"<<endl;}

int main() {
    f(24); 
} ///:~

輸出將是:Foo(int number)f(Foo)

Two(const One&) {cout<<"Two(const One&)"<<endl;}構造函數的意思是,您可以隨時從One隱式構造一個Two值。 當您調用f(one)它需要一個Two參數,它被賦予一個One ,因此編譯器將2和2放在一起,並說:“我將從One創建一個臨時的Two並完成對f()的調用”。每個人都會很高興。 歡呼!

暫無
暫無

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

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