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