2011-12-30 159 views

回答

10

即其中Bar实例转换成Foo隐式用户定义转换功能。

Bar bar; 

Foo foo = bar; // bar implicitly converts into Foo. 

这是因为如果你写的:

Foo foo = Foo(25); 

如果你已经这样的转换功能,那么你可以调用这个:

void f(Foo foo); //a function which accepts Foo 

f(bar); // bar implicitly converts into Foo. 

所以这种转换可能不太合适,因为它可能会导致问题,并产生意想不到的结果。为了避免这种情况,可以使转换功能明确为(在C++ 11只):

//valid in C++11 only 

class Bar { 
    explicit operator Foo() { return Foo(25); } 
}; 

现在,这两个会给予错误:

Foo foo = bar; //error 
f(bar); //error 

但是,以下是允许:

Foo foo = static_cast<Foo>(bar); //Ok 
f(static_cast<Foo>(bar)); //Ok 
+3

快速的手指,你已经得到了:) – Chad 2011-12-30 20:16:53

+0

使用'在C++ 11中引入了“显式”用于运算符转换? AFAIR只有构造函数可以明确在c + + 03中,或许我没记错...... – 2011-12-30 20:24:12

+0

@Als:你说得对。在C++ 03中,只有构造函数可以是显式的。我在答复中明确表达了这一点。 – Nawaz 2011-12-30 20:25:22

0

这是cast operator的超负荷。我能找到的最好的文档是MSDN

基本上,如果你有一个Bar,你可以将它转换为一种构造具有特定值Foo

Bar b; 
Foo f = b; 
相关问题