将类作为参数传递,但仍使用点运算符

Passing a class as an argument, but still use the dot operator?

本文关键字:点运算 运算符 参数传递      更新时间:2023-10-16

这个问题有很多相当复杂的背景,需要很长时间才能解释清楚。所以我在大幅简化,省略了很多细节……

本质上,我有一个函数,其中有一个类的实例。类类型是Mat,实例是"Fred"。因此,我可以使用点(.)操作符访问Fred类中的数据,即Fred.data。现在我想调用第二个函数,我希望在这个函数中对Fred做一些处理。如果我传递一个指针给Fred,那么第二个函数将不得不使用箭头操作符(->)访问它的数据。

我想知道的是,我是否可以以不同的方式传递Fred,使function2内部的代码可以访问Jim.data的数据?

void function1()
{
  // some code here involving Fred
  int x = Fred.data;
  function2(&Fred)
}
void function2(Mat *Jim)
{ 
  int y = Jim->data;
}

通过引用传递

void function2(Mat& Jim)

尽管直接访问数据成员有点代码味

通过引用而不是指针传递:

void function1()
{
    // some code here involving Fred
    int x = Fred.data;
    function2(Fred)
}
void function2(Mat &Jim)
{
    int y = Jim.data;
}

Reference本质上是一个最多指向一个对象的常量指针,而指针可以用来遍历对象数组。

如果您所做的只是调用方法和访问字段,那么简单地将*更改为&,将->更改为.就足够了。但是要注意,对象可能会重载->操作,如果忘记替换所有出现的->,可能会导致一些麻烦。

void function1()
{
  // some code here involving Fred
  int x = Fred.data;
  function2(Fred)
}
void function2(Mat& Jim)
{ 
  int y = Jim.data;
}