C++的引用定义语法和应用

简介: C++的引用定义语法和应用

一、什么是引用

在C++中,引入引用就是为了避免指针在使用过程中可能出现的问题(空指针,不合法内存),提高程序的安全性。


引用是一种关系型声明的类型,说明它跟别的变量的关系,它所声明的变量不占内存空间,通俗来讲,是已有变量的别名,来说明跟已有变量的关系,所以引用变量的类型要跟已有变量的类型保持一致。


引用引入分析:


二、引用的基本语法和注意事项

语法:type* — 代表指针

type & ---> 引用类型  比如: int& ,char&
int --- int*(指针类型跟指向的类型保持一致)
在声明引用变量时,一定要说明跟其他变量的关系(必须初始化)
int i;
int& ri = i; //说明ri是i的别名,ri是引用类型声明变量

//[1] 引用的基本概念 type&
    int i = 10;
    int& ri = i; //必须初始化,要说明跟某个变量的关系
    cout << "ri = " << ri << "i = "<< i<< endl;//10 10
    cout << "&ri = " <<  &ri << "    "<< "&i = " << &i << endl; //地址相同

    ri = 20;
    cout << "ri = " << ri << "i = "<< i<< endl;  //20 20 

    i = 30;
    cout << "ri = " << ri << "i = "<< i<< endl; //30 30

//[2] 注意事项
    //[2.1]
    int j = i;  //int j = 100; ---> 其他的基本数据类型可以使用常量和变量来初始化
    //int & rj = 100; //error 这种方式声明的引用,把它叫作普通引用,普通引用不能使用常量来初始化,内存地址不确定
    //[2.2]
    int &rj = j; //rj就是j的别名,跟j代表着同一块内存空间,引用一经初始化,不可更改
    rj = i; //将变量i的值,赋值给rj,并不是初始化,使用类型声明一个变量时给它赋值,才是初始化
    //[2.3]
    int& rrj = rj; //引用可以多次被引用 多次被引用的结果就是一个变量有多个别名

    cout << "rrj = " << rrj << "rj = " << rj << "j = " << j << "i = " << i << endl;
    //[2.4]
    // &符号前有数据类型时为引用 ,其他情况下,为取地址


三、引用的应用

对于引用而言,如果只在一个函数中使用变量,没有必要使用引用,使用基本的数据类型就可以,基本的数据类型除了在函数中可以用来声明变量之外,还可以做函数的形参、函数的返回值。

1、引用做为函数的形参

引用做为函数的形参,那么该参数采用是址传递

void changeA(int& aa) //引用做为函数形参时,可以不初始化
{

    aa = 20;
}

void changeAA(int* p)
{
    if(p != nullptr)
    {
        *p = 50;
    }

}

void test(int a[]) //int* a
{

   //sizeof(a) = ?
}

void test1(int a[1000]) //int* a
{
   //sizeof(a) = ?
}

void test2(int a[5])
{
  //sizeof(a) = ?
}
//编译器将以上三个函数都变成 void test2(int *a) void test1(int* a) void test(int *a)

//数组做为函数形参时,会自动退化为指针
int main()
{
    //[1] 通过一个函数,来修改外部变量的值
    int a = 10;

    changeA(a);
    cout << "a = " << a << endl;

    changeAA(&a);
    cout << "a = " << a << endl;

    int b[5];
    test(b);
    test1(b);

    return 0;
}
相关文章
|
1月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
73 15
|
1月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
118 6
|
2月前
|
编译器 C语言 C++
☺初识c++(语法篇)☺
☺初识c++(语法篇)☺
|
2月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
79 12
|
3月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
83 5
|
5月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
368 4
|
6月前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
115 5
|
6月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
90 2
|
6月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
89 1
|
6月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
135 2

热门文章

最新文章

下一篇
oss创建bucket