你能用c ++初始化全局变量,如果可能的话,允许使用什么值?
答案 0 :(得分:5)
允许的值取决于变量的类型。对于int
,0或42都可以。对于string
,“你好世界”的作品。初始化全局变量与初始化其他变量完全相同,因此您可以自由使用所有变量。
通常最好保持简单;如果你需要一个全局的复杂初始化器,变量可能在错误的位置,但如果需要你可以做很多。
这样做的语法最基本的是:
int global_Int = 42;
string global_String = "Hello World";
但是,如果在头文件中完成(因为全局变量通常在公共头中声明),您将获得重复的声明和错误。要解决这个问题,请使用extern关键字声明它们,然后在代码文件中初始化:
标题
extern int global_Int;
extern string global_String;
代码:
#include "header.hpp"
int global_Int = 42;
string global_String = "Hello World";
然后只需在需要使用变量时包含标题。您还可以根据需要添加其他关键字(例如,如果您需要const全局)。
答案 1 :(得分:4)
是的,当然你可以初始化全局变量。对于内置类型,您可以使用可用于赋值的任何值(并且还可以初始化无法分配的数组)。对于类类型,由您决定在设计类时允许(和/或需要)哪些类型/值。对于预定义的类,您基本上必须查阅文档以确定它允许/需要的内容。
然而,最终,它是一个全球性的事实不会影响可以提供的价值。作为一个全局可以影响你如何获得价值 - 特别是,当你完成初始化时,你显然不能使用尚不可用的值。这可能比最初看起来更微妙一点,因为关于全局变量初始化的顺序相互之间的保证很少,所以(例如)当全局变量的构造函数执行时,std::cin
, std::cout
和std::cerr
可能尚未构建,因此如果您想根据用户的输入初始化某些内容,您可能需要采取特殊步骤来确保初始化顺序或其他方式(对于示例)对该特定作业使用C样式的I / O.
答案 2 :(得分:3)
当然可以。为什么我们不能?
//global variables
int g_int = 100;
int g_float = 10.0;
int g_char = 'A';
class X
{
int value;
public:
X(int v) : value(v){}
};
X g_x1(10); //initialize with argument 10
X g_x2 = X(198); //with arg 198
int main()
{
}
答案 3 :(得分:1)
几乎可以是构造函数调用中的任何内容:
static const std::string boo( "42" );
但请注意 - 它们在main()
之前运行,但它们的顺序未定义(请参阅"static initialization order fiasco")。