c++中的引用

目录

引用的概念

引用的基本使用

常引用

结构体中的引用成员

指针和引用的区别


引用的概念

引用不是新定义一个变量,而是给已存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间

定义格式:

数据类型& 引用名=引用的目标;

例如:        int& ra=a;//给a取别名叫ra

引用的条件:

  1. 引用的同时必须初始化
  2. 引用的类型必须和引用的目标保持一致
  3. 引用的目标一旦确定就不能更改

引用的基本使用

#include <iostream>
#include <string>
//字符串的头文件,C语言的头文件string.h,如:strcopy(),strlen(),strcmp()
//而C++的字符串的头文件代表的是一个类
using namespace std;
int main()//C++规定,主函数的返回值必须是int类型的
{
    int a = 10;
    int * pa = &a;
    cout<<"&a"<<&a<<endl;
    cout<<"&pa:"<<&pa<<endl;//会单独开辟一片内存空间的
    cout<<"pa:"<<pa<<endl;
    int b = 10;//初始化
    int & rb = b;//给b变量取别名叫rb
    cout<<"&b:"<<&b<<endl;//0x61fe80
    cout<<"&rb:"<<&rb<<endl;//0x61fe80
    cout<<"b:"<<b<<endl;//10
    cout<<"rb:"<<rb<<endl;//10
    //int & rb = a;error 重定义
    rb = a;//这是表示给a取别名叫rb吗?
    //不是,是赋值
    cout<<"&rb:"<<&rb<<'\t'<<"&a:"<<&a<<endl;
    return 0;
}

常引用

格式:

const 数据类型& 引用名=引用的目标;

功能:不能通过引用来改变引用目标的值,但是可以通过引用的目标来改变值,通常可以将常引用用于函数的形参以保证形参不能通过引用被改变。但是可以通过

代码示例:

#include <iostream>
#include <string>
//字符串的头文件,C语言的头文件string.h,如:strcopy(),strlen(),strcmp()
//而C++的字符串的头文件代表的是一个类
using namespace std;
int add(const int& a,const int& b)//常引用,当我们的引用放在函数的形参位置时,可以不进行初始化
{
    return a+b;//将引用设置为常引用时,函数体的内部不会对形参进行更改
}
int main()//C++规定,主函数的返回值必须是int类型的
{
    int a = 10;
    int & ra = a;
    int b = 30;
    const int & rb = b;
    ra = 10;
    //rb = 30;//error
    b = 20;//b的值不能通过rb改变但是可以通过b可以改变
    //rb和b指向同一片空间
    cout<<"sum:"<<add(a,b)<<endl;
    return 0;
}

结构体中的引用成员

代码示例:

#include <iostream>
#include <string>
//字符串的头文件,C语言的头文件string.h,如:strcopy(),strlen(),strcmp()
//而C++的字符串的头文件代表的是一个类
using namespace std;
struct Student
{
    int h = 43;
    int age;
    int & score;//引用成为结构体成员时可以不进行初始化
    int & height = h;//也可以在结构体中进行初始化操作
    //Student(int h,int a,int& s,int& he):h(h),age(a),score(s),height(he){}
    //这种初始化方式使用圆括号进行,需要写构造函数
};

int main()
{
    int sco = 98;
    int hei = 180;
    //结构体中的成员定义是可以不进行初始化,但是用之前必须进行初始化,并且不能用引用直接初始化
    //Student s1(8,9,sco,hei);//结构体中使用引用必须初始化
    Student s2={8,9,sco,hei};
    //1、如果结构体中对引用没有初始化,必须在定义结构体变量的时候进行初始化
    //2、如果结构体中对引用初始化,可以在定义定义结构体变量的时候不进行初始化
    //cout<<s1.h<<endl<<s1.score<<endl;
    return 0;
}

指针和引用的区别

  1. 引用访问一个变量是直接访问,而指针是间接访问。
  2. 引用是变量的别名,不需要对其进行内存分配,但是指针需要内存分配。
  3. 引用的目标一旦确定就不能修改,但是指针能够改变指向。
  4. 引用必须在定义时就初始化,但是指针在定义时可以指向NULL,如果进行指向说明就会成为野指针。
  5. sizeof的含义不同:引用的大小是引用的数据类型的大小,而指针的大小是指针的大小,固定的4字节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值