名稱空間
變體
操作

轉換建構函式

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
 
 

未用 explicit 說明符宣告 且可以用單個引數呼叫的(C++11 前) 建構函式稱為轉換建構函式

與顯式建構函式不同,顯式建構函式僅在直接初始化(包括顯式轉換,如static_cast)期間考慮,而轉換建構函式也在複製初始化期間作為使用者定義轉換序列的一部分進行考慮。

據說轉換建構函式指定了從其引數(如果有)型別到其類型別的隱式轉換。請注意,非顯式使用者定義轉換函式也指定了隱式轉換。

隱式宣告和使用者定義的非顯式複製建構函式移動建構函式都是轉換建構函式。

[編輯] 示例

struct A
{
    A() { }         // converting constructor (since C++11)  
    A(int) { }      // converting constructor
    A(int, int) { } // converting constructor (since C++11)
};
 
struct B
{
    explicit B() { }
    explicit B(int) { }
    explicit B(int, int) { }
};
 
int main()
{
    A a1 = 1;      // OK: copy-initialization selects A::A(int)
    A a2(2);       // OK: direct-initialization selects A::A(int)
    A a3{4, 5};    // OK: direct-list-initialization selects A::A(int, int)
    A a4 = {4, 5}; // OK: copy-list-initialization selects A::A(int, int)
    A a5 = (A)1;   // OK: explicit cast performs static_cast, direct-initialization
 
//  B b1 = 1;      // error: copy-initialization does not consider B::B(int)
    B b2(2);       // OK: direct-initialization selects B::B(int)
    B b3{4, 5};    // OK: direct-list-initialization selects B::B(int, int)
//  B b4 = {4, 5}; // error: copy-list-initialization selected an explicit constructor
                   //        B::B(int, int)
    B b5 = (B)1;   // OK: explicit cast performs static_cast, direct-initialization
    B b6;          // OK, default-initialization
    B b7{};        // OK, direct-list-initialization
//  B b8 = {};     // error: copy-list-initialization selected an explicit constructor
                   //        B::B()
 
    [](...){}(a1, a4, a4, a5, b5); // may suppress "unused variable" warnings
}

[編輯] 另請參閱