关于智能指针运算符*和运算符>重载的说明

Clarification on smart pointer's operator* and operator-> overloading

本文关键字:运算符 gt 重载 说明 智能 指针 于智能      更新时间:2023-10-16

自从我使用 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;}

其次,通过具有以下代码片段:

void foo()
{
    auto_ptr<MyClass> p(new MyClass);
    p->DoSomething();
}

现在,如何通过编写ptr->DoSomething() p->DoSomething()来访问该方法?从逻辑上讲,我会写错误的代码:

p->->DoSomething();

因为p->返回一个T*,然后我需要另一个->运算符来访问DoSomething()方法。

感谢您的任何回答/澄清,并为最终英语不好而抱歉。

在C++中,当你计算一个函数时,你最终会得到一个值(除非函数的返回类型是void)。值的类型始终是对象类型。所以当你说f()时,该表达式是类型为 T 的值。但是,有不同的价值类别

T    f();    =>   f() is a prvalue, passed along by copy
T &  f();    =>   f() is an lvalue, the same object that is bound to "return"
T && f();    =>   f() is an xvalue, the same object that is bound to "return"

因此,如果您希望函数生成不想复制的现有值,则必须将函数的返回类型声明为引用类型之一。如果返回类型不是引用类型,则将创建返回值的副本,并且调用方只能看到该副本。

取消引用运算符返回一个引用,因为这样你可以做例如

*somePointer = someValue;

并且somePointer指向的值将更改为someValue.如果按值返回,则上述表达式将具有分配给的临时值,然后该临时值将被破坏并丢失更改。

您不必编写p->->DoSomething的原因是operator->递归,直到找到不是指针的内容,T*

p->找到T*指针,所以它向下另一个级别并找到一个MyClass对象,所以它停止并对其执行正常operator.

请注意,在这种情况下,智能指针不被视为指针。