C++复合数据类型

1. 引用
(1)引用为对象起了另外一个名字,定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因此引用必须初始化。
(2)引用并非对象,相反的,它只是为一个已经存在的对象起的另外一个名字。所以不能定义引用的引用。
2. 指针

(1)引用本身不是对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用。

int *p;
int *&r = p;	//r是一个对指针p的引用

面对一条比较复杂的指针或引用的声明语句时,从右向左阅读有助于弄清除它的真实含义。

3. const对象
(1)const对象一旦创建后其值就不能再改变,所以const对象必须初始化。
(2)默认状态下,const对象仅在文件内有效。当以编译时初始化的方式定义一个const对象时,编译器将在编译过程中把用到该变量的地方都替换成对应的值。
(3)const对象的外部声明。const变量的初始值不是一个常量表达式,但有必要在文件间共享。我们不希望编译器为每个文件分别生成独立的变量。相反,我们想让这类const对象像其他(非常量)对象一样,只在一个文件中定义const,而在其他多个文件中声明并使用它。解决办法:对于const变量不管是声明还是定义都添加extern关键字。

//file_1.cpp 定义兵初始化一个可以被其他文件访问的常量
extern const int buf = fun();
//file_2.cpp 声明const常量
extern const int buf;

4. const引用(对常量的引用,简称常量引用)
(1)对常量的引用不能用作修改它所绑定的对象。
(2)非常量引用不能指向一个常量对象。
(3)引用的类型必须与起所引用对象的类型一致,但是有两个例外。第一种例外情况是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成(自动转化,实际绑定了一个临时对象)引用的类型即可,尤其,允许为一个常量引用绑定非常量对象、字面值,甚至是个一般表达式。

int i = 0;
const int &r1 = i;
const int &r2 = i * 2;
const int &r3 = 123;

double dval = 3.14;
const int &ri = dval;

5. 指针和const
(1)指向常量的指针。
想要存放常量对象的地址,只能使用指向常量的指针。指针的类型必须与其所指向对象的类型一致,但是有两个例外。第一种例外情况是允许令一个指向常量的指针指向一个非常量对象。和常量引用一样,指向常量的指针也没有规定其所指的对象必须是常量。所谓指向常量的指针,仅仅要求不能通过改指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变。

double dval = 3.14;
const double *p = &dval;

(2)const指针。
指针是对象而引用不是,因此就像其他对象类型一样,允许把指针本身定为常量。常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。

int num = 0;
int *const p = #


【C++Primer 第5版 笔记】

你可能感兴趣的:(C++)