现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

变量初始化规则以及声明和定义

2012-09-02 19:07 工业·编程 ⁄ 共 2784字 ⁄ 字号 评论 1 条

当我们定义没有初始化式的变量的时候,系统有时候会帮我们初始化变量.系统提供什么样的值取决于变量的类型,也取决于变量定义的位置.

内置类型变量的初始化

内置类型变量是否自动初始化取决于变量定义的位置.在函数体外定义的变量都初始化为0,在函数体里面定义的内置类型变量不进行自动初始化

除了用作赋值操作符的左操作数,未初始化变量用作任何其他用途都是没有定义的.未初始化变量引起的错误难以发现.  永远不要依赖未定义行为.

PS:为初始化的变量事实上都有一个值.编译器把该变量放到内存中的某个位置,而把这个位置的无论哪种位模式都当成是变量初始的状态,当被解释成整型值时,任何位模式都是合法的值------------虽然这个值不可能是程序员想要的.   因为这个值合法,所以使用它也不可能会导致程序崩溃,可能的结果是导致程序错误执行和/或错误计算.

类类型变量的初始化

如果定义某个类的变量时没有提供初始化式,这个类也可以定义初始化时的操作.它是通过定义一个特殊的构造函数,即默认构造函数( default constructor)来实现的.这个构造函数之所以被称为默认构造函数,是因为它是"默认"运行的.如果没有提供初始化式,那么就会使用默认构造函数.不管变量在哪里定义,默认构造函数都会被使用.

如果类具有默认构造函数,那么就可以在定义该类的变量时不用显式地初始化变量.例如,string类定义了默认构造函数来初始化string变量为空字符串,即没有字符的字符串:

std:string empty;    //empty is the empty string;   empty= ' '

有些类类型没有默认构造函数.对于这些类型来说,每个定义都必须提供显式的初始化式.没有初始值是根本不可能定义这种类型的变量的.

来看看下列变量的初始值是什么

std::string global_str;
int global_int;
int main()
{
int local_int;
std::string local_str;
// ...
return 0;
}

类类型变量,global_str和local_str都被系统自动定义为空串.global_int定义在函数体外,为0.

函数体内的local_int没有初始值.

下面来看看声明和定义.

变量的定义(definition)用于为变量分配存储空间,还可以为变量制定初始值.在一个程序中,变量有且仅有一个定义.

声明(declaration)用于向程序表明变量的类型和名字.定义也是声明:当定义变量时我们声明了他的类型和名字.可以通过使用extern关键字声明变量名而不定义它.不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern.例如:    extern  int  i;  //declares but does not define  i    仅声明但没有定义 i

再来看看   int i;   //declares and defines i    不但声明而且定义了 i

既然extern声明不是定义,那就不存在分配空间的问题.事实上,它只是说明变量定义在程序的其他地方,

只有当声明也是定义时,声明才可以有初始化式,因为只有定义才分配空间.初始化式必须要有存储空间来进行初始化.如果声明有初始化式,那么它可以被当作定义,即使声明标记为extern:

extern double pi=3.1416   //definition

虽然使用了extern,但这条语句还是定义了pi,分配并初始化了存储空间.只有当extern声明位于函数外部时,才可以含有初始化式.

因为已初始化的extern声明被当作是定义,所以该变量任何随后的定义都是错误的:

extern double pi-3.1416;   //definition

double pi;                             //error:redefinition of pi

同样,随后的含有初始化式的extern声明也是错误的:

extern double pi =3.1416;         //definition  定义了pi

extern double pi;                        //ok:declaration not definition

extern double pi=3.1416;          //error:redefinition of pi

声明和定义之间的区别可能看起来微不足道,但事实上确实举足轻重.

注意:在C++语言中,变量必须且仅能定义一次,而且在使用变量之前必须定义或声明声明.任何在多个文件中使用的变量都需要有与定义分离的声明.在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)

来猜猜下面的程序会输出什么?

#include<iostream.h>
extern double pi=3.1415926;
int main()
{
double pi;
cout<<pi<<endl;
return 0;
}

反正我电脑里面输出的是-9.25596e+061.这是为什么呢

#include<iostream.h>
extern double pi=3.1415926;
int main()
{

cout<<pi<<endl;
return 0;
} 这里输出3.14159,没了,为什么呢?

#include<iostream.h>
extern double pi=3.1415926;
double pi;
int main()
{cout<<pi<<endl;
return 0;
}  重复定义了,上面说过

#include<iostream.h>
extern double pi=3.1415926;
extern double pi;

int main()
{cout<<pi<<endl;
return 0;
}这是可以的,没什么错误

#include<iostream.h>
extern double pi=3.1415926;
extern double pi;
extern double pi=3.1415926;
int main()
{

cout<<pi<<endl;
return 0;
}这样又是错误的.重复定义pi

习题:解释下列例子中name的意义:

extern std::string name;
std::string name("exercise 3.5a");
extern std::string name("exercise 3.5a");

第一条语句是一个声明,声明std::string变量name在程序的其他地方定义

第二条语句是一个定义,定义了std::string变量name,并初始化为"exercise 3.5a"

第三条语句也是一个定义,定义了std::string变量name,并初始化为"exercise 3.5a".  但这个语句只能出现在函数外部,name是一个全局变量.

目前有 1 条留言    访客:0 条, 博主:0 条 ,引用: 1 条

    外部的引用: 1 条

    • 关于变量的初始化 « 求索阁

    给我留言

    留言无头像?