命名空间
变体
操作

转换构造函数

来自 cppreference.com
< cpp‎ | 语言
 
 
C++ 语言
表达式
替代表示
字面量
布尔值 - 整数 - 浮点数
字符 - 字符串 - nullptr (C++11)
用户定义的 (C++11)
实用程序
属性 (C++11)
类型
typedef 声明
类型别名声明 (C++11)
强制转换
内存分配
特定于类的函数属性
explicit (C++11)
static

特殊成员函数
模板
其他
 
 

没有使用 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
}

[编辑] 另请参见