C ++对象和C样式转换问题

时间:2009-10-28 08:43:27

标签: c++ casting

我有以下由gcc编译的代码:

#include <iostream>
using namespace std;


class Buffer {
public:
   operator char *() { cout << "operator const * called" << endl; return buff; }
private:
    char buff[1024];
};


int main(int, char**) {
    Buffer b;
    (char *)b;  // Buffer::operator char * is called here

    return 0;
}

我看到的是在线调用Buffer :: operator char *:

(char *)b; 

为什么C样式转换调用在这里调用Buffer :: operator char *?

我虽然那个

static_cast<char *>(b);
应该使用

来显式调用Buffer :: operator char *。

5 个答案:

答案 0 :(得分:4)

如果您已完成(char *)(&b),则会进行C样式转换,并且不会调用operator char*。在这里,您尝试将对象转换为char *。由于没有自动转换编译器查找由您提供的运算符char *。如果您没有提供,则会收到编译错误,指出Buffer无法转换为char*

答案 1 :(得分:2)

在C ++中,C样式的强制转换决定static_castconst_castreinterpret_cast,具体取决于参数的类型和目标类型。

如果你想要C演员,你需要明确地使用reinterpret_cast

如果您不想要默认行为,请明确指定您想要的演员类型。

答案 2 :(得分:2)

5.4 / 2中的C ++标准说:

  

显式类型转换可以使用功能表示法(5.2.3),类型转换运算符(dynamic_caststatic_castreinterpret_castconst_cast)来表示,或者 cast 表示法。

   cast-expression:  
      unary-expression  
      ( type-id ) cast-expression  

你在这里有表达式,它调用用户定义的强制转换操作符。

答案 3 :(得分:2)

C风格的强制转换使编译器执行static_castconst_castreinterpret_cast或它们的某些组合。更确切地说:

  

执行的转化
* a const_cast (expr.const.cast), 

* a static_cast (expr.static.cast), 

* a static_cast followed by a const_cast, 

* a reinterpret_cast (expr.reinterpret.cast), or 

* a reinterpret_cast followed by a const_cast, 
     

可以使用演员表演   显式类型转换的表示法。   相同的语义限制和   行为适用。如果转换可以   被解释为不止一个   上面列出的方式,解释   列表中首先出现的是   使用,即使是由此产生的演员表   这种解释是不正确的。如果   转换可以解释为   不止一种方式作为static_cast   然后是const_cast,   转换是不正确的

由于规则有点复杂,最好避免C风格的演员表,以确定究竟是做了什么。

答案 4 :(得分:0)

C ++中的C风格转换真的意味着:嘿编译器,你为什么不帮助我在这里找出如何最好地转换为目标类型?并且,编译器有义务。在这里你有一个指定的转换运算符,它被调用,因为这是编译器认为最好的。

注意,除非你完全确定你想要达到的目的,否则不应该使用这个巧妙的小技巧(使用C风格的演员表)。