类X - >通过两种方式1)的构造,和2)通过转换函数转换为Y。
我明白了用于转换的单参数构造函数。转换由构造
在说明书:
隐式声明的拷贝构造函数是不明确的构造函数;它可能被称为隐式类型转换。
问:
所以,这不仅意味着一个参数的构造函数用于转换,而且拷贝构造函数?如果是这样,它使用哪种情况?示例代码的任何片段?
如果问题很基础,请和我一起承担。
类X - >通过两种方式1)的构造,和2)通过转换函数转换为Y。
我明白了用于转换的单参数构造函数。转换由构造
在说明书:
隐式声明的拷贝构造函数是不明确的构造函数;它可能被称为隐式类型转换。
问:
所以,这不仅意味着一个参数的构造函数用于转换,而且拷贝构造函数?如果是这样,它使用哪种情况?示例代码的任何片段?
如果问题很基础,请和我一起承担。
隐式声明的拷贝构造函数不能使用转换,因为它是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()));
为了通用性,它可以被称为从T到T的转换。 – 2012-07-20 14:38:55
@SergeyK。 “可以”与“是”相同。这是一个转换还是不是? – curiousguy 2012-07-22 08:10:58
@curiousguy:在我的回答中检查.pdf – 2012-07-22 09:13:23
复制构造函数不是一个显式的构造函数,所以它将被用在任何可能的地方。复制构造函数将仅从相同类型“转换”,因此它不是完全意义上的转换。然而,为了通用性,将其称为一个是方便的。
阅读本文:http://www.keithschwarz.com/cs106l/winter20072008/handouts/180_Conversion_Constructors.pdf如果你想在转换构造的更多细节。
“_Copy构造函数不是一个明确的构造函数,所以它将在任何可能的地方使用。”一个显式的构造函数将被用于任何不可能的地方。 – curiousguy 2012-07-22 08:13:55
@curiousguy:他们很相似,不是吗? – 2012-07-22 09:14:10
隐含的拷贝构造函数是一个编译器为你写的。它总是有形式
T(const T&);
这意味着它有一个转换操作符来const T&
任何对象可以隐式复制,即便这不是你想要的。最常见的触发方法是从派生类复制一个基类;这称为对象切片,因为副本不会与原始文件具有相同的类型,并且可能会丢失一些重要的属性或行为。
并非总是如此。 12.8条款第8条款n3337草案。 – ForEveR 2012-07-20 14:35:21
@ForEveR,谢谢你指出 - 我不知道有例外。我仍然很难想象阅读该标准的实际边缘案例。 – 2012-07-20 14:41:38
@Mark:基本上,如果你的类包含'auto_ptr'(为什么你会因为'unique_ptr'被添加?),那么你的隐式生成的“拷贝构造函数”将具有移动语义。 – 2012-07-20 14:43:45
这基本上意味着你可以这样做:
struct A {};
A a;
A b = a;
如果拷贝构造函数被明确标出,将编译失败。您可以在结构中添加:explicit A(A const &) {}
并重新编译程序来测试它。
这是一个转换吗? – curiousguy 2012-07-22 08:10:04
复制构造函数是一个单参数构造函数。但它不会改变类型,所以我不知道为什么有人会把它称为“转换”。 – 2012-07-20 14:31:35
我很肯定我的妻子会因为“裸露”你而感到不安。 :-) – 2012-07-20 16:22:31
哈哈,杰里,谢谢你指出。 :) – Whoami 2012-07-25 07:16:55