第一件事:有两个错误: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>*。真正发生的是它被称为:
(r.operator->())->size()
operator-> 返回一个std::vector<int>*,所以第二个-> 正在访问它并调用size() 方法。
您可能熟悉的另一个运算符重载示例是 std::vector 的operator[]。 operator[] 返回一个元素的引用。
运算符重载当然并不总是用来假装在做已经内置的东西。考虑ostream 的operator<<。它不是位移运算符,而是将数据放入流中。
更多信息: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.