->
和*
也可以用于重载,不过这种模式不太常见。最经典的例子是智能指针。直接给出一个简版的unique_ptr
的代码示例,说明这两者的重载模式:
#include <iostream>
template <typename T>
class UniquePointer {
public:
UniquePointer(T* val = nullptr) {
m_val = val;
}
~UniquePointer() { // 退出时执行析构
if (m_val != nullptr) {
delete m_val;
m_val = nullptr;
}
}
UniquePointer(UniquePointer&) = delete; // 禁止拷贝构造
UniquePointer(UniquePointer&&) = delete;
UniquePointer operator=(UniquePointer& sp) = delete;
UniquePointer operator=(T* val) {
m_val = val;
}
T* operator->() { // 这里重载->,当然,函数体内部可以添加其他的默认操作
/* if (m_val == nullptr) {
* m_val = new Foo();
* }
**/
return m_val;
}
T& operator*() { // 重载 *
/* if (m_val == nullptr) {
* m_val = new Foo();
* }
**/
return *m_val;
}
private:
T* m_val{nullptr};
};
struct Foo {
void foo() {
std::cout << "foo\n";
}
};
int main() {
UniquePointer<Foo> up(new Foo());
// 调用重载的方法
up->foo();
auto& foo = *up;
foo.foo();
return 0;
}