您的位置:首页 > 其它

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

2015-10-04 16:30 267 查看
当我们定义没有初始化式的变量的时候,系统有时候会帮我们初始化变量.系统提供什么样的值取决于变量的类型,也取决于变量定义的位置.

内置类型变量的初始化

内置类型变量是否自动初始化取决于变量定义的位置.在函数体外定义的变量都初始化为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;  //仅声明但没有定义 i

int 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;  //局部变量 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是一个全局变量.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: