看不懂这个返回类型?

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]; 返回基类的下标运算符的结果。

【讨论】:

以上是关于看不懂这个返回类型?的主要内容,如果未能解决你的问题,请参考以下文章

看不懂源码?先来恶补一波Object原型吧

c++模板如何学好啊?愁,看不懂,求指导

看不懂这个js代码

刷机英文版Recovery是啥?选项看不懂怎么办

你们看不懂为什么写这个博客吧

struts中的一条for语句,看不懂,请高手指教。