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

->*也可以用于重载,不过这种模式不太常见。最经典的例子是智能指针。直接给出一个简版的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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值