C++中的引用方法
创始人
2024-12-20 16:01:50
0次

背景

在c/c++中,访问一个变量只能通过两种方式被访问,传递,或者查询。这两种方式是:

1.通过值访问/传递变量

2.通过地址访问/传递变量–这种方法就是指针

除此之外没有第三种访问和传递变量值的方法。引用变量也就是个指针变量,它也拥有内存空间。最关键的是引用是一种会被编译器自动解引用的指针。很难相信么?

下面是一段使用引用的简单c++代码

#include   
int main()  
{  
    int i = 10;   // A simple integer variable  
    int &j = i;   // A Reference to the variable i  
    j++;   // Incrementing j will increment both i and j.  
    // check by printing values of i and j  
    cout<<  i  <<  j  <

引用其实就是c++中的常量指针。表达式int &i = j;将会被编译器转化成int *const i = &j;而引用之所以要初始化是因为const类型变量必须初始化,这个指针也必须有所指。下面我们再次聚焦到上面这段代码,并使用编译器的那套语法将引用替换掉。

#include   
int main()  
{  
    int i = 10;            // A simple integer variable  
    int *const j = &i;     // A Reference to the variable i  
    (*j)++;                // Incrementing j. Since reference variables are   
                          // automatically dereferenced by compiler  
    // check by printing values of i and j  
    cout<<  i  <<  *j  <

读者一定很奇怪为什么我上面这段代码会跳过打印地址这步。这里需要一些解释。因为引用变量时会被编译器自动解引用的,那么一个诸如cout << &j << endl;的语句,编译器就会将其转化成语句cout << &*j << endl;现在&*会相互抵消,这句话变的毫无意义,而cout打印的j值就是i的地址,因为其定义语句为int *const j = &i;

所以语句cout << &i << &j << endl;变成了cout << &i << &*j << endl;这两种情况都是打印输出i的地址。这就是当我们打印普通变量和引用变量的时候会输出相同地址的原因。

下面给出一段复杂一些的代码,来看看引用在级联(cascading)中是如何运作的。

#include   
int main()  
{  
    int i = 10; // A Simple Integer variable  
    int &j = i; // A Reference to the variable  
    // Now we can also create a reference to reference variable.   
    int &k = j; // A reference to a reference variable  
    // Similarly we can also create another reference to the reference variable k  
    int &l = k; // A reference to a reference to a reference variable.  
    // Now if we increment any one of them the effect will be visible on all the  
    // variables.  
    // First print original values  
    // The print should be 10,10,10,10  
    cout<<  i  <<  ","  <<  j  <<  ","  <<  k  <<  ","  <<  l  <

下面这段代码是将上面代码中的引用替换之后代码,也就是说明我们不依赖编译器的自动替换功能,手动进行替换也能达到相同的目标。

#include   
int main()  
{  
    int i = 10;         // A Simple Integer variable  
    int *const j = &i;     // A Reference to the variable  
    // The variable j will hold the address of i  
    // Now we can also create a reference to reference variable.   
    int *const k = &*j;     // A reference to a reference variable  
    // The variable k will also hold the address of i because j   
    // is a reference variable and   
    // it gets auto dereferenced. After & and * cancels each other   
    // k will hold the value of  
    // j which it nothing but address of i  
    // Similarly we can also create another reference to the reference variable k  
    int *const l = &*k;     // A reference to a reference to a reference variable.  
    // The variable l will also hold address of i because k holds address of i after  
    // & and * cancels each other.  
    // so we have seen that all the reference variable will actually holds the same  
    // variable address.  
    // Now if we increment any one of them the effect will be visible on all the  
    // variables.  
    // First print original values. The reference variables will have * prefixed because   
    // these variables gets automatically dereferenced.  
    // The print should be 10,10,10,10  
    cout<<  i  <<  ","  <<  *j  <<  ","  <<  *k  <<  ","  <<  *l  <

我们通过下面代码可以证明c++的引用不是神马别名,它也会占用内存空间的。

#include   
class Test  
{  
    int &i;   // int *const i;  
    int &j;   // int *const j;  
    int &k;   // int *const k;   
};  
int main()  
{      
    // This will print 12 i.e. size of 3 pointers  
    cout<<  "size of class Test = "  <<   sizeof(class Test)  <

结论

我希望这篇文章能把c++引用的所有东东都解释清楚,然而我要指出的是c++标准并没有解释编译器如何实现引用的行为。所以实现取决于编译器,而大多数情况下就是将引用实现为一个const指针。

引用支持c++虚函数机制的代码

#include   
class A  
{  
public:  
         virtual void print() { cout<<"A.."<                
            

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...