看不懂这个返回类型?
Posted
技术标签:
【中文标题】看不懂这个返回类型?【英文标题】:Don’t understand this return type? 【发布时间】:2019-09-27 20:34:31 【问题描述】:我正在阅读我的老师给我的一些代码,但我不太理解某一行特定的代码。该函数返回一个 int&。
return (*(Vector *)this)[i];
此返回语句位于“[]”的运算符重载中。在“this”的基类中还定义了另一个 [] 运算符重载。基类是定义的类“Vector”。我不明白这行代码。
【问题讨论】:
1) 类型对话 const 指针 @this 到 Vector* 2) 取消引用指针 3) 通过 int& operator[](int indx) 获取它的值 首先将this
转换为 Vector*
- 完全合法的操作,因为该类派生自 Vector。然后通过 * 操作符取消引用,最后应用 Vector 的 [] 操作符。
一个更好的方法,应该更容易理解是return static_cast<Vector&>(*this)[i];
。它清楚地表明您希望 *this
被视为 Vector&
并且您为此调用 []
。
告诉你的老师停止使用 C 风格的演员表。
如果派生版本所做的只是调用基本版本,那么根本没有理由重新定义它。该行与this->Vector::operator[](i)
基本相同(除了这个版本是类型安全的),它只是选择operator[]
的显式版本并调用它
【参考方案1】:
如有疑问,请简化。
第一步:
return (*(Vector *)this)[i];
可以
Vector* ptr = (Vector*)this;
return (*ptr)[i];
第二步:
return (*ptr)[i];
可以
Vector& ref = *ptr;
return ref[i];
两种简化放在一起,一行
return (*(Vector *)this)[i];
等价于
Vector* ptr = (Vector*)this;
Vector& ref = *ptr;
return ref[i];
当成员函数是 const
成员函数时,this
的类型为 Vector const* const
。
第一行删除了对象指针的const
-ness。
第二行取消引用指针。
最后一行返回对象的i
-th 元素。
【讨论】:
【参考方案2】:这行代码我没看懂。
return (*(Vector *)this)[i];
假设T
是一个类型,T*
是类型“指向T
”的指针。因此,鉴于Vector
是一个类型,Vector*
是一个指向Vector
的指针。
this
是一个特殊名称,它是指向成员函数的对象参数的指针。
(T)expr
是显式类型转换。它对表达式执行静态转换、重新解释转换或 const 转换中的一种或组合,将值转换为 T
类型。在表达式(Vector *)this
中,this
指针被转换为Vector*
类型。鉴于Vector
是一个基类,这是一个静态转换,更具体地说,是一个向上转换,因为我们在继承层次结构中进行向上转换。
*expr
中的一元运算符*
是间接运算符。它通过指针(在这种情况下)操作数间接并产生指向对象的左值。因此,*(Vector *)this
将是Vector
类型的左值,它是this
的基类子对象。
expr[index]
是下标运算符。因此,(*(Vector *)this)[i]
在this
对象上调用基类的下标运算符。
最后return expr;
语句跳出函数,将表达式的值返回给调用者。因此,return (*(Vector *)this)[i];
返回基类的下标运算符的结果。
【讨论】:
以上是关于看不懂这个返回类型?的主要内容,如果未能解决你的问题,请参考以下文章