C++中的引用,给我们提供了一种区别于C指针的形参定义方式。一般我们可以将其定义为
1)普通引用
void foo(int &n);
2)常量
void foo(const int n);
3)常量引用
void foo(const int& n);
三种方法用途不一样,都可以通过编译。
以普通引用为形参的函数,一般会更改实参的值,比如increment(int &n)等;以常量以及常量引用为形参的函数,一般不对实参进行修改。需要注意的是,当函数的功能确定后,不能把常量引用和普通引用混淆,虽然编译可以通过,运行也没有错误,但是会对函数的安全性以及功能造成影响:
1)如果一个本该是常量引用的形参定义成了普通引用,那么程序员会误认为这个形参可以修改。而且,在调用该函数的时候,会产生意想不到的错误。比如:
int getSize1(string &str){
return str.size();
}
int getSize2(const string &str){
return str.size();
}
void main(){
getSize1("helloworld");//报错
getSize2("helloworld");//正确
}
显然,getSize2才是符合正常函数思维的实现。
2)常量引用为形参时,形参指向实参的空间,而常量为形参时,编译器会给形参重新分配空间。
void foo1(const int n){
printf("%x\n", &n);
}
void foo2(const int &n){
printf("%x\n", &n);
}
int main(int argc, char *argv[]){
int n = 1;
printf("%x\n", &n);
foo1(n);
foo2(n);
return 0;
}
//输出:
//e25f58cc
//e25f58ac
//e25f58cc