显式构造函数和重载

时间:2013-01-09 08:45:22

标签: c++ operator-overloading raii explicit-constructor

template<typename T>
class RAII
{
public:

    explicit RAII( T* p = 0 ): p_(p){}

    ~RAII() {delete p_;}

    T& operator*() const { return p_;} 
    T* operator‐>() const{ return p_;}
};

//Usage example:
{
      RAII<std::vector<int>> r(new std::vector<int>());
      std::cout<<r­‐>size()<<std::endl;
} // The std::vector<int> is automatically deallocated

嗨伙计们:)

我的问题:在这种特定情况下,显式构造函数和两个运算符重载的目的是什么,以及它们如何在用法示例中使用?

提前致谢。

1 个答案:

答案 0 :(得分:0)

第一件事:有两个错误:p_未声明,operator*的回复应为return *p_


无论如何,显式是这样的,不能隐式调用构造函数。

考虑一下:

class Example {
public:
    int x;
    Example(int x) : x(x) {}
};

function ex(const Example& e) {
    std::cout << e.x;
}

int main() {
    ex(5);
    return 0;
}

你期望这个编译吗?确实如此。它输出5.原因是隐式构造了一个Example。基本上ex(5)会默默地变成ex(Example(5))。将构造函数标记为显式禁止此行为。如果您向构造函数添加了显式,那么这将是编译时错误。


对于运算符重载,这里有一个基本的“智能”指针。 (如果您不能使用具有标准化编译器的编译器,我可能会使用C ++ 11中的标准版本之一或者提升。)

运算符重载允许对象以特定方式对对象做出反应。在这种情况下,运算符重载允许类假装是指向它所包含的相同类型的指针。

RAII<std::vector<int>> r(new std::vector<int>());
std::cout<<r­‐>size()<<std::endl;

r假装是std::vector<int>* via运算符重载在这里。真正发生的是它被称为:

(r­.operator->())->size()

operator->会返回std::vector<int>*,因此第二个->正在访问该size()并调用operator[]方法。

您可能熟悉的另一个运算符重载示例是std :: vector的operator[]ostream返回对元素的引用。

运算符重载当然并不总是用于假装已经内置的东西。考虑operator<<的{​​{1}}。它将数据放入流中,而不是bitshift运算符。


更多信息:standard smart pointers / boost smart pointers / RAII / operator overloading

哦,你的代码违反了rule-of-three(或rule of five in C++11)。实际上,如果复制了,你的类将双重删除一个指针。

RAII<int> p(new int)
RAII<int> q = p;
//when q's destructor runs, bad bad things will happen since p's destructor already deleted the int.