C ++:异常的运算符重载

时间:2014-01-29 13:06:20

标签: c++ operator-overloading operator-keyword static-cast

运营商在这里超载了什么?

operator T * ()

我知道operator方法具有以下结构:

type operator operator-symbol ( parameter-list )

假设我们有以下代码

template<typename T> class SmartPtr
{
public:
    SmartPtr(T* data): member(data) {}
    T* member;      
    T& operator * () { return *member; }  //usage: *TObj    
    T*& operator () () { return member; }  //usage: TObj()
    operator T * () { return member; }   //usage: ???
};

如果您在ideone上尝试,则无编译错误。那么这里发生了什么?

ADD: {I}我是否正确static_cast<T*>(TObj)拨打operator T *?我已经尝试过了here

3 个答案:

答案 0 :(得分:9)

这是一个转换运算符,它允许将类转换为T*。用法:

T * p = TObj;

智能指针提供此功能可能不是一个好主意,因为它很容易意外地获取非智能指针。标准智能指针通过get()函数提供显式转换,以防止意外转换。

答案 1 :(得分:0)

SmartPtr对象出现在表达式中时调用此运算符,但编译器没有可用于解析其使用的函数:如果T*使用SmartPtr是合法的}}出现,调用operator T*()函数生成一个函数。这意味着my_smartptr->my_T_member可以正常工作,f(T*); f(my_smart_ptr_to_T);也可以。类似地,iostream在C ++ 11中有operator bool()(C ++ 03中operator void*(),原因太麻烦而无法理解)。它与单个参数的隐式构造函数相反,如果编译器不能使用参数找到有效匹配,它可能会尝试使用该参数构造一个对象来代替使用。

答案 2 :(得分:0)

operator T * () { return member; }

它是一个所谓的转换运算符。它将SmartPtr类型的对象转换为类型T *。而且它是一个隐式转换操作符。因此,当编译器等待类型为T *的对象时,您可以使用SmartPtr类型的对象。 如果要添加关键字explicit,则可以使此转换运算符显式。例如

explicit operator T * () { return member; }