X级 - >通过两种方式转换为Y 1)构造函数,以及2)转换函数 我理解单个参数构造函数用于转换。
在规范中:
隐式声明的复制构造函数不是显式构造函数;可以调用它进行隐式类型转换。
问题:
那么,这意味着不仅单个参数构造函数用于转换,还意味着复制构造函数?如果是这样,它使用的是哪种情况?任何示例代码片段?
如果问题非常重要,请耐心等待。
答案 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&
转换运算符的对象都可以隐式复制,即使这不是您想要的。触发此操作的最常见方法是从派生类复制到基类;这称为对象切片,因为副本与原始副本的类型不同,可能会丢失一些重要的属性或行为。