调用者如何知道应调用哪些同名成员函数
How does caller know which member functions of same name shall be called
我今天看到下面的代码。
我知道返回引用和返回常量引用的区别。
但是不知道什么时候会调用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;
}
But I don't know when T& operator()* will be called, and when const T& operator()const* will be called.
They have the same name.
在这种情况下,如果在const
对象上调用成员函数,会调用const
方法,non-const方法会调用non-const对象。
How does caller know which member functions of same name shall be called?
他们不知道,他们也不应该知道。重载集的全部意义在于调用者不知道调用了哪个确切的重载。这是一个实现细节。调用者从重载集调用函数时应使用相同的语法。
重载集的作者根据调用函数的参数来完成正确的事情。
如果您确实希望调用者知道调用了哪个函数,那么根本不要使用重载集,只需提供不同名称的函数即可。
我今天看到下面的代码。
我知道返回引用和返回常量引用的区别。
但是不知道什么时候会调用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;
}
But I don't know when T& operator()* will be called, and when const T& operator()const* will be called.
They have the same name.
在这种情况下,如果在const
对象上调用成员函数,会调用const
方法,non-const方法会调用non-const对象。
How does caller know which member functions of same name shall be called?
他们不知道,他们也不应该知道。重载集的全部意义在于调用者不知道调用了哪个确切的重载。这是一个实现细节。调用者从重载集调用函数时应使用相同的语法。
重载集的作者根据调用函数的参数来完成正确的事情。
如果您确实希望调用者知道调用了哪个函数,那么根本不要使用重载集,只需提供不同名称的函数即可。