c++ - 正确的全局变量定义/声明
问题描述
这可能是一个非常直截了当的问题,但由于某种原因,到目前为止我还无法在伟大的互联网上找到答案。
在使用全局变量时,我知道全局变量是不好的,应该在大多数情况下避免使用,但是在极少数情况下全局变量可以最好地完成工作,是否应该同时声明和初始化全局变量?我最近一直在尝试深入研究“尽可能在声明时始终初始化变量”的口头禅,因为这通常会在以后省去很多麻烦,并且在 C++ 中受到鼓励。这条规则是否也适用于全局变量?
如果在声明变量时在其全局范围内初始化变量,这对程序有何影响?这是最佳实践吗?
非常感谢您的建议!
解决方案
是的,您确实想初始化全局变量。正如@paladin 评论的那样,如果您不初始化它们,编译器将尝试使用默认值初始化它们。考虑这个简单的例子:
struct Foo {
Foo(int x, char *y, double z) {}
};
Foo f;
编译器会尝试初始化f
,但没有默认构造函数。这会配置一个错误:
<source>:5:5: error: no matching constructor for initialization of 'Foo'
Foo f;
^
<source>:1:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided
所以是的,你需要初始化你的全局变量,如果你不这样做,编译器会尝试为你做。
推荐阅读
- angular - 如何在组件内部使用服务方法?
- java - Fragment 没有完全显示在 Activity 中
- c - 创建 MPI 结构时出现问题,调用 MPI_Bcast 时出现错误 11
- python - 焦点事件的问题
- php - 如何使用每个数组的第一项
- javascript - 将 iframe 元素转换为文本数据?- JavaScript
- php - 从php中的某些东西中获取数组
- r - R `scales::comma` 工作但 `scales::comma()` 不工作 - 为什么?
- html - 如何摆脱div内图像周围的默认边距?
- spring-boot - 使用 Kafka Streams 和 Spring-Cloud-Stream 处理事务