【发布时间】:2014-04-03 10:28:07
【问题描述】:
自从我使用 c++ 以来,它已经过去了很多,所以这里(可能是愚蠢的)问题:
一个基本的智能指针对象应该表现得像一个普通的指针,所以在一个典型的实现中,我们将*和->运算符添加到对象中,如下所示:
template <class T> class auto_ptr
{
T* ptr;
public:
explicit auto_ptr(T* p = 0) : ptr(p) {}
~auto_ptr() {delete ptr;}
T& operator*() {return *ptr;}
T* operator->() {return ptr;}
// ...
};
现在,据我所知,c++ * 运算符(取消引用)代表:“通过 ptr 的值获取堆中指向的值”(对吗?),*ptr 的类型应该是T。那么我们为什么要返回地址呢?
T& operator*() {return *ptr;}
代替:
T operator*() {return *ptr;}
其次,通过具有以下 sn-p:
void foo()
{
auto_ptr<MyClass> p(new MyClass);
p->DoSomething();
}
现在,我如何通过编写p->DoSomething() 来访问ptr->DoSomething() 方法?逻辑上我会写错代码:
p->->DoSomething();
因为p-> 返回一个T*,然后我需要另一个-> 运算符来访问DoSomething() 方法。
感谢您的任何回答/澄清,并对最终英语不好表示抱歉。
【问题讨论】:
-
指针不必指向堆。
-
您不是在“返回地址”。这不是 C++ 的工作方式。请拿本书。
-
如果
T::operator->()存在且运算符被重载选择为最佳匹配函数,则表达式x->m被解释为x类型为x的类对象(x.operator->())->m解决机制
标签: c++ pointers operator-overloading smart-pointers