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

Passing pointers as a parameter in C++ rather than using this pointer

本文关键字:指针 参数传递 C++      更新时间:2023-10-16
传递

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

double Box::getVolume(Box *box)
{
    return this->length * this->breadth * this->height;
}

首先要直截了当:非静态成员函数本质上就像任何其他函数一样,但具有一个名为 this 的隐式参数,该参数是指向调用成员函数的对象的指针。也就是说,调用foo.bar()可以被认为是类似于调用bar(&foo),其中第一个参数称为this

现在,在第一种情况下,如果你做some_box.getVolume(),它将计算some_box的体积,因为指向some_box的指针是作为this传递的。

在第二种情况下,您具有完全相同的函数,但您引入了一个未使用的参数box 。由于您不使用它,因此完全没有意义。这意味着每次调用getVolume时都必须将指针传递给box,但该指针根本不会被使用。也就是说,您必须拨打some_box.getVolume(&some_box)some_box.getVolume(&another_box)

现在,您可以将第二个函数中的每个this更改为box,然后您将计算出通过指针参数传递的box的音量。也就是说,some_box.getVolume(&another_box)会给你 another_box的体积 .但是现在隐式this参数未使用且毫无意义!现在,您不妨将其设置为静态成员函数或仅作为非成员函数。

如果你要这样做,你基本上只是模仿成员函数的想法 - 你有一个显式box参数,而不是隐式this参数。有什么意义?成员函数的语言功能是执行此操作的更简洁的方法。

你需要 const 这样你就可以在 const 引用和指针上获取 Volume。

double Box::getVolume() const

第二个选项是错误(误导性)代码。 没有使用该参数,但是使用该类的任何人都希望将其用于某些事情。