变量
变量提供一个具名的、供程序操作的存储空间,C++中的变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围,对C++程序员来说,“变量(variable)” 和“对象(object)” 一般可以互换使用。
定义变量:
类型说明符+一个或多个变量名组成的列表(变量名以逗号分隔,最后以分号结束。)
int sum = 0 , value , // sum, va1ue ,units_sold 都是 int
units_sold = 0 ; //sum ,units sold 值为0
初始值:初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。
double prìce = 109.99 , dìscount = prìce * 0.16 ;
//正确:调用函数applyDiscount,然后用函数的返回值初始化salePrice
double salePrice = applyDiscount (price, discount) ;
初始化的复杂性:
举例:初始化int
int units_ sold = 0;
int units_ sold = {0} ;
int units_ sold{0};
int units_ sold(0) ;
列表初始化(list itizaion):无论是初始化对象,还是某些时候为对象赋新值,都可以使用这样一组由花括号括起来的初始值。当用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错:
long double ld = 3.1415926536;
int a{ld},b = {ld};
//错误:转换未执行,因为存在丢失信息的危险
int c(ld), d = ld;
// 正确:转换执行,且确实丢失了部分值
默认初始化:如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”。默认值到底是什么由变量类型决定,同时定义变量的位置也会对此有影响。每个类各自决定其初始化对象的方式。而且,是否允许不经初始化就定义对象也由类自己决定。如果类允许这种行为,它将决定对象的初始值到底是什么。string类规定如果没有指定初值则生成一个空串:
1、内置类型的变量未被显式初始化,它的值由定义的位置决定。
定义于任何函数体之外的变量被初始化为0。
定义在函数体内部的内置类型变量将不被初始化。
分离式编译:允许将程序分割为若干个文件,每个文件可被独立编译。为了支持分离式编译,C++语言将声明和定义区分开来。声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。而定义负责创建与名字关联的实体。变量声明规定了变量的类型和名字,在这一一点上定义与之相同。但是除此之外,定义还申请存储空间,也可能会为变量赋一个初始值。
声明而不定义(就在变量名前添加关键字extern):
extern int i; // 声明i而非定义主
int j;//声明并定义j
定义:extern 语句如果包含初始值就不再是声明,而变成定义。
extern doub1e pi = 3 . 1416 ; // 定义
在函数体内部,如果试图初始化一个由 extern关键字标记的变量,将引发错误。变量能且只能被定义一次,但是可以被多次声明。
静态类型:C++是一种静态类型语言,其含义是在编译阶段检查类型。对象的类型决定了对象所能参与的运算。在C++语言中,编译器负责检查数据类型是否支持要执行的运算,如果试图执行类型不支持的运算,编译器将报错并且不会生成可执行文件。
标识符:C++的标识符由字母、数字和下画线组成,其中必须以字母或下画线开头。标识符的长度没有限制,但是对大小写字母敏感:
//定义4个不同的int变量
int somename, someName, SomeName, SOMENAME ;
命名规范:
●标识符要体现实际含义。
●变量名一般用小写字母,如index,不要使用Index或INDEX.
●用户自定义的类名一般以大写字母开头,如Sales_ item.
●如果标识符由多个单词组成,则单词间应有明显区分,如student_ loan 或studentLoan,不要使用studentloan。
保留字:
作用域:同一个名字在不同的作用域中可能指向不同的实体。名字的有效区域始于名字的声明语句,以声明语句所在的作用域末端为结束。
全局作用域:定义于所有花括号之外,大多数定义在函数体之外的名字拥有全局作用域。一旦声明之后,全局作用域内的名字在整个程序的范围内都可使用。
作用域的嵌套:作用域能彼此包含,被包含(或者说被嵌套)的作用域称为内层作用域,包含着别的作用域的作用域称为外层作用域。