C++引用

3 篇文章 0 订阅
1 篇文章 0 订阅
转载请注明出处:http://blog.csdn.net/ljian1992/article/details/42331067 

有错误的地方或者有更好的见解,欢迎指正。

概述

    变量是一段实际的连续的存储空间的别名,程序中通过变量来申请并命名存储空间,并且通过变量的名字可以使用该存储空间。在C语言中一段实际的连续的存储空间只能有一个别名(指针不能当作别名),但在C++中一段实际的连续的存储空间却可以有多个别名,这一种实现的机制即为引用。引用是一个已存在的变量的别名, 对引用操操作等于对变量的操作

语法

    type &name = var;

     Tips:

        1.引用必须在定义时初始化,并且初始化后无法再引用其它变量

例子

int a = 4;
int &b = a;

 image

引用本质

    引用在编译器的内部是用常量指针来实现的,因此引用既是指针,它是会占用内存空间的,它所占的内存空间的大小和指针所占的内存空间的大小是一致的。但在使用引用的时候,它会自动加上解引用符号。由于引用的本质是常量指针,故初始化后无法再改变它,也就是无法再引用其它变量了。

    C++把引用的本质隐藏了起来,让人感觉到它就是一个变量的新名字,站在使用者的角度,我们也没必要把引用当成一个常量指针,引用与指针并没有任何关系。但当使用引用程序出错后,可以从这一角度去分析为什么出错

测试代码

#include <stdio.h>
    
struct references
{    
    int &ref1;     
    char &ref2;
};
    
struct poiter
{     
    int *poiter1;     
    char *poiter2;
};
    
int main (void)
{  
  char a;  
  char &b = a;
    
  //通过常量指针来模拟引用   
  char *const c = &a;   #define c (*c)         
  printf ("sizeof(a) = %d\n",(int)sizeof (a));
  printf ("sizeof(b) = %d\n",(int)sizeof (b));
  printf ("sizeof(c) = %d\n",(int)sizeof (c));
  
  printf ("a addr: %p\n", &a);   printf ("b addr: %p\n", &b);
  printf ("c addr: %p\n", &c);     //证明引用占内存空间的大小和指针所占的内存空间大小是一致的  
  printf ("sizeof(struct references) = %d\n",(int)sizeof (struct references));
  printf ("sizeof(struct poiter) = %d\n",(int)sizeof (struct poiter));    
  return 0;
 }

 

 

引用相对于指针的优势

  1.引用可以使到函数的返回值作为左值使用

     返回栈变量的引用:由于栈空间的变量,会随着函数生命周期的结束而销毁,因此是栈变量是不能够返回引用作为左值使用的,也不初始化其它 引用

     返回静态变量或全局变量的引用:由于静态变量或全局变量的生命周期是程序的生命周期,故其返回值可以作为左值来使用,并且能够初始化其它引用

#include <stdio.h>

int & ret_reference(void)
{
    static int c = 0;
    
    return c;
}

int main(int argc, char *argv[])
{
    

    printf ("static c = %d\n", ret_reference ());
    ret_reference() = 20;  //修改静态局部变量为20
    printf ("static c = %d\n", ret_reference ());
    
    
    printf("Press enter to continue ...");
    getchar();  
    return 0;
}

    2.引用可以使到程序更容易理解

void swap(int& a, int& b)
{     int t = a;     a = b;     b = t;
}
调用: swap (a, b);

void swap_poiter (int *a, int *b)
{     int tmp = *a;     *a = *b;     *b = tmp;
} 
调用:swap_poiter (&a, &b)

同样是交换两个整形的数据,用引用来实现明显比用指针来实现更容易理解,也更符合人的思维习惯

 

引用与三目运算符

1.三目运算符返回变量的引用,若无变量则返回常量

2.三目运算符可以返回变量本身,故可以作为左值来使用

3.三目运算符可能的返回值中如果有一个常量值,则不能作为左值来使用

#include<stdio.h>
int main (void)
{
    int a = 1;
    int b = 2;
    (a < b? a: b) = 3;
    printf ("a = %d\nb = %d\n", a, b);
    
    (a<b? a: 3) = 3;   //报错 
    (a<b? 3: 2) = 3;   //报错 
    printf ("press enter to continue.......\n");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值