引用作为形参时以常指针作为实现方式,而引用还有常引用的形式,顾名思义他的实现方式就是指向常量的常指针,即对象地址与值都不可修改,即
#include <iostream>
using namespace std;
void main() {
int a = 2;
const int &b= a;
b = 3;
}
不过常引用有一些有意思的特性,被const修饰的对象的引用必须是常引用,一般引用绑定const对象时不合法的。
void main() {
const int a = 1;
int &b = a;
}
根据错误提示可知,由于对象是被const修饰 的,表示不能被修改,引用当然也不能修改,必须使用const引用。
而另一个特性则是const引用可以使用相关类型的对象初始化,
void main() {
int a = 1;
const int &b= 1;
}
这是使用了整形常量初始化了常引用,而这是合法的。
void main() {
float a = 1.23;
const int &b= a;
}
这是使用了浮点数初始化了常引用,而这是合法的。
void main() {
float a = 1;
const int &b = a;
cout << "b:" << b << endl;
a = 2;
cout << "b:" << b << endl;
cout << "a:" << &a << endl;
cout << "b:" << &b << endl;
}
常引用申请了新内存以存放初始化的值,并以const修饰,这样就可以实现对引用对象的类型转换,不过这样也等于引用了新的对象,跟最初的引用对象就没关系了。
那么初始化常量的操作也可以解释地通,常引用先申请一块内存存放常量,再指向内存地址,这样就可以完成一般引用不会申请内存便完不成的操作。
由于会申请内存,常引用还有另一种特性,关联相关类型的对象时会转换类型。
void main() {
const float &b = 1;
cout << "b:" << b << endl;
cout << "b:" << &b << endl;
}
常引用有了自己的内存,那么初始化常量的操作也可以解释地通,常引用先申请一块内存存放常量,再指向内存地址,这样就可以完成一般引用不会申请内存便完不成的操作。
由于会申请内存,常引用还有另一种特性,关联相关类型的对象时会转换类型。
void main() {
float a = 1.23;
const int &b = a;
cout << "b:" << b<< endl;
a = 2.34;
cout << "b:" << b<< endl;
cout << "a:" <<&a << endl;
cout << "b:" <<&b << endl;
}
可见第二次的值也没有改变,可这时a对应的地址的值已经改变了,那么常引用指向的地址肯定不同于对象了,不过这样也等于引用了新的对象,跟最初的引用对象就没关系了。
而转换类型可以理解为先申请一段内存用于存放整形,再将对象的值放入内存,最后再将常引用指向内存,这样就会指向与常引用相同类型的对象了。