c++中全局const变量的正确使用



我正在为我的计算机科学课编写一个程序。它模拟了快递公司在机场的活动。

这是一个非常简单的小程序,由几个头文件和源文件以及一个编排模拟的main.cpp源文件组成。

存在某些给定的常数值,例如货物到达的频率、飞机的载重能力、工人处理某些物品所需的时间等(都是整数值)。我有必要在main.cpp

中的几个函数中访问这些变量。

在main()函数上面将这些声明为const int似乎是合理的,有效地使它们成为全局的,例如

const int kTotalTime = 2000;
const int kPlaneCapacity = 25;
int main(){//...program code}

我知道全局变量在大多数情况下是要避免的,因为对它们可以调用和/或修改的地方没有限制,这可能导致意外破坏程序的部分,从而可能难以调试,以及导致未来代码的兼容性问题等。然而,由于这些是基本数据类型的只读值,在整个程序中使用,因此这似乎是一个合理的解决方案。此外,它还向任何阅读代码的人以及编译器明确地说明了变量的目的。

问题:我的逻辑有缺陷吗?所以如何?什么时候使用全局变量(const或非)是合理的?如果这是一个糟糕的解决方案,那么您建议如何声明诸如此类的常量只读值?

非常感谢您的时间!

关于你的程序的大小和目的(我从你的描述中理解它),这可能无关紧要,但由于它有一个教育背景,我建议"做对&;"

在这种情况下,我会选择Config结构体(或类,如果你想让它更聪明一点,见下文),它携带配置值,可以在你的程序中随意使用。它的优点是,如果您必须从文件或命令行中获取选项,则可以轻松更改它。

至于类与结构的区别(注意,我在这里做的是逻辑上的区别,而不是技术上的区别)。要么你只是把所有的值作为成员放在你的结构中,并传递它的const refs,要么你把它变成一个完全成熟的类,用访问器隐藏数据来自哪里(以及它是如何生成的)。编程总是要做决定,而这是你自己的决定。如果您认为将来必须允许更多的配置可能性(就像上面提到的),您可能想要进行类抽象。

另一个选择是将数据分散到程序中,这实际上比听起来要聪明得多。如果每个类都只知道它的配置选项(并隐藏它们),那么您实际上可以使用您正在使用的OOP语言。例子:

// footype.h
class FooType {
  private:
    static const int fooOption;
};
// bartype.h
class BarType {
  private:
    static const float barOption;
};

问题是,如何初始化它。一种方法是创建一个config.cpp,看起来像这样:

#include "footype.h"
#include "bartype.h"
const int FooType::fooOption = 42;
const float BarType::barOption = 7.4;

所以你有信息隐藏,你仍然有所有的配置选项在一个地方(config.cpp)。

编辑:

如果你有许多(不止一个)不同模块需要的配置选项,你可以选择一些复杂的(间接的),像这样:

// footype.h
class FooType {
  private:
    static const int& fooOption;
    static const bool& dumpLevel;
};
// bartype.h
class BarType {
  private:
    static const float& barOption;
    static const bool& dumpLevel;
};

config.cpp:

#include "footype.h"
#include "bartype.h"
static const int opt_foo = 42;
static const float opt_bar = 7.4;
static const bool opt_dumpLevel = false;
const int& FooType::fooOption = opt_foo;
const bool& FooType::dumpLevel = opt_dumpLevel;
const float& BarType::barOption = opt_bar;
const bool& BarType::dumpLevel = opt_dumpLevel;

如果你想的话,你甚至可以把这些选项设置为非const(但我不认为配置选项是可变的)。

我认为最好把你的常量作为静态的放在类中。

我假设你有Plane类,只需这样做:

Plane.h

class Plane{
   static const int kPlaneCapacity;
   //....
}

Plane.cpp

const int Plane::kPlaneCapacity = 25;

同样,要注意你对常量的理解。是一个常数。10是一个常数。我明白你为什么会认为飞机容量是恒定的,但想想这个:如果你的老师说你的下一个作业,你的飞机容量应该是30,而不是25。

何时使用全局变量(const或非const)是合理的?

如果你的程序是一个多线程程序,那么你应该认真考虑使用全局变量,因为它们需要适当的同步来避免竞争条件。通常,适当的同步并不是一项微不足道的任务,需要认真理解和思考。

这是一篇nice文章的节选:

非局部性——当单个元素的范围有限时,源代码最容易理解。全局变量可以被程序的任何部分读取或修改,因此很难记住或推断每一种可能的用法。没有访问控制或约束检查——程序的任何部分都可以获取或设置全局变量,有关其使用的任何规则都很容易被打破或遗忘。

隐式耦合——具有许多全局变量的程序通常在其中一些变量之间以及变量与函数之间具有紧密耦合。将耦合项分组为内聚单元通常会产生更好的程序。

内存分配问题——某些环境的内存分配方案使得全局变量的分配变得棘手。在"构造函数"具有除分配之外的副作用的语言中尤其如此(因为在这种情况下,您可以表达两个全局变量相互依赖的不安全情况)。此外,在动态链接模块时,可能不清楚不同的库是否有自己的全局变量实例,或者全局变量是否是共享的。

测试和约束 -使用全局变量的源代码在某种程度上更难测试,因为在运行之间不能轻易地设置一个"干净"的环境。更一般地说,由于同样的原因,使用没有显式提供给该源的任何类型的全局服务的源很难测试。

鉴于以上所述,只要您了解这些缺陷,并且了解您使用全局变量的方式使您的程序免受这些缺陷的影响,那么您就可以继续使用全局变量。

相关内容

  • 没有找到相关文章

最新更新