C++ Primer 学习笔记:变量和类型
C++ Primer 学习笔记一 :变量和基本类型
1. 在C++ 中要理解“初始化不是赋值”,因为初始化是指创建变量并给它赋初始值,而赋值是擦除对象的当前值并用新值代替。虽然只有在编写非常复杂的类时才能凸显这两种方式的区别,但这也是一个关键的概念,而且直接初始化更灵活而且效率更高。
C++中支持两种初始化的形式:复制初始化和直接初始化:
int ival(1024) // direct-initialization int ival = 1024 // copy-initialization
2. 在C++语言中,变量必须且仅能定义一次,而且在使用变量之前必须定义或声明变量。为了让多个文件访问相同的变量,C++区分了声明和定义。
a) 变量的定义用于为变量分配存储空间,还可以为变量指定初始值,在一个程序中,变量有且仅有一个定义。
b) 声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字,可以通过使用extern关键字声明变量名而不定义它:
extern int i; // declares but does not define i int i; // declares and defines i
在这里,extern声明不是定义,也不分配存储空间,因为只有定义才分配存储空间。如果声明有初始化,则可以看作是定义:
extern double pi = 3.1416
虽然使用了extern,但是这条语句还是定义了pi,分配并初始化了存储空间,只有当extern声明位于函数外部时,才可以含有初始化式。
c) 任何在多个文件中使用的变量都需要有与定义分离的声明,在这种情况下,一个文件含有变量的定义,使用该变量的其它文件则包含此变量的声明(而不是定义)。
d) 通常把一个对象定义在它首次使用的地方,以提高可读性。放置声明的一个约束是,变量只能在其定义处开始到此声明所在的作用域的结束处才可以访问,必须在使用此变量的最外层作用域里面或之前定义变量。
3. 外部变量extern和const,非const变量默认为extern,而要使用const变量能在其它文件中访问,必须显示地指定它为extern。
即必须在最初就定义为:extern const int bufSize = 512;
4. 引用就是对象的另一个名字,在程序中它的主要用作函数的形式参数。引用是一种复合类型,通过在变量名前加 & 来定义,复合类型是指用其它类型定义的类型。在引用的情况下,每一种引用类型都“关联到”某一其它类型,不能定义引用类型的引用 ,但可以定义其它任何类型的引用。
引用必须用与该引用同类型的对象初始化:
int ival = 1024; int &refVal = ival; // 正确 int &refVal2; // 错误 int & refVal3 = 10 // 错误
引用只是它绑定的对象的另一个名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上,当引用初始化后,只要该引存在,它就保持绑定到初始化时指向的对象,不能将引用绑定到另一个对象。
要理解的一个重要概念是“引用只是对象的另一个名字”。
如果用const 修饰,则表示不能通过引用来修改所绑定的变量的值,而且,将普通的引用绑定到const对象也是不合法的:
const int ival = 1024; const int &refVal = ival; // 合法,因为对象及引用都是const的 int &ref2 = ival; // 非法,因为非const变量引用了一个const对象
Const引用可以初始化为不同类型的对象或者初始化为右值,如字面常量。
int i = 42; const int &r = 42; const int &r2 = r+i;
同样的初始化对于非const引用却是不合法的,下面解释它的原因:
double dval = 3.14; const int &ri = dval;
编译器会把这些代码转换为:
int temp = dval; // 建立一个临时变量,将ri绑定到临时变量。 const int &ri = temp;
即是说:非const引用只能绑定到与该引用同类型的对象,而const引用可以绑定到不同但相关的对象或绑定到右值。
double val = 42.999; const int &r3 = val; val = 2; //r3 = 4; 非法 // 改变后 val = 2 而 r3 = 42
评论