问题导入
在c++中引用一般作为已有变量的别名,因此它有如下规则:
1.引用没有定义,是一种关系型声明。声明它和原有某一变量(实体)的关系。故而类型
与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。
2.声明的时候必须初始化,一经声明,不可变更。
3.可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。
由于引用的特性,所以无法对非同类型的变量进行引用
#include <iostream>
using namespace std;
int main()
{
int temp = 5;
//double &ref1 = temp; error
int &ref = temp; //true
}
const引用被用来防止对象的值随意被改变,但要注意的是:
1.const对象的引用必须是const的
2.const引用可使用相关类型的变量
第一条规则很好理解,不再赘述。对于第二条规则使用代码进行展示如下:
#include <iostream>
using namespace std;
int main()
{
int temp = 5;
const double &re1 = temp; //对非同类型的变量取引用,无异常
const int &ref = temp;
return 0;
}
问题示例
需要注意的是如果此时对变量做出改变的话,非同类型的引用的值不会改变,同类型引用值则会随变量的变化而改变。
#include <iostream>
using namespace std;
int main()
{
int temp = 5;
const double &re1 = temp;
const int &ref = temp;
temp = temp + 1;
cout<<"const double: "<<re1<<" const int: "<<ref <<" temp: " <<temp<<endl;
//const double: 5 const int: 6 temp: 6
return 0;
}
问题分析
在使用非同类型的常引用时,引用的并非变量本身而是一个无名的临时变量
#include <iostream>
using namespace std;
int main()
{
int temp = 5;
const double &re1 = temp;
const int &ref = temp;
temp = temp + 1;
cout<<"const double: "<<re1<<" const int: "<<ref <<" temp: " <<temp<<endl;
//const double: 5 const int: 6 temp: 6
cout<<"&re1: "<<&re1 <<" &ref: "<<&ref<<" &temp: "<<&temp<<endl;
//&re1: 0x7afe08 &ref: 0x7afe04 &temp: 0x7afe04
return 0;
}
从代码可以明显看出非同类型常引用的地址并不等于被引用变量的地址,而同类型常引用的地址与引用对象的地址相等。