普通引用为形参的函数,一般会更改实参的值;以常量以及常量引用为形参的函数,一般不对实参进行修改。
常量引用兼有常量和引用的优点。不会新创建一个变量然后进行拷贝,而是直接传对象,速度快,同时保证了在函数内部无法对对象进行修改。
通常,引用的类型必须和所引用的类型一致,但常量引用在类型不匹配时,编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作。普通引用则没有这样的过程。
这个过程的一个作用是让不匹配的类型隐式转换成需要的常量类型。一个典型的例子如下:
int g1(string &str){}
int g2(const string &str){}
int main(){
g1(".."); //failed
g2("..");
}
常量引用为形参时,形参指向实参的空间;而常量为形参时,编译器会给形参重新分配空间。
int f(const int x) {cout<<&x<<endl;}
int g(const int &x) {cout<<&x<<endl;}
int main() {
int n=1;
cout<<&n<<endl;
f(n);
g(n);
}
0x3beafe1c
0x3beafdf0
0x3beafe1c