由构造函数转换

时间:2012-07-20 14:24:56

标签: c++ constructor c++11 copy-constructor implicit-conversion

X级 - >通过两种方式转换为Y 1)构造函数,以及2)转换函数 我理解单个参数构造函数用于转换。

在规范中:

  

隐式声明的复制构造函数不是显式构造函数;可以调用它进行隐式类型转换。

问题:

那么,这意味着不仅单个参数构造函数用于转换,还意味着复制构造函数?如果是这样,它使用的是哪种情况?任何示例代码片段?

如果问题非常重要,请耐心等待。

4 个答案:

答案 0 :(得分:3)

复制构造函数不是显式构造函数,因此将尽可能使用它。复制构造函数将仅从相同类型“转换”,因此它不是完全意义上的转换。但是,为了通用起见,将它称为一个是很方便的。

如果您想了解有关转换构造函数的更多详细信息,请阅读本文:http://www.keithschwarz.com/cs106l/winter20072008/handouts/180_Conversion_Constructors.pdf

答案 1 :(得分:2)

这基本上意味着你可以做到:

struct A {};
A a;
A b = a;

如果复制构造函数被标记为显式无法编译。您可以通过向结构中添加:explicit A( A const & ) {}并重新编译程序来测试它。

答案 2 :(得分:1)

隐式声明的复制构造函数不能用于转换,因为它是copy-ctor,已声明为T(const T&)T(T&)

草案n3337标准12.8 C ++标准。

  

8类X的隐式声明的复制构造函数将具有   形式X :: X(const X&)if - X的每个直接或虚拟基类B.   复制构造函数,其第一个参数是const B&的类型。或const   volatile B&和 - 对于X的所有非静态数据成员   对于类型M(或其数组),每个这样的类类型具有副本   构造函数,其第一个参数是const M&的类型。或const   volatile M& .119否则,隐式声明的复制构造函数   将具有X :: X(X&)

的形式

由于复制c-tor不明确,您可以使用此类代码

struct So
{
};

int main()
{
    So s = So();
}

如果copy-ctor是明确的,则您只能使用So s((So()));

之类的初始化

答案 3 :(得分:1)

隐式复制构造函数是编译器为您编写的构造函数。它始终具有

形式
T(const T&);

这意味着任何具有const T&转换运算符的对象都可以隐式复制,即使这不是您想要的。触发此操作的最常见方法是从派生类复制到基类;这称为对象切片,因为副本与原始副本的类型不同,可能会丢失一些重要的属性或行为。