2012-05-25 105 views
-1

什么后果成员项目传递不必要的成员函数(除贫穷代码等):C++传递一个类成员项目成员函数

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?如果有的话,不这样做的后果是什么?

+1

你怎么称呼foo :: bar()?你不能从课外访问私人成员。 – betabandido

+2

语义不同,也不是“错”。 – ildjarn

+0

假设它的所有公共或使用get_foobar函数返回一个结构 – Flexo1515

回答

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); 
}; 

然后我会放弃它。

3

这取决于。

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

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

+0

我意识到我已经将client_item传递给客户端类中的每个函数,并且除了客户端项之外没有实际使用任何其他项,所以在那种情况下,我可以消除该参数? – Flexo1515

1

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

但是,如果somethign是用吧,从你的类以外(取得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'); 
} 
2

一个后果是foobar的的其他情况不能传递给相同的方法。

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

由于这是一种公开方法,因此可能会有除此类外的其他呼叫者。