不了解这种退货类型吗?

时间:2019-09-27 20:34:31

标签: c++ class inheritance

我正在阅读老师给我的一些代码,但我不太了解其中一行特定的代码。该函数返回一个int&。

return (*(Vector *)this)[i];

此return语句的运算符重载为“ []”。 []的另一个操作符重载在“ this”的基类中定义。基类是已定义的类“ Vector”。我不明白这行代码。

2 个答案:

答案 0 :(得分:5)

如有疑问,请简化。

第一步:

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性质。
第二行取消引用指针。
最后一行返回对象的第i个元素。

答案 1 :(得分:0)

  

我不明白这行代码。

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