变量:
列表初始化:
int unit_sold = 0:
int unit_sold = {0}:
int unit_sold{0}:
int unit_sold(0):
用花括号初始化变量称为列表初始化。当用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错:
long double ld = 3.1415926536;
int a{ld}, b = {ld}; //错误:转换未执行,因为存在丢失信息的危险
int c(ld), d = ld; //正确:转换执行,且确定丢失了部分值
变量声明和定义的关系:
如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显示地初始化变量:
extern int i; //声明 i 而非定义 i
int j; //声明并定义 j
任何包含了显示初始化的声明即变成定义。我们能给有extern关键字标记的 变量赋一个初始值,但是这么做也就抵消了extern的作用。extern语句如果包含初始值就不再是声明了,而变成定义了:
extern double pi = 3.1416; //定义
在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误。变量能且只能被定义一次,但是可以被多次声明。
名字的作用域:
作用域是程序的一部分,C++语言中大多数作用域都以花括号分隔。
for (int val = 1; val <= 10; ++val)
名字val定义于for语句内,在for语句之内可以访问val,但在main函数其他部分就不能访问它了。
嵌套的作用域:
作用域一旦声明了某个名字,它所嵌套着的所有作用域中都能访问改名字。同时允许在内层作用域中重新定义外层作用域已有的名字。
引用:
引用为对象起了另外一个名字,引用类型引用另外一种类型。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名:
int ival = 1024;
int &refVal = ival; //refVal指向ival(是ival的另一个名字)
int &refVal2; //报错:引用必须被初始化
引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。所有的操作等同于对被引用的操作。
const限定符:
有时我们希望定义这样一种变量,它的值不能被改变
const int bufferSize = 512;
这样就把bufferSzie定义成了一个常量。任何试图为bufferSize赋值的行为都将引发错误:
bufferSzie = 512; //错误:试图向const对象写值
因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化。
const紧挨着变量时,它限定的是变量,如第一条;当const紧挨着变量类型,即位于句首时,它限定的是变量所操作的对象的类型。