2011-05-01 56 views

回答

4

是的,当然你可以初始化全局变量。对于内置类型,您可以使用任何可用于赋值的值(也可以初始化不能分配的数组)。对于一个类的类型,由你决定什么类型/值将被允许(和/或要求),当你设计类。对于预定义的类,您基本上必须查阅文档以找出它允许/需要的内容。

然而,最终,它是一个全局的事实并不影响可以提供的值。作为一个全局可以影响你如何获得价值 - 特别是,当初始化完成后,你显然不能使用那些尚未提供的值。这可能会比最初看起来更微妙一点,因为保证全局变量相对于其他变量的初始化顺序很少,所以(例如)当全局变量的构造函数执行时,std::cinstd::coutstd::cerr可能尚未构建,所以如果您想根据用户的输入初始化某些内容,则可能需要采取特殊步骤,以确保初始化的顺序或其他(例如)针对该特定方式使用C风格的I/O工作。

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() 
{ 
} 
5

允许值取决于变量的类型。对于int,0或42都可以。对于string,“hello world”有效。初始化全局变量与初始化其他变量相同,因此您可以使用很多自由度。

通常最好保持简单;如果你需要一个复杂的全局初始化器,那么这个变量可能会出错,但如果需要的话,你可以做很多事情。

这样做的,在其最基本的语法是:

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

可能是相当多的东西,如构造函数的调用:

static const std::string boo("42"); 

不过要小心 - 这些main()前运行,但它们的顺序是不确定的(见"static initialization order fiasco")。