第2课 - C++中的引用


  1.引用定义与语法
        引用可以看作一个已经定义的变量的别名
        引用的语法:Type& name = var
           

#include <iostream>

int main(int argc, char** argv) {
	int a = 5;
	int& b = a;
	
	b = 5;
	
	printf ("a = %d\n",a);
	printf ("b = %d\n",b);
	printf ("&a = %08x\n", &a);
	printf ("&b = %08x\n", &b);
	
	return 0;
}


        打印结果 a=5, b=5, &a = 0x22fe54, &b=0x22fe54
        由于b就是a的引用,b引用a,那么b就是a的别名,指代同一段内存空间。
        
        注意:引用必须在声明时使用其他变量进行初始化
              引用作为函数参数的时候可以不进行初始化。
    
    2.引用的意义    
        a.在一些场合代替指针
        b.相对于指针具有更好的可读性
           

#include <iostream>

/* 交换函数 */
void swap(int &a, int &b)
{
	int temp = b;
	b = a;
	a = temp;
}

int main(int argc, char** argv) {
	int a = 5;
	int b = 6;
	
	swap (a, b);
	
	printf ("a = %d\n",a);
	printf ("b = %d\n",b);

    return 0;
}

    3.const的引用
        a.const引用让变量拥有只读属性(只能通过指针访问地址来改变数值)
        b.当使用const引用进行初始化时,将生成一个只读变量,会为该变量分配空间,并使用引用名作为这段空间的别名。
           

#include <iostream>

int main(int argc, char** argv) {
	const int &b = 1;
	int* p = (int*)&b;
	
	//b = 6;
	*p = 6;
	
	printf ("b = %d\n",b );
	return 0;
}

            同样,只能通过指针来改变该变量的值,因此这是一个只读变量。
            声明只读变量 const int &b = 1;
            声明常量     const int b = 1;

            
        c.引用在C++中的内部实现是一个常指针, 即
            Type& Name <==> Type* const Name, 因此引用有自己的存储空间,和指针占用的空间大小相同。
            int* const a = &b;  <==> int& a = b;
            

#include <stdio.h>

struct TRef
{
    char& r;
};

int main(int argc, char *argv[])
{ 
    char c = 'c';
    char& rc = c;       /* char* const rc = c */
    TRef ref = { c };   
    
    printf("sizeof(char&) = %d\n", sizeof(char&)); /* sizeof(*rc)==sizeof(c)==1 */
    printf("sizeof(rc) = %d\n", sizeof(rc)); /* sizeof (*rc) == 1 */
    
    printf("sizeof(TRef) = %d\n", sizeof(TRef)); /* sizeof(rc) == 4 */
    printf("sizeof(ref.r) = %d\n", sizeof(ref.r)); /* 1 */

    return 0;
}

    
    4.函数返回值为引用时
        a.返回栈变量
            不能成为其他引用的初始值
            不能作为左值使用
        b.返回静态变量或全局变量
            可以成为其他引用的初始值
            可以作为左值使用
        
      

#include <iostream>

/* 返回静态局部变量 a */
int & f(void)
{
	static int a = 0;
	
	return a;
}

int& g(void )
{
	int a = 0;
	
	return a;
} 
  
int main(int argc, char** argv) {
	
 int a = g();
 int &b = g();  /* b引用局部的a */
		
 f() = 10;
	
 printf ("a = %d\n", a);
 printf ("b = %d\n", b);
 printf ("f() = %d\n", f());
	
 return 0;
	
}


                int a = g();   /* 将局部变量a的值返回, a=0 */
                int &b = g();  /* b引用局部的a,即b指向a处的4字节空间,但是函数调用完a出空间会被释放,b是随机数 */
                f() = 10;       /* f()返回a的引用,因此可以打印出10,即指向静态存储区的引用的4字节为10 */
                
因此 对于三目运算符
    所有的可能返回都是变量,就会返回变量的引用,可以作为左值使用
    可能返回有常量时,返回的是值
    
小结:
    1.C++的引用可以看作变量的别名来使用
    2.C++的常引用可以使一个变量拥有只读属性
    3.C++的常引用可以使用常量初始化而得到一个只读变量
    4.C++中引用的本质是一个常量指针
        
                    
            
       

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值