class classname(value); &安培; class classname = value;构造函数显式时的差异

时间:2011-01-16 21:43:44

标签: c++ constructor implicit

当构造函数是显式的时,它不用于隐式转换。在给定的代码段中,构造函数标记为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'

4 个答案:

答案 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,没有可用的隐式转换构造函数,因此编译器会生成错误。