gpt4 book ai didi

c++ - 澄清智能指针的 operator* 和 operator-> 重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:28 25 4
gpt4 key购买 nike

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

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

p->->DoSomething();

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

感谢您的任何回答/澄清,对于最终糟糕的英语感到抱歉。

最佳答案

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

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"

所以如果你想让一个函数产生一个你不想复制的现有值,你必须将函数的返回类型声明为引用类型之一。如果返回类型不是引用类型,则会生成返回值的拷贝,调用者只能看到该拷贝。

关于c++ - 澄清智能指针的 operator* 和 operator-> 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22834812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com