以下是简单的示例代码,它不是最好的:
使用成员而不在参数中传递它:
class Car
{
public:
void doSomething()
{
// doing something
onEngineFailure();
}
private:
void onEngineFailure()
{
// Operate on m_Engine
}
private:
Engine m_Engine;
};
将成员作为参数传递:
class Car
{
public:
void doSomething()
{
// doing something
onEngineFailure(m_Engine);
}
private:
void onEngineFailure(const Engine& engine)
{
// Operate on engine
}
private:
Engine m_Engine;
};
在第一个示例中,方法onEngineFailure
直接在类成员变量m_Engine
上运行。没有必要将它作为函数参数传递,因为汽车只能有一个引擎,onEngineFailure
操作的引擎将始终为m_Engine
。
在第二个示例中,方法onEngineFailure
对通过参数传递的引擎进行操作。无论如何,这总是m_Engine
。
那么,哪一个在设计上更正确?如果方法已经访问成员变量并且它总是只对它进行操作,那么为什么将它作为参数传递。 但是,关于全局变量也可以这么说,但应尽可能使用全局变量。
答案 0 :(得分:3)
那么,哪一个在设计上更正确?如果方法已经访问 成员变量,它将始终只在它上运行,那么为什么 把它作为论据传递。
完全。 1
然而,关于全局变量也可以这么说,
除了绑定到特定对象实例的变量与其他实例分开,并且它们的一致性在对象级别进行管理。由于封装,您可以隐藏它们并确保它们被正确使用。
通过类比,所有变量都驻留在RAM中,但它们是否仅仅是因为它的全局变量?不,因为它们之间的逻辑区别很重要。
1 在这个例子中,它可能没什么意义。但是,如果函数的功能通用性足以被其他类使用,那么使它成为自由函数或静态公共函数是有意义的。由于其他原因,将函数设为静态的能力有时也很重要,在这些情况下,显式(有时直接this
)参数使其成为可能/更容易。
答案 1 :(得分:0)
第一个代码片段是优雅和干净的方式。由于成员函数可以访问数据成员,因此您不需要将数据成员作为参数传递。
如果你想根据外部输入改变数据成员状态(m_Engine),你会期望参数为(Engine)类型。它将以下列方式完成。
void doSomething(Engine engine)
{
// doing something
onEngineFailure(engine);
}
void onEngineFailure(const Engine& engine)
{
// copy it here say m_Engine.model=engine.model;
}