函数形参为什么使用const引用(常引用)

来源:互联网 发布:进出货软件 编辑:程序博客网 时间:2024/05/22 01:46

&是为了引用传递,防止值传递的复制数据,const是为了保护数据不被改动。

const&防止传值时拷贝构造函数的调用开销

2、形参的对象为顶层const时,传入的实参既可以是const值,又可以是非const值,若是底层const,传入的实参只能是const的值。

顶层 const表示的是指针本身是一个常量, 底层const表示的是指针所指的对象是一个常量。

const int a;//顶层const

const int *a;//底层const

int * const a;//顶层const

const int &a;//底层const

更一般情况下,顶层const可以表示任意对象是一个常量,这对于算术类型、类、指针等任何数据类型都是成立的,

底层 const则与指针和引用等复合类型的基本类型部分有关,

比较特殊的是,指针既可以是顶层 const也可以是底层const,这一点与其他类型区别明显。

2. 顶层 const与底层const在执行拷贝操作时的不同

对于顶层 const与底层const ,在执行对象拷贝时有着明显的不同:

1)顶层const不受什么影响

int i = 0;  

const int ci = 42;       // 不能改变 ci 的值,这是一个顶层const  

i = ci;                        // 正确:ci 是一个顶层const,对此操作无影响  

const int *p2 = &ci;  // 允许改变 p2 的值,这是一个底层const  

const int *const p3 = p2;  // 靠右的 const 是顶层const,靠左的是底层const  

p2 = p3;                  // 正确:p2 p3指向的对象的类型相同,p3顶层const的部分不影响

2)底层cons的限制不能忽略

要求拷出和拷入的对象有相同的底层 const资格或者能转换为相同的数据类型,一般非常量能够向常量转换,反之则不行

int *p = p3;           // 错误:p3 包括底层const定义,而p没有  

p2 = p3;                // 正确:p2 p3都是底层const  

p2 = &i;                 // 正确:int* 能转换成const int*  

int &r = ci;  // 错误:普通的 int& 不能绑定到int常量上  

const int &r2 = i;   // 正确:const int& 可以绑定到一个普通int上  

原创粉丝点击