C ++将类成员项传递给成员函数

时间:2012-05-25 20:55:07

标签: c++ class struct private-members param

将成员项不必要地传递给成员函数会产生什么后果(除了代码不好):

struct foobar
{
  char * arr; //properly initialized to SIZE at some point
}

class foo
{
  public:
    void bar(foobar&);
    foobar barfoo;
};


void foo::bar(foobar& barf)
{
    cin.get(barf.arr, SIZE, '\n');
    cin.ignore(100, '\n');
}

有没有理由不完全消除bar中的参数,只是直接拨打barfoo?不这样做有什么后果,如果有的话?

4 个答案:

答案 0 :(得分:3)

取决于。

如果foo::bar被调用的唯一上下文是将this->barfoo作为参数传递,那么它非常愚蠢(尽管不是非常有害)。

但是在this->barfoo不是唯一可以传递给成员函数的参数的情况下,显然它没问题。

答案 1 :(得分:2)

其中一个结果是foobar的其他实例无法传递给同一种方法。

问题不在于某个成员是否有时被发送到某个方法,而是调用者是否希望能够指定该参数。

由于这是一个公共方法,因此可能存在此类以外的调用方。

答案 2 :(得分:1)

没有理由不消除它。当你在函数中传递它时,至少你会做一个额外的解引用。

但是,如果某些人在课堂外使用bar(foobar&),你可以重载它并执行以下操作:

class foo {
public:
    void bar(); /* Uses default barfoo */
    void bar(foobar&);
    foobar barfoo; 
private:
};

viod foo:bar() {
     bar(barfoo);
}

void foo::bar(foobar& barf) {
    cin.get(barf.arr, SIZE, '\n');
    cin.ignore(100, '\n'); 
} 

答案 3 :(得分:1)

传递参数有一点点开销,所以如果你永远不会用另一个成员调用该方法,那么你就可以去除参数了。如果您将来可能需要做这样的事情:

class foo 
{ 
  public: 
    void bar(foobar&); 

  private/*(or still public)*/: 
    foobar barfoo;
    foobar barfoo2;

    void some_other_method() {
      //do stuff
      bar(barfoo);
      bar(barfoo2);
}; 

然后我会不管它。