当一个常量引用绑定到与其本身不同的数据类型时,会生成一个临时量。
例如,有一个const int&
(常量引用指向整数),如果用一个double
类型的值去初始化它,编译器会创建一个临时的int
变量,这个临时变量初始化为double
值转换后的结果,然后常量引用绑定到这个临时的int
变量。
这是因为引用必须与其绑定的对象类型严格匹配,而常量引用允许绑定到临时量,所以通过生成临时量来完成这种不同类型之间的绑定操作。
顶层 const 名字的由来
- 可以将数据类型的定义看作是一个层次结构。当 const 直接修饰一个变量本身时,就好像这个 const 是处于这个变量定义的 “顶层”。例如在
const int a = 5;
中,const
是直接加在int
类型的变量a
上的,从层次角度理解,它是在最外层限制了变量a
本身,所以称为顶层 const。
底层 const 名字的由来
- 对于指针和引用相关的 const,它主要约束的是指针或引用所指向或引用的对象。在层次结构中,相对于变量本身,指针或引用所指向的对象处于一个 “底层” 的位置。例如在
const int* p;
中,const
约束的是*p
(也就是p
所指向的对象),而不是p
本身(p
本身可以改变指向),这种对所指对象的约束就像在层次结构的底层起作用,所以称为底层 const。
-
顶层 const(top - level const)
- 含义:顶层 const 是指对象本身(变量或对象)是常量。对于基本数据类型的变量,如
int
、double
等,变量本身的值不能被改变。例如const int a = 5;
,这里a
就是顶层 const,因为a
这个变量本身的值不能被修改。 - 应用场景和示例:在函数参数传递时,如果函数不希望改变传入的参数的值,可以将参数声明为顶层 const。比如
,在这个函数中,void printValue(const int num) {std::cout << num << std::endl;}
num
是顶层 const,函数内部不能修改num
的值。
- 含义:顶层 const 是指对象本身(变量或对象)是常量。对于基本数据类型的变量,如
-
底层 const(low - level const)
- 含义:底层 const 主要用于指针和引用,它表示指针或引用所指向(或引用)的对象是常量。例如
const int* p;
,这里p
是一个指针,它所指向的int
对象是常量,p
就是底层 const。这意味着可以改变p
本身(让它指向其他对象),但是不能通过p
来修改它所指向的对象的值。 - 应用场景和示例:当函数的参数是一个指向常量的指针或者引用时,如
,这里void printArray(const int* arr, int size) { for(int i = 0; i < size; ++i) std::cout << arr[i] << " "; std::cout << std::endl; }
arr
是底层 const,函数内部不能通过arr
修改数组元素的值,但可以改变arr
本身的值(比如让它指向其他数组)。
- 含义:底层 const 主要用于指针和引用,它表示指针或引用所指向(或引用)的对象是常量。例如