-1

将成员项不必要地传递给成员函数的后果是什么(除了糟糕的代码):

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

4 回答 4

3

这取决于。

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

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

于 2012-05-25T20:58:31.887 回答
2

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

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

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

于 2012-05-25T21:00:01.067 回答
1

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

但是,如果 somethign 在您的班级之外使用 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'); 
} 
于 2012-05-25T20:59:58.163 回答
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);
}; 

那我就别管它了。

于 2012-05-25T21:00:01.550 回答