5

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

在规范中:

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

问题:

因此,这意味着不仅使用单参数构造函数进行转换,还使用复制构造函数?如果是这样,它使用哪种场景?任何示例代码片段?

如果这个问题非常有根据,请多多包涵。

4

4 回答 4

3

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

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

于 2012-07-20T14:33:40.650 回答
2

这基本上意味着您可以执行以下操作:

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

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

于 2012-07-20T14:40:42.770 回答
1

隐式复制构造函数是编译器为您编写的。它总是有形式

T(const T&);

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

于 2012-07-20T14:34:41.467 回答
1

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

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

8 类 X 的隐式声明的复制构造函数的形式为 X::X(const X&) 如果 — 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()));

于 2012-07-20T14:28:52.287 回答