在C++中将指针作为参数传递,而不是使用此指针
Passing pointers as a parameter in C++ rather than using this pointer
指向类/对象的指针而不是使用指向当前地址对象的"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
第二个选项是错误(误导性)代码。 没有使用该参数,但是使用该类的任何人都希望将其用于某些事情。
- 使用指向成员的指针将成员函数作为参数传递
- 修改函数中的指针(将另一个指针作为参数传递)
- 将成员函数指针作为参数传递给模板方法
- 使用引用与指针将数组作为参数传递
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 将函数指针数组中的函数指针作为模板参数传递
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- 如何将指针变量作为引用参数传递?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- Qt5 - 如何将"QList<T> *"指针作为信号参数传递,并在完成后将其删除?
- C++将指向成员的指针作为模板参数传递
- 通过引用函数传递指针参数是什么意思?
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- 将函数指针作为函数参数传递的目的
- 将派生类作为参数传递给方法,该方法是具有智能指针的基类
- 将指针参数传递给双指针参数
- 解析结构并作为指针参数传递
- Qt中的2D游戏:初始化怪物并将动态分配的数组作为指针参数传递