将指针传递给类/对象而不是使用指向当前地址对象的“this”指针来访问成员变量是否有原因或好处?这个归结为个人偏好(对我而言,第二个版本似乎有点多余)但是它可能用于代码重用?
class Box
{
public:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
double getVolume(Box *box);
};
double Box::getVolume(void)
{
return length * breadth * height;
}
VS
double Box::getVolume(Box *box)
{
return this->length * this->breadth * this->height;
}
答案 0 :(得分:1)
首先要做到的是:非静态成员函数基本上与任何其他函数一样,但有一个名为this
的隐式参数,它是指向调用成员函数的对象的指针。也就是说,调用foo.bar()
可以被认为与调用bar(&foo)
类似,其中第一个参数称为this
。
现在,在您的第一种情况下,如果您执行some_box.getVolume()
,它将计算some_box
的音量,因为指向some_box
的指针将作为this
传递。< / p>
在第二种情况下,您具有完全相同的功能,但是您引入了未使用的参数box
。既然你没有使用它,那就完全没有意义了。这意味着每次调用box
时都必须将指针传递给getVolume
,但该指针根本不会被使用。也就是说,您必须拨打some_box.getVolume(&some_box)
或some_box.getVolume(&another_box)
。
现在你可以将第二个函数中的每个this
更改为box
然后你将计算出通过的box
的卷指针参数。也就是说,some_box.getVolume(&another_box)
会为您提供another_box
的音量。但是现在隐含的this
参数未使用且毫无意义!现在你可以将它作为静态成员函数或只是非成员函数。
如果你这样做,你基本上只是模仿成员函数的想法 - 而不是隐式的this
参数,你有一个明确的box
参数。重点是什么?成员函数的语言特征是一种更简洁的方法。
答案 1 :(得分:0)
你想要const,这样你就可以在const引用和指针上得到卷。
double Box::getVolume() const
第二个选项是糟糕(误导)代码。该参数未被使用,但使用该类的任何人都希望它被用于某些东西。