引用变量和const变量一样,在声明是要初始化,即要定义,不能仅声明。不管是全局还是局部变量都要初始化。不同于const变量,即使是具有默认构造函数的类的引用变量也需要初始化。
const引用可以指向非const变量,const变量,或者右值(常量表达式)。例如:
#include <iostream>
using namespace std;
int main(void)
{
int a=10;
const int b=20;
const int &ref1=a;
const int &ref2=b;
const int &ref3=30;
cout<<ref1<<" "<<ref2<<" "<<ref3<<endl;
return 0;
}
结果:10 20 30
但是反过来非const引用不可以指向const变量,也不能指向右值。例如:
#include <iostream>
using namespace std;
int main(void)
{
int a=10;
const int b=20;
int &ref1=a;
int &ref2=b;
int &ref3=30;
cout<<ref1<<" "<<ref2<<" "<<ref3<<endl;
return 0;
}
上例中出现编译错误,对ref2和ref3的初始化都是非法的。
const引用还可以绑定不同类型的对象,可以隐式转换的对象。
#include <iostream>
using namespace std;
int main(void)
{
double a=1.23;
const int &refa=a;
cout<<refa<<endl;
return 0;
}
对于上例程序编译器会转换为:
double a=1.23;
int temp=a;
const int &refa=temp;
但是非const引用会造成编译错误。
#include <iostream>
using namespace std;
int main(void)
{
double a=1.23;
int &refa=a; //编译错误
cout<<refa<<endl;
return 0;
}