深入理解C++引用

概念:

变量名,本身是一段内存的引用,即别名(alias)。此处引入的引用,是为已有变量起一个别名。

声明如下:

int main()
{
	int a;
	int &b=a;
}

规则:

1、引用没有定义,是一种关系型声明。声明它和原有某一变量(实体)的关系。故而类型与源类型保持一致,且不分配内存,与被引用的变量有相同的地址;

2、声明的时候必须初始化,一经声明,不可变更;

3、可对引用,再次引用,多次引用的结果,是某一变量具有多个别名;

4、&符号前有数据类型时,是引用,其它皆为取地址。

int main()
{
    int a,b;  
    int &r = a;  
    int &r = b;//错误,不可更改原有的引用关系;  
    float &rr = b; //错误,引用类型不匹配;  
    int &rrr = r;//可对引用再次引用,表示a变量有两个别名,分别为r和 rr;  
  
    return 0;  
}  

应用:

C++很少使用独立变量的引用,如果使用某一变量,就直接使用它的原名,没有必要使用它的别名。

值作函数参数 (call by value):

void swap(int a, int b); //无法实现两数据的交换
void swap(int *p, int *q); //开辟了两个指针空间实现交换

引用作函数参数 (call by reference):

void swap(int &a, int &b){
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}
int main(){
    int i = 3,j = 5;
    cout<<"i = "<<i<<"j = "<<j<<endl;
    swap(i,j);
    cout<<"i = "<<i<<"j = "<<j<<endl;
    return 0;
}

c++中引入引用后,可以用引用解决的问题。避免用指针来解决。

提高:

引用的本质是指针,C++对裸露的内存地址(指针)作了一次包装。又取得的指针的优良特性。所以再对引用取地址,建立引用的指针没有意义。

  • 1 可以定义指针的引用,但不能定义引用的引用。
        int a;
	int* p = &a;
	int*&rp = p; //ok
	int &r = a;
	int&&rr = r; //error

实例:

#include <iostream>

using namespace std;

void swap(char *pa,char *pb)
{
    char *t;
    t = pa;
    pa = pb;
    pb = t;
}
void swap2(char **pa,char **pb)
{
    char *t;
    t = *pa;
    *pa = *pb;
    *pb = t;
}

void swap3(char * &pa,char *&pb)
{
    char *t;
    t = pa;
    pa = pb;
    pb = t;
}


int main()
{
    char *pa = "china";
    char *pb =  "america";

    cout<<"pa "<<pa<<endl;
    cout<<"pb "<<pb<<endl;
    swap(pa,pb);
	cout<<"pa "<<pa<<endl;
    cout<<"pb "<<pb<<endl;
    swap2(&pa,&pb);
	cout<<"pa "<<pa<<endl;
    cout<<"pb "<<pb<<endl;
    swap3(pa,pb);
    cout<<"pa "<<pa<<endl;
    cout<<"pb "<<pb<<endl;
    return 0;
}
  • 2 可以定义指针的指针(二级指针),但不能定义引用的指针。
int a;
int* p = &a;
int** pp = &p; // ok
int& r = a;
int&* pr = &r; // error
  • 3 可以定义指针数组,但不能定义引用数组,可以定义数组引用。
    int a, b, c;
    int* parr[] = {&a, &b, &c}; // ok,parr int**
    int& rarr[] = {a, b, c}; // error,rarr int&*
    int arr[] = {1, 2, 3};
    int (&rarr)[3] = arr; // ok

常引用:

  • const对象的引用必须是const的,将普通引用绑定到const对象是不合法的。 这个原因比较简单。既然对象是const的,表示不能被修改,引用当然也不能修改,必须使用const引用。实际上,const int a=1; int &b=a;这种写法是不合法的,编译不过。
  • const引用可使用相关类型的对象或右值(常量,非同类型的变量或表达式)初始化。这个是const引用与普通引用最大的区别。const int &a=2;是合法的。double x=3.14; const int &b=a;也是合法的。 

常引用原理:const引用的目的是,禁止通过修改引用值来改变被引用的对象。const引用的特性可通过如下代码说明:

double val = 3.14;
const int &ref = val; //开辟了一个未命名的空间(非const),以只读的方式引用
double & ref2 = val;
cout<<ref<<" "<<ref2<<endl; //3 3.14
val = 4.14;
cout<<ref<<" "<<ref2<<endl; //3 4.14
const int &rx = 2;  //常量
double c = 12.12;
const double &re = c+2;//表达式
c++;
cout<<re<<endl;  //14.2
本质:

引用的本质是:常指针,type *const p;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值