C ++类设计:成员和局部变量

时间:2012-06-21 10:01:38

标签: c++ class variables class-design

以下两个示例之间是否存在任何差异,应该优先于其他示例:

示例1:

class A
{
    int i;
    B* b;

    do_something();
    do_something_else();
}

A::do_something()
{    
    do_something_else();
}

示例2:

class A
{
    int i;

    do_something()
    do_something_else(B* b)
}

A::do_something()
{
    B* b;
    do_something_else(b);
}

现在让我们说有几种方法使用b是不是让它们都把它作为参数或不带参数并使用成员变量?两种方法之间的性能有差异吗?我可以看到两者的好处,但哪一个更受青睐?

4 个答案:

答案 0 :(得分:12)

使变量成员属于您正在设计的对象。如果你只使用临时变量 - 不要让它们成为成员,因为在这种情况下你只会污染你的对象设计

答案 1 :(得分:8)

这实际上归结为您的对象模型如何组合在一起以及聚合关系是否准确地表示您希望建模的内容。

考虑一下你的案例中B是否真的与A表现出 has-a 的关系(即说A 是否属实has-a B?)例如,在大多数情况下,汽车有一个引擎,因此汽车可以合理地拥有/包含引擎。如果是这种情况,那么您应该使用示例1。

另一方面,如果没有直接关系,但A只需要对另一个对象进行操作而不拥有它或包含它,那么你应该坚持使用示例2.例如:

Dog myDog;
Stick aStick;
myDog.fetches(aStick);
很明显,一根棍子(希望)不是狗的组成部分。

为了方便起见,将变量(特别是指针)合并到类中并使代码看起来更好(即因为您不必传递这么多参数),但是如果包含的对象没有很强的关系,那么很有吸引力使用容器和/或在其他地方进行管理时,您经常会遇到复杂的生命周期管理问题,这些问题可以抵消您首先从聚合中获得的好处。

答案 2 :(得分:3)

适合的那个是首选。

如果类实例应该拥有指针所指向的对象,那么它应该是成员变量。如果它只是函数的参数,不是由对象拥有,那么就不要使它成为成员。

答案 3 :(得分:1)

使用聚合/组合(将变量保存为成员),因为您需要在函数调用之间维护状态

虽然关于对象模型的建议是合理的,但是你常常偶然发现你有纯粹制造类的情况,而“has-a”和“is-a”不再有意义。< / p>

如果你不断忽视这个建议,它将有代价。

  • 对象大小越来越大,当您选择复制对象时,这会影响您的内存和性能。

  • 您传达该成员是对象状态的一部分,这意味着其他开发人员(记住您在几周内也是“其他开发人员”)在尝试时会感到困惑找出这个对象如何成为对象状态的一部分。

  • 您需要知道标题中的成员大小,这是头文件中的额外包含,保持这种做法,当您更改单个文件时,您将进行数周的编译基本标题中的行。您只需要在标题中包含最少数量的包含。

所以使用这种技术来减少参数的数量。 (并且记住没有绝对真理)