2011-08-21 86 views
0

我对C++如何在需要做数学时强制类型转换有疑问。铸造上出乎意料的行为

下面的代码就是这样(即只有投射为int而不投射为双倍)才能正常工作和构建。如果我定义ENABLE_DOUBLE_CAST不会构建并投诉operator*。你知道为什么吗?

我的疑惑是2:

  1. 为什么不操作转换为加倍,但是它使用了一个双间的乘法为int。是因为隐含演员吗?
  2. 为什么WITH转换使双重启用(增加更清晰的语法),没有考虑到?

感谢

AFG

class CA{ 
    int _m; 
public: 
    CA(int a, int b){ 
    _m=a*b; 
    } 
    operator int(){ 
     std::cout<< "(CA int cast)" ; 
     return _m; 
    } 
#ifdef ENABLE_DOUBLE_CAST 
    operator double(){ 
     std::cout << "(CA double cat)"; 
     return 2.3 * _m; 
    } 
#endif 
}; 

int main(int argc, const char** argv){ 
    CA obj_2(10,20);     

    double total_1 = 100.0 * obj_2; 
    double total_2 = obj_2 * 100.0; 
    return 0; 
} 
+0

您已经听说过用户定义的转换,但没有用户定义的'operator *'?你需要定义后者。事实上,你必须定义两个版本的'operator *'。 – Nawaz

回答

3

为什么不操作转换为加倍,但是它使用了一个双间的乘法为int。是因为隐含演员吗?

是的,这是真的。
它使用operator int()obj_2转换为int,然后使用内置operator*(double, int)

为什么跟投给double启用(加入更加清晰的语法)并没有考虑到?

当您同时提供operator double()operator int()为您的类,它创建了一个不确定性,是否obj_2转换为intdouble因为有两个内置的运算符重载,它可以使用,即:

operator*(double, int) 
operator*(double, double) 

建议:
你应该重载operator*你的类,如果你想避免这名p由此产生的隐含转换和模糊性。

operator*(double,CA) and 
operator*(CA,int) 
+0

嗨Als。谢谢你清楚的解释。我总是认为C++内置的二元运算符仅限于WITH THE SAME TYPE的参数,所以运算符*(double,double)或运算符*(int,int)。基本上你是说C++也提供了不同类型的C++? –

+0

@Abruzzo Forte e Gentile:是所有内置类型的运算符运算符都隐含在C++中。只有当其中一个操作数是自定义类时,才可以重载它们。 –

1

的原因是,与两个蒙上你有暧昧的代码,编译器无法决定是否要使用INT投或双投,都是合法的。

关于隐式投射的规则很复杂,我不打算在这里试着重复它们(它会从字面上用页面和页面来覆盖所有内容)。但是如果它普遍同意为你的类添加隐式类型转换是一个坏主意,因为你所看到的那些含糊不清的问题。如果你想用操作符*来使用CA,那么最好为你的类定义操作符*。例如。

CA operator*(CA x, CA y) 
{ 
    ... 
} 

CA operator*(CA x, int y) 
{ 
    ... 
} 

CA operator*(CA x, double y) 
{ 
    ... 
} 

CA operator*(int x, CA y) 
{ 
    ... 
} 

CA operator*(double x, CA y) 
{ 
    ... 
} 
+0

嗨,约翰。阅读其他文章,关于避免它的一般规则是好的。如果你不介意的问题当这些演员操作员可能有点帮助时,是否有任何情况?如果一般来说他们必须避免,为什么他们仍然在附近?任何用例都置于你的头脑之上? –

+0

我认为这个用例是一个转换为布尔值,假设用你的'CA'类,你想用它作为布尔值,就像这个'CA ca = ...;如果(ca)...'。如果不引入大量模糊或令人惊讶的转换,实际上很难做到。它可以完成,它被称为_safe布尔idiom_,这是一个很好的链接更多阅读http://www.artima.com/cppsource/safebool.html – john

+0

谢谢先生!非常感激! –