c++初始化

来源:互联网 发布:剑灵男召唤师捏脸数据 编辑:程序博客网 时间:2024/06/05 01:58

初始化
c++支持两种初始化变量的形式:赋值初始化和直接初始化
赋值初始化 语法用等号(=),直接初始化是把初始化放在括号中:
int ival (1024);
int ival = 1024;// 强调:初始化不是赋值 初始化指创建变量并给他赋初值,而赋值则是擦除对象当前值并用新值代替。

初始化形式:
初始化内置类型的对象只有一种方法:提供一个值,并且把这个值复制到新定义的对象中。对内置类型来说,复制初始化与直接初始化几乎没有差别。
对类类型的对象来说 ,有些初始化仅能用直接初始化完成。要想理解其中的缘由,需要初步了解类是如何控制初始化的。

每个类都可能会定义一个或几个特殊的成员函数来告诉我们如何初始化类型变量。定义如何进行初始化的成员函数成为构造函数。
和其它函数一样,构造函数能接收多个参数。一个类可以定义几个构造函数,每个构造函数必须接受不同数目或者不同类型的参数。
当一个定义了两个以上变量的时候,每个变量都有自己的初始化。对象变量名立即可见,所以可以用同一个定义中的前面已定义的变量的值 初始化后面的变量。
已初始化变量和未初始化变量可以在同一个定义中定义。

变量初始化规则
内置类型变量是否自动出适合取决于变量定义位置。在函数体外定义的变量都初始化为0
函数体内定义的内置类型变量不进行自动初始化。除了作赋值操作符的左操作数,未初始化变量用作任何其他用途都是没有意义的。不要依赖未定义行为。
类类型变量初始化
类通过定义一个或多个构造函数来控制类对象的初始化。
如果定义某个类的变量时没有提供初始化式,这个类可以定义初始化时的操作。
通过默认构造函数实现。如果没有提供初始化式,那么就会使用默认构造函数。不管变量在哪里定义,默认构造函数都会被使用。
大多数类到提供了默认构造函数。如果有默认构造函数,那么就可以在定义该类的变量时不用显示的初始化变量。
有些类没有构造函数。对于这些类型来说,每个定义都必须提供显示的初始化式。没有初始值是根本不可能定义这种类型的变量的。

声明和定义
定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且只有一个定义。
声明用于向程序员表明变量的类型和名字。
定义也是声明:当定义变量时,我们声明了它的类型和名字。也可以通过extern关键字声明变量名而不去定义它。
不定义声明包括对象名、对象类型和对象类型前的关键字。
只有当声明也是定义时,声明才可以有初始化式,因为只有定义才分配存储空间。初始化式必须要有存储空间来进行初始化。如果声明有初始化式,那么它可被当做定义,即使声明标记为extern。
只有声明位于函数外部时,才可以含有初始化式。
因为已初始化的extern声明被当做是定义,所以该变量任何随后的定义都是错误的。
任何在多个文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有

名字都与唯一实体相关联。
用来区分名字的不同意义的上下文称为作用域。
作用域是程序的一段区域。
一个名称可以和不同作用域的不同实体相关联。

c++语言中,大多数作用域使用花括号来界定的。一般来说,名字从其声明所在作用域结束处都是可见的。
名字main定义在所有花括号之外、整个程序都可见。定义在函数外部的名字具有全局作用域,可以在程序中的任何地方访问。
名字sum定义在main函数作用域中,整个main函数中都可以访问,但在main函数外这不能。变量sum有局部作用域。
名字val更有意思,他定义在for语句的作用域中,只能在for语句中作用,而不能在main函数的其他地方。他具有语句作用域。

C++作用域可嵌套
定义在全局作用域中的名字可以在局部作用域中使用,定义在全局作用域中的名字和定义在函数的局部作用域中的名字可以在语句作用域中使用。
名字还可以在内部作用域中重新定义。理解和名字相关联的实体需要明白定义名字的作用域。
作用域还包括类作用域和命名空间作用域。

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

这里写图片描述
![这里写图片描述](http ://img.blog.csdn.net/20170711171321582?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGd5dTkzMDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

原创粉丝点击