C++重载->和*运算符

->*也可以用于重载,不过这种模式不太常见。最经典的例子是智能指针。直接给出一个简版的unique_ptr的代码示例,说明这两者的重载模式:

#include 

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;
}

你可能感兴趣的:(C++笔记)