C++ 引用

一、引用

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

引用的声明方法:类型标识符 &引用名=目标变量名;

eg:int a;

       int &b=a; //定义引用b,它是变量a的引用,即别名

 

说明:

(1)&在此不是求地址运算,而是起标识作用。

(2)类型标识符是指目标变量的类型。

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。 

(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。

(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。

指针和引用的区别:

(1)引用必须在创建时进行初始化,指针可以随时进行初始化

(2)一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。

 

二、引用的用法

1、基本数据类型的引用

#include<iostream>
#include<stdlib.h>
using namespace std;

int main()
{
    //基本数据类型的引用
    int a = 10;
    int &b = a;//b是a的别名 //引用必须初始化

    b = 20;
    cout<<a<<endl;//20 说明对b这个别名的任何赋值都直接影响到a

    a = 30;
    cout<<b<<endl;//30 对本体的直接赋值,也会影响到别名
	
    return 0;
}

运行结果:

b是a的别名,对别名进行赋值,也会影响到本体;对本体进行赋值,也会影响到别名

2、结构体类型的引用

#include<iostream>
#include<stdlib.h>
using namespace std;

typedef struct//结构体的引用
{
	int x;
	int y;
}Coord;


int main()
{

    //结构体的引用
    Coord c;
    Coord &c1 = c;//c1是结构体c的别名

    c1.x = 10;
    c1.y = 20;

    cout<<c.x<<","<<c.y<<endl;
	
    return 0;
}

运行结果:

3、指针类型的引用

类型 *&指针引用名 = 指针;

#include<iostream>
#include<stdlib.h>
using namespace std;

int main()
{
    int a = 3;
    int *p = &a;//指针p指向a
    int *&q = p;//*q是指针p的别名

    *q = 5;
    cout<<a<<endl;//5

    return 0;
}

运行结果:

4、引用作函数参数

#include<iostream>
#include<stdlib.h>
using namespace std;

void fun(int&a,int &b);

int main()
{
    //函数参数使用引用
    int x = 10;
    int y = 20;
    cout<<x<<","<<y<<endl;

    fun(x,y);
    cout<<x<<","<<y<<endl;

    return 0;
}

void fun(int&a,int &b)
{
    int c = 0;
    c = a;
    a = b;
    b = c;
}

运行结果:

三、总结

(1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。

(2)用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。

(3)引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

(4)使用引用的时机。流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。

补充:

引用和多态

引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

class A;

class B:public A{……};

B b;

A &Ref = b; // 用派生类对象初始化基类对象的引用

Ref 只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过Ref产生多态效果。
 

部分参考:https://blog.youkuaiyun.com/tingzhiyi/article/details/75321112


 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值