关于智能指针运算符*和运算符>重载的说明
Clarification on smart pointer's operator* and operator-> overloading
自从我使用 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.
。
请注意,在这种情况下,智能指针不被视为指针。
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 是否需要使用 - &gt;运算符在C 中调用成员函数时