上文:
const 引用
引用不是对象(引用并非对象,它只是为一个存在的对象所起的另外一个名字),所以const的引用只能是底层const(指向的对象是常量),因此,const的引用的关键字放在类型前面或者后面,都表示相同的含义(都表示一个指向常量整数的引用)。const的引用也称常量引用(但你得明白这只是个简称,因为并不存在常量引用)。
const int x = 5;
const int & a = x; // a是一个指向常量整数x的引用
int const y = 10;
int const & b = y; // b是一个指向常量整数y的引用
char* const& x
char * const& x 表示指向字符指针的常量引用(“常量引用”即指向常量的引用,这里字符指针是常量),可以解释为:x 是一个常量引用,它引用了一个指针,这个指针指向一个字符并且这个指针本身的值不能被改变(即它不能被重新指向其他地址),但所指向的字符的值是可以改变的。
char arr1[] = "Hello";
char arr2[] = "world";
char* const ptr1 = arr1;
char* const& x = ptr1;
// 通过x修改字符数组的内容
x[0] = 'h';
std::cout << arr1 << std::endl; // 输出 "hello"
x=arr2; //非法, x是常量引用(即指向 常量指针), 不能修改所指向的值(指针的指向),
上述代码中数组名arr1会被当作字符串"Hello", c++ 中 当一个字符数组作为右值使用时,它会自动转换为指向其首元素的指针,即数组名会被解释为指针。而对于字符指针(即指向字符的指针),会将其视为以null字符结尾的字符串。可以结合字符数组(小tips) 这篇文章理解。
const char* & x (char const *& x这两种写法等价)
const char* & x 表示指向常量字符指针的引用,可以解释为:x 是一个引用,它引用了一个指向常量字符的指针。这个指针的指向可以改变(即它可重新指向其他地址),但是这个指针指向的对象的值不能改变。
char arr1[] = "World";
char const* ptr1 = arr1;
char const* &x = ptr1;
std::cout << ptr1 << std::endl; // 输出 "World"
// 修改指针指向不同的常量字符
char arr2[] = "Hello";
char const* ptr2 = arr2;
x = ptr2;
std::cout << ptr2 << std::endl; // 输出 "Hello"
//x[0]='h'; //非法,不能改变指针指向对象的值
const char * const &x
const char * const & x 表示指向常量字符的常量指针的常量引用,可以解释为:x是一个常量引用,它指向了一个常量指针,并且这个常量指针也指向一个常量字符。所以即不能修改指针的指向,也不能修改字符的值。
const char* ptr1 = "Hello";
const char* const& x = ptr1;
// 无法通过x修改字符内容
// x[0] = 'h'; // 错误,指针所指向的字符是不可修改的
std::cout << x << std::endl; // 输出 "Hello"
//也不能修改指针指向
const char* ptr2 = "World";
//x = ptr2; //非法
总结:引用是不是常量引用看,它引用的那个对象是不是常量。当遇到复杂的复合类型时可以从右往左看,比如 char* const & x: 首先x是引用,然后是const 常量引用,接着是 char* 类型的const的引用。
以上是我学习过程中积累的知识,若有疏漏之处,还请各位不吝赐教。