将指针作为参数传递给C ++而不是使用此指针

时间:2014-12-30 15:01:24

标签: c++ pointers this

将指针传递给类/对象而不是使用指向当前地址对象的“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;
}

2 个答案:

答案 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

第二个选项是糟糕(误导)代码。该参数未被使用,但使用该类的任何人都希望它被用于某些东西。