您的位置:首页 > 其它

变量和基本类型

2010-09-03 13:30 176 查看

1、初始化

在C++中初始化有2种:复制初始化(=)和直接初始化(直接放到括号里),比如:

int val(1024);

int val = 1024;

注意:初始化是指创建变量并赋初值(没擦),而赋值操作则是指擦除前值并用新值替代(先擦后赋)

直接初始化更加灵活且效率更高。

2、使用多个初始化式

类的初始化的是类的构造函数,构造函数的参数列表可以不同。

3、定义多个变量

当定义多个变量时,每个变量都可能有自己的初始化式,对象名字立即可见,所以可用前面已定义变量的初始化值来初始化后面的变量,也可以用函数返回值初始化。

int day = 1, mou = day + 1;

题:

int ival = ival; 虽无错误,但无意义,ival仍没初始化;

double salary = wage = 9999.99; 非法,同一定义语句中不同变量的初始化应该分别进行

4、变量初始化规则

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

(1)内置类型变量的初始化

内置类型变量是否自动初始化取决于变量定义的位置,在函数体外定义的变量都被初始化成0,在函数体内定义的内置类型变量不进行自动初始化。除了用作赋值操作符的左操作数,未初始化变量用作其他用途都是为定义的,会引起错误。

实际上,为初始化变量事实上都有一个值,编译器把该变量放到内存的某个位置,那么这个位置上无论哪种 位模式都当成变量的初始状态。

建议应当为每一个内置类型对象都要初始化

(2)类类型变量的初始化

对于类类型变量,可以定义默认的构造函数,当定义一个类类型变量没初始化时,系统就会调用类定义的默认构造函数进行初始化,如果没有定义默认的构造函数,则必须显示调用构造函数进行初始化,没有初始化值是根本不可能定义这种类类型的。

5、声明和定义

C++区分了声明和定义:

变量的定义用于为变量分配存储空间、还可以为变量指定初始值,在一个程序中,变量有且仅有一个定义。

声明用于向程序表明变量的类型和名字。定义也是声明,可以通过extern关键字声明变量名而不定义它。extern声明不是定义,也不分配存储空间,事实上,它只说明变量定义在程序的其他地方,程序中变量可以声明多次,但只能定义一次。

只有当声明也是定义时,声明才可以有初始化式,初始化式必须有存储空间进行初始化,如果声明有初始化式,那么它可被当作是定义,即使声明标记为extern: extern double pi = 3.1416;只有当extern声明位于函数外部时,才可以有初始化式。

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

extern double pi = 3.1416;

double pi; //error

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

extern double pi = 3.1416;

extern double pi; //ok

extern double pi = 3.1416;//error;

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

6、名字的作用域

提名字时要注意提作用域,用来区分名字不同意义的上下文叫作用域。一个名称可以和不同作用域中的不同实体相关联。

定义在所有函数外部的名字具有全局作用域,可以在程序中的任何地方访问,定义在函数外部的有局部作用域,在函数体内可见而函数体外不可见。定义在for语句内的具有语句作用域,仅能用在for语句里面。

定义在全局作用域中的名字可以在局部作用域中使用,定义在全局/函数的局部作用域中的名字可以在语句作用域中使用,名字还可以在内部作用域中重新定义,理解和名字相关联的实体需要明白定义名字的作用域。

最好不要定义重名的变量

7、在变量使用处定义变量

通常把一个对象定义在它首次使用的地方是一个很好的办法。

放置声明的一个约束是:变量只在从其定义处开始到该声明所在的作用域的结束处才可以访问,必须在使用该变量的最外层作用域里面或之前定义变量。

题:

int i = 100, sum = 0;

for(int i = 0; i !=10; ++i)

sum +=i;

std::cout << i << " " << sum << std::endl;

此时的输出是100 和 45,在该程序里面i又在for语句中重新定义,所以for循环中使用的i是重新定义过的,只能应用在for循环中。

8、const限定符

限定符const用于定义常量,因为常量在定义后就不能被修改,所以定义时必须初始化。如果再对已定义的常量赋值就会出现编译错误。

对于非const变量,它在整个程序中都可以访问,可以如下所示:

//file_1.cc

int count;//定义

//file_2.cc

extern int counter;

++counter;

而对于const常量,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量,此变量只存在于那个文件中,不能被其他文件访问。可通过在定义时指定const变量为extern,就可以在整个程序中访问const对象。

//file_1.cc

extern const int a = 6;

//file_2.cc

extern const int a;

if(index != a)

{}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: