将成员项不必要地传递给成员函数会产生什么后果(除了代码不好):
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
?不这样做有什么后果,如果有的话?
答案 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);
};
然后我会不管它。