首页 > 解决方案 > 调用者如何知道应该调用哪些同名的成员函数

问题描述

我今天看到下面的代码。

我知道返回引用和返回 const 引用之间的区别。

但是不知道什么时候会调用T& operator () *,什么时候会调用const T& operator ()const *。

他们有相同的名字。

template<typename T>
class CSmartPtr
{
public:
    CSmartPtr(T *ptr = nullptr) :mptr(ptr) {}
    ~CSmartPtr() { delete mptr; }

    T& operator*() { return *mptr; }
    const T& operator*()const { return *mptr; }

private:
    T *mptr;
};
int main()
{
    CSmartPtr<int> ptr(new int);
    *ptr = 20;
    cout << *ptr << endl;
    return 0;
}

标签: c++referenceconstants

解决方案


但是我不知道什么时候会调用 T& operator()*,什么时候会调用 const T& operator()const*。

他们有相同的名字。

在这种情况下,如果在const对象上调用成员函数,const则将调用该方法,并且将为非常量对象调用非常量方法。

调用者如何知道应该调用哪些同名的成员函数?

他们不知道,也不应该知道。重载集的全部意义在于调用者不知道调用了哪个确切的重载。这是一个实现细节。当调用者从重载集中调用函数时,调用者应该使用相同的语法。

取决于调用函数的参数是否正确取决于重载集的作者。

如果您确实希望调用者知道调用了哪个函数,那么根本不要使用重载集,只需提供具有不同名称的函数即可。


推荐阅读