C++:全局变量与局部变量.使用什么

C++: Global variable vs local variables. What to use?

本文关键字:什么 局部变量 全局变量 C++      更新时间:2023-10-16

有时我想使用全局变量,但我使用局部变量代替它。让我们有一些字体类:

class Font {
public:
    class Alignment {
    public:
        unsigned short currentAlignment;
        unsigned short FONT_ALIGN_LEFT = 0;
        unsigned short FONT_ALIGN_CENTER = 1;
        unsigned short FONT_ALIGN_RIGHT = 2;
        // etc....
    };
    Alignment alignment;
    void setFontAlignment( unsigned short fontAlignment ) {
        this->alignment.currentAlignment = fontAlignment;
    }
};

要使用此类,我们需要做类似的事情:

Font font;
font.setFontAlignment( font.alignment.FONT_ALIGN_CENTER );
// if we need to check currentAlignment we need to do:
if ( font.alignment.currentAlignment == font.alignment.FONT_ALIGN_CENTER ) {...} // looks a little bit awful :)

或者我们有另一种方法来做到这一点:

= Font.h =
#define FONT_ALIGN_LEFT 0
#define FONT_ALIGN_CENTER 1
#define FONT_ALIGN_RIGHT 2 
// etc....
class Font {
public:
    unsigned short currentAlignment;
    void setFontAlignment( unsigned short fontAlignment ) {
        this->currentAlignment = fontAlignment;
    }
}

要使用它:

#include "Font.h"
...
Font font;
font.setFontAlignment( FONT_ALIGN_CENTER );
if ( font.currentAlignment == FONT_ALIGN_CENTER ) {...} // looks a little bit better :)

哪一个更适合内存优化,为什么?您更喜欢使用哪一个?或者,也许您知道一些更好的解决方案?

虽然总是有例外,但我通常会去(除其他外:-)以下准则:

  • 尽可能避免全局变量。限制到最小适用范围(在合理范围内)。

  • 避免对编译器进行二次猜测,除非非常明显情况。

实际上,它们是它们的组合。但是让我们澄清一些事情。你没有在你的问题中谈论任何全局变量。全局变量是在全局范围内定义的变量。

使用面向对象编程的主要原因不是它的效率(因为它比纯过程代码慢),而是它对世界建模的能力。所以,在创建 oop 设计时,你不应该太在意资源(时间、内存),而是它模拟世界的好坏。

第二个版本很糟糕,因为它在全局范围内引入了很多常量,而您希望避免这种情况。此外,它在封装数据方面做得非常糟糕(Font 类的用户不应该关心对齐方式的值)。

第一个版本更好,但存在一些问题。首先,您需要考虑应该拥有的对象?你真的需要一个对齐对象吗?您可能需要它,但在这个特定示例中,我不明白为什么。因此,您可以让它按原样模拟世界,而无需引入一些人工元素:

class Font {
public:
    unsigned short currentAlignment;
    void alignLeft() {
        this->currentAlignment = 0;
    }
    void alignCenter() {
        this->currentAlignment = 1;
    }
    void alignRight() {
        this->currentAlignment = 2;
    }  
};

现在它非常易于使用。我不必在我的全局范围内保留不必要的常量。现在,问题是当用户读取当前对齐的值时会发生什么?当然,您不想使用这些常量,但您不需要这样做。这实际上取决于您正在建模的世界。由于这是一个 Font 类,因此它应该是唯一真正关心对齐值的类。如果其他人需要该值,您可以使用一些方法,例如 isCenter(),当字体居中对齐时返回 true。但是,我会考虑将当前的对齐设为私有。