常引用
在C++中,常引用(const reference)是一种特殊的引用类型,它允许我们引用一个对象,同时确保这个引用不会修改所引用的对象。常引用的主要作用是提供对对象的只读访问权限。
具体来说,如果你有一个非常量对象,并希望创建一个对该对象的引用,但同时确保通过这个引用不能修改对象,你可以使用常引用。
它的声明方式如下:
int value = 42;
const int& ref = value; // 创建一个对value的常引用
// 在这个例子中,ref 是一个常引用,它引用了 value 。尽管 value 本身是可以修改的,但是我们不能通过 ref 修改 value 的值。
▶️常引用的一个常见用途是在函数参数中,当你不希望函数修改传入的参数时,可以将参数声明为常引用。
using namespace std;
void print(const int& number) {
cout << number << endl;
}
// 参数 number 是一个常引用,这意味着在函数内部不能修改 number 的值。
const 权限说明
在C++中,const 权限的放大和缩小是指将一个非常量对象转换为常量引用或者将一个常量对象转换为非常量引用的过程。然而,C++的类型系统不允许权限放大,即不允许将一个常量对象或常量引用转换为非常量引用,因为这可能会导致常量对象被非预期地修改。但是,权限缩小是允许的,即将一个非常量对象或非常量引用转换为常量引用。
下面给出几个权限放大和缩小的例子:
// 权限缩小
int value = 42;
const int& ref = value; //允许将非常量对象转换为常量引用
// 权限放大
int& A = ref; // A 本身是可以随意修改的,而ref是不能更改的,所以导致了权限放大
// 权限放大
const int value = 42;
int& ref = value; // 不允许将常量对象转换为非常量引用
// 权限平移
const int& B = ref; // 加上 const 后,不能通过 B 来修改 ref 的值,所以属于权限平移
有两种情况注意:
const int a = 10;
int b = a ;
这里仅仅是数值的拷贝,不存在权限的放大缩小平移。
还有一种情况:
int a = 10;
double& b = a; // 这里会报错:E0434无法用"int"类型的值初始化"double &"类型的引用(非常量限定)
这样的代码看起来没有什么问题,像是权限的缩小,但其实这里发生了隐式类型转换,
因为我们用b去引用a的时候其实引用的不是a,因为 double& 只能引用 double 类型的值,所以这里的a其实发生了隐式类型转换生成了一个临时变量,而👉临时变量是具有常性的!!!所以这里是会产生权限放大⚠️的问题的。
const 成员函数
C++将const修饰的“成员函数”称之为const成员函数,const 修饰类成员函数,实际修饰该成员函数隐含的 this 指针,表明在该成员函数中不能对类的任何成员进行修改。
如图:
const 修饰 成员函数的规则如下:
1. const对象不可以调用非const成员函数
2. 非const对象可以调用const成员函数
3. const成员函数内不可以调用其它的非const成员函数
4. 非const成员函数内可以调用其它的const成员函数