当构造函数是显式的时,它不用于隐式转换。在给定的代码段中,构造函数标记为explicit
。那么为什么foo obj1(10.25);
它正在工作并且在foo obj2=10.25;
中它不起作用?
#include <iostream>
class foo
{
int x;
public:
explicit foo( int x ):x(x)
{}
};
int main()
{
foo obj(10.25); // Not an error. Why ?
foo obj2 = 10.25; // Error
getchar();
return 0;
}
错误:错误C2440:'初始化':无法从'double'转换为'foo'
答案 0 :(得分:3)
这两种初始化形式在技术上是不同的。第一个(foo obj(10.25);
)称为直接初始化。第二个(foo obj = 10.25;
)称为复制初始化。
explicit
构造函数只能在显式初始化对象时使用。直接初始化是显式初始化对象的一种形式。显式初始化的另一种形式是使用强制转换。
答案 1 :(得分:1)
您的“非错误”案例是一种明确的结构。编译器正在做你告诉它的事情。
答案 2 :(得分:1)
在第一种情况下,您不隐式地将10.25
转换为foo
。您正在将其转换为int
,因此这不是错误。假设foo obj(10.25)
被视为对构造函数的直接调用,以初始化foo
对象。
在第二种情况下, 试图将10.25
隐式转换为foo
。标记为explicit
的构造函数将不予考虑(正如您所说),因此您将收到错误。
答案 3 :(得分:1)
这两行代码之间存在差异。第一行,
foo obj(10.25);
显式调用传递foo
的{{1}}构造函数。通常,此语法是构造函数调用。
第二行,
10.25
尝试隐式地从foo obj2 = 10.25;
转换为类型为10.25
的对象,这需要使用隐式转换构造函数。在此示例中,您已标记构造函数foo
,没有可用的隐式转换构造函数,因此编译器会生成错误。