首页 > 编程语言 >【c++基础知识——&引用的深度理解】

【c++基础知识——&引用的深度理解】

时间:2024-09-19 19:48:25浏览次数:3  
标签:const 常量 int c++ 基础知识 修改 引用 变量

C++ 引用 深度理解

  1. 对于一个函数来说,传值和传引用,在函数功能上没有区别,但在性能和副作用方面有显著差异。

    • 传值
      当按值传递参数时,函数会创建参数的一个副本。这样做的好处是函数内部对参数的修改不会影响原始变量,但缺点是对于大对象来说,拷贝操作会带来性能开销。

    • 传引用
      当按引用传递参数时,函数接收的是参数的引用,而不是副本。这样做的好处是避免了拷贝操作,提高了性能,但函数内部对参数的修改会影响原始变量。

    除此之外,当函数的形参是一个const修饰的引用的时候,意思是在该函数内,不会通过这个引用修改值。所以实参是不是const修饰的引用,是不是const修饰的变量,都没有关系。只是说明该函数内部不会通过引用修改值。而且外面如果不是常量,函数外面可以随意修改值的。

    说白了,就是形参的const 引用,只能保证在这个函数里,不会改变这个引用的值,至于外面传入的实参是值还是引用,改不改值,我不管。

#include <iostream>
using namespace std;
void func(const int& a)//这个const 引用的意思是,只能保证在这个函数里,不会改变这个引用的值,至于外面是值还是引用,改不改,我不管。
{
    std::cout << "test = " << a << std::endl;
    return;
}

void func2(int& a)//这个引用的意思是,在这个函数里,可以改变这个引用的值,至于外面是值还是引用,改不改,我不管。
{
    std::cout << "test = " << a << std::endl;
    return;
}
int main()
{
    const int a = 0;//定义了一个常量,本身值不可修改
    //a++;// 这行代码是不合理的,因为 a 是一个常量,不能修改其值
    func(a);//可以作为实参
    func2(a); // 不合理,因为func2()的形参是非const类型,预示着可以在函数里改变值,你将一个不能改变值的变量传递给它是不可以的。

    int b = 0;// 定义了一个变量
    func(b); //可以作为实参

    b++; // 外面修改不影响,作为实参传入const引用
    int& c = b;//定义c位非常量引用,引用的值就是变量b
    func(c);//非const引用,可以作为实参传给const 引用形参,说明函数体内不改值

    c++;
    const int& d = c;// d 是 c 的常量引用,不能通过d去修改c的值,但是通过c可以修改引用的值
    func(d);

    c++;//这是合理的,因为c是非常量引用可以修改值
    // d++;// 不合理,因为 d 是一个常量引用,不能修改其值,d是常量引用,c是非常量引用,二者的值都是变量b

    return 0;
}
  1. 多个引用所绑定的值是同一个地址的内容的时候,不能通过常量引用修改,但是可以通过非常量引用修改值。如果非常量引用修改了值,那么相应的常量引用对应的值,也发生了改变。因为二者所对应的变量是同一个地址里的内容。由此我们可以得知,常量引用的意思是,不要希望通过我去改变所引用变量的值,但是至于其他引用有没有改变所引用的值,我就管不了了。我只能保证我不会改而已。

例如:

int a = 1;

const auto& b = a;

auto& c = a;

c++;//可以通过c改变,所引用的值,与此同时,常量引用b所引用的值也被改变了。因为二者所引用的值是同一个地址。


  1. 被const修饰的变量,是无法修改值的,谁都不可以修改,除了非常规手段,但是及其不推荐。所以即使重新定义引用绑定到这个变量上,也不可能修改,所以只能是常量引用可以绑定这个变量上。意味着不可试图修改引用值。
#include <iostream>
using namespace std;

int main()
{
    const int a = 0;// 定义了一个常量,意思是不可更改,重新定义的引用绑定到该变量也不能修改,而且只能常量引用可以绑定

    int& b = a;// 不合理,非常量引用不能绑定到常量,编译报错

    int b = a;//合理,重新定义了一个变量b,是a的一个拷贝,但是是非常量。b值得改变丝毫不影响a得值

    int& c = b; //合理,定义了一个非常量引用c,绑定到b上,因为b是非常量,可以绑定,且可以通过c修改。

    const int& d = c; //合理,定义了一个常量引用d,绑定到非常量引用c所绑定的变量上b上,所以和c绑定的是同一个变量,但是不要企图通过d去改变引用的值,至于c去不去改,变量b自己去不去改,其他可能的引用去不去修改,我d管不到。我只保证我自己无法修改。

    return 0;
}

标签:const,常量,int,c++,基础知识,修改,引用,变量
From: https://blog.csdn.net/XWWW668899/article/details/142368504

相关文章

  • 深度长文:揭开C/C++三目运算符的全部秘密,助你写出更优雅的代码(上)
    在编程中,简洁和高效是程序员永恒追求的目标。当我们面对条件判断时,通常第一反应是使用if-else语句——这是最为常见的选择。然而,C和C++中还有一种非常简洁优雅的条件判断方式——三目运算符(TernaryOperator)。也许你曾经在一些代码中见到它,简短的?:语法,但却不知道它的工作原理......
  • java pom两个模块需要互相引用怎么办
    在Maven项目中,如果两个模块需要互相引用,通常的做法是将它们放在同一个父项目下,并使用父项目的聚合功能来管理这些模块。这样做可以确保模块之间的依赖关系能够正确解析。项目结构假设你有两个模块module-a和module-b,它们需要互相引用。你可以创建一个父项目parent-project,并......
  • java-----方法引用
    方法引用:把已有的方法拿过来用,当做函数式接口中抽象方法的方法体方法引用符是::注意:    1.引用处必须是函数式接口    2.被引用的方法已经存在    3.被引用方法的形参和返回值需要跟抽象方法保持一致    4.被引用方法的功能要满足当前需......
  • CentOS 入门必备基础知识及实战案例分析
    CentOS(CommunityEnterpriseOperatingSystem)是一个基于RedHatEnterpriseLinux(RHEL)源代码构建的免费开源操作系统。由于其稳定性、安全性和广泛的社区支持,越来越多的用户开始使用它来搭建服务器。本文将从CentOS的入门基础知识入手,结合实际案例,详细讲解如何进行系统安装、......
  • Python 类中引用其他类的实现详解
    在面向对象编程(OOP)中,类是组织代码的一种重要方式,能够帮助开发者以模块化、复用性和扩展性的方式构建程序。在复杂的系统中,一个类通常会依赖其他类来实现其功能,称之为类的引用或依赖。本文将详细介绍如何在Python中实现类与类之间的引用,并通过实际示例演示如何在类中引用其他类。希......
  • Python 类中引用其他类的实现详解
    在面向对象编程(OOP)中,类是组织代码的一种重要方式,能够帮助开发者以模块化、复用性和扩展性的方式构建程序。在复杂的系统中,一个类通常会依赖其他类来实现其功能,称之为类的引用或依赖。本文将详细介绍如何在Python中实现类与类之间的引用,并通过实际示例演示如何在类中引用其他类。希......
  • C++Builder11的静态连接问题的解决
    1、问题用C++Builder11写了一个小程序,想将所有的运行包放在一个exe文件中,方便分发。但就是找不到原来版本中的Static-LinkC++RuntimeLibrary选项。2、经历(1)选择菜单project-options-C++linker去掉LinkwithDynamicRTL右边的√去掉>LinkwiththeDelphiRuntimeLibra......
  • 南沙C++信奥老师解一本通题 1357:车厢调度(train)
    ​ 【题目描述】有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合。假设从A方向驶来的火车有n节(n≤1000),分别按照顺序编号为1,2,3,…,n。假定在进入车站前,每节车厢之间都不是连着的,并且它们可以自行移动到B处的铁轨上。另外假定车站C可以停放任......
  • C++如何在main函数之前执行自定义操作
    目录一.前言二.利用全局变量的初始化机制1.利用构造函数2.用函数结果对全局变量赋值三.gcc可以利用__attribute__四.其他一.前言我们知道C++程序在main函数运行之前会先执行一些动作,比如一系列初始化动作,那么我们怎么让C++程序在main函数运行前执行一些自定义函数呢......
  • C++ 面试模拟02
    第一部分:基础知识什么是拷贝构造函数和赋值运算符?它们之间有什么区别?在C++中,const关键字的作用是什么?有哪些常见用法?C++中的内存管理机制是怎样的?如何避免内存泄漏?虚函数(virtualfunction)的作用是什么?虚函数表(vtable)是如何工作的?第二部分:面向对象编程什么是多态性?C++中......