0

当构造函数是显式的时,它不用于隐式转换。在给定的代码段中,构造函数被标记为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:“正在初始化”:无法从“双”转换为“富”

4

4 回答 4

3

这两种初始化形式在技术上是不同的。第一个 ( foo obj(10.25);) 称为直接初始化。第二个 ( foo obj = 10.25;) 称为复制初始化。

explicit构造函数只能在显式初始化对象时使用。直接初始化是显式初始化对象的一种形式。显式初始化的另一种形式是使用强制转换。

于 2011-01-16T21:45:46.933 回答
1

在第一种情况下,您不会隐式转换10.25foo. 您正在将其转换为int,因此这不是错误。说foo obj(10.25)是直接调用构造函数来初始化一个foo对象。

在第二种情况下,您试图隐式转换10.25foo. 标记的构造函数explicit将不被考虑(正如你所说的那样),因此你会得到一个错误。

于 2011-01-16T21:49:40.067 回答
1

这两行代码是有区别的。第一行,

foo obj(10.25);

显式调用foo传入的构造函数10.25。通常,此语法是构造函数调用。

第二行,

foo obj2 = 10.25;

尝试隐式转换 from10.25到 type 的对象foo,这需要使用隐式转换构造函数。在此示例中,您已标记了构造函数explicit,没有可用的隐式转换构造函数,因此编译器会生成错误。

于 2011-01-16T21:50:40.500 回答
1

您的“不是错误”案例是一个明确的结构。编译器正在做你告诉它做的事情。

于 2011-01-16T21:46:51.450 回答