2012-07-20 58 views
5

类X - >通过两种方式1)的构造,和2)通过转换函数转换为Y。
我明白了用于转换的单参数构造函数。转换由构造

在说明书:

隐式声明的拷贝构造函数是不明确的构造函数;它可能被称为隐式类型转换。

问:

所以,这不仅意味着一个参数的构造函数用于转换,而且拷贝构造函数?如果是这样,它使用哪种情况?示例代码的任何片段?

如果问题很基础,请和我一起承担。

+1

复制构造函数是一个单参数构造函数。但它不会改变类型,所以我不知道为什么有人会把它称为“转换”。 – 2012-07-20 14:31:35

+1

我很肯定我的妻子会因为“裸露”你而感到不安。 :-) – 2012-07-20 16:22:31

+0

哈哈,杰里,谢谢你指出。 :) – Whoami 2012-07-25 07:16:55

回答

1

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

草案n3337帕12.8 C++标准。

8一类X中的隐式地声明的复制构造将具有 形式X :: X(常量X &)如果 - X的每个直接或虚基类B具有 一个拷贝构造,其第一参数是类型为const B的&或const 挥发性乙&,以及 - 用于X的属于类类型M的 (或其阵列)中的所有非静态数据成员,每个这样的类型具有复印 构造,其第一参数的类型为常量的M个&或const 挥发性中号& 0.119否则,隐式声明d拷贝构造函数 将有形式X :: X(X &)

由于复制C-TOR不明确的,你可以使用这样的代码

struct So 
{ 
}; 

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

如果copy-ctor是明确的,你可以只使用初始化像So s((So()));

+0

为了通用性,它可以被称为从T到T的转换。 – 2012-07-20 14:38:55

+0

@SergeyK。 “可以”与“是”相同。这是一个转换还是不是? – curiousguy 2012-07-22 08:10:58

+0

@curiousguy:在我的回答中检查.pdf – 2012-07-22 09:13:23

3

复制构造函数不是一个显式的构造函数,所以它将被用在任何可能的地方。复制构造函数将仅从相同类型“转换”,因此它不是完全意义上的转换。然而,为了通用性,将其称为一个是方便的。

阅读本文:http://www.keithschwarz.com/cs106l/winter20072008/handouts/180_Conversion_Constructors.pdf如果你想在转换构造的更多细节。

+0

“_Copy构造函数不是一个明确的构造函数,所以它将在任何可能的地方使用。”一个显式的构造函数将被用于任何不可能的地方。 – curiousguy 2012-07-22 08:13:55

+0

@curiousguy:他们很相似,不是吗? – 2012-07-22 09:14:10

1

隐含的拷贝构造函数是一个编译器为你写的。它总是有形式

T(const T&); 

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

+3

并非总是如此。 12.8条款第8条款n3337草案。 – ForEveR 2012-07-20 14:35:21

+0

@ForEveR,谢谢你指出 - 我不知道有例外。我仍然很难想象阅读该标准的实际边缘案例。 – 2012-07-20 14:41:38

+1

@Mark:基本上,如果你的类包含'auto_ptr'(为什么你会因为'unique_ptr'被添加?),那么你的隐式生成的“拷贝构造函数”将具有移动语义。 – 2012-07-20 14:43:45

2

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

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

如果拷贝构造函数被明确标出,将编译失败。您可以在结构中添加:explicit A(A const &) {}并重新编译程序来测试它。

+0

这是一个转换吗? – curiousguy 2012-07-22 08:10:04