名前空間
変種
操作

変換コンストラクタ

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

指定子 explicit 付きで宣言されていない引数1個で呼ぶことができる (C++11未満)コンストラクタは変換コンストラクタと言います。

直接初期化 (static_cast などの明示的な変換を含みます) のときにのみ考慮される explicit コンストラクタと異なり、変換コンストラクタはコピー初期化のときにも (ユーザ定義変換シーケンスの一部として) 考慮されます。

変換コンストラクタは引数 (もしあれば) の型からそのクラスの型への暗黙の変換を規定すると言われています。 非 explicit ユーザ定義変換関数も暗黙の変換を規定することに注意してください。

暗黙に宣言されたおよびユーザ定義された非 explicit コピーコンストラクタおよびムーブコンストラクタは変換コンストラクタです。

[編集]

struct A
{
    A() { }         // 変換コンストラクタ (C++11以上)。
    A(int) { }      // 変換コンストラクタ。
    A(int, int) { } // 変換コンストラクタ (C++11以上)。
};
 
struct B
{
    explicit B() { }
    explicit B(int) { }
    explicit B(int, int) { }
};
 
int main()
{
    A a1 = 1;      // OK、コピー初期化は A::A(int) を選択します。
    A a2(2);       // OK、直接初期化は A::A(int) を選択します。
    A a3{4, 5};    // OK、直接リスト初期化は A::A(int, int) を選択します。
    A a4 = {4, 5}; // OK、コピーリスト初期化は A::A(int, int) を選択します。
    A a5 = (A)1;   // OK、明示的なキャストは static_cast (直接初期化) を行います。
 
//  B b1 = 1;      // エラー、コピー初期化は B::B(int) を考慮しません。
    B b2(2);       // OK、直接初期化は B::B(int) を選択します。
    B b3{4, 5};    // OK、直接リスト初期化は B::B(int, int) を選択します。
//  B b4 = {4, 5}; // エラー、コピーリスト初期化は explicit コンストラクタ B::B(int, int) を選択しました。
    B b5 = (B)1;   // OK、明示的なキャストは static_cast (直接初期化) を行います。
    B b6;          // OK、デフォルト初期化。
    B b7{};        // OK、直接リスト初期化。
//  B b8 = {};     // エラー、コピーリスト初期化は explicit コンストラクタ B::B() を選択しました。
}