首页 > 编程语言 >C++ | 引用

C++ | 引用

时间:2023-07-31 18:46:18浏览次数:35  
标签:node 变量 demo C++ height 修改 引用

引用 &

  • 使用引用

    int b = 33, &a = b;
    b = 17;
    cout << a; // 打印a为17
    

    使用引用声明变量类似于指针,声明的变量会同被引用的变量绑定,修改任何一方的数据都会使另一方的数据也改变。使用上的区别在于使用引用不需要*,引用可以理解为一个别名。

  • 在函数中使用引用传递参数

    将参数设置为引用的作用是:调用函数时参数不进行拷贝,而是直接使用传入的变量,在函数中的所有修改都会应用于该变量。

    • 基本类型

      int myAge = 15;
      void newYear(int &age){age++;}
      

      使用引用传递变量,调用函数newYear(myAge)myAge变量将会被改变

    • 复杂数据结构(如类,结构体)

      vector<int> v(100);
      void sum(vector<int> &v){/* 求和 */}
      

      函数参数的传递都是拷贝一份副本,将副本传递进去(如基本类型),所以如果不使用引用,程序将会复制整个vector,大大浪费了时间以及内存

    • 指针

      引用跟指针的功能很类似,都是为了能在函数中修改传入的参数。

      相同点:下面代码中调用函数后m变量存储的都是demo的地址,m中的height也都被修改了

      void setHeight(member &m, int height){m.height = height;}
      setHeight(demo, h);
      void setHeight(member *m, int height){m->height = height;}
      setHeight(&demo, h);
      

      不同点:

      • 对于引用形式,虽然m变量存储的是被引用对象的地址,但对程序员来讲,m就是作为demo的一个别名,使用m就等于使用demo,而不是使用demo的地址。

      • 对于指针,假如以下面形式调用函数:

        member *p = &demo;
        setHeight(p, h);
        

        传入变量p作为参数后,p与m的值都是&demo,即p和m都指向demo的地址,使用他们都能修改demo中的数据,但他们是两个不同的变量,即&p&m是不同的,在函数中修改m变量并不能作用于p变量。本质上,传递指针参数也是拷贝变量。

        对于下面代码:

        void applyForMemory(node *n){
            n = new node[10];
        }
        node *p;
        applyForMemory(p);
        

        这段代码是不起作用的,n申请了空间,只是将n指向的地址改成了新空间的地址,但p的指向没有改变。这段代码反而造成了内存泄漏。

        void applyForMemory(node *&n){
            n = new node[10];
        }
        node *p;
        applyForMemory(p);
        

        将指针作为引用形式传递,可理解为变量n即p。给n申请了空间,n的指向被修改了,p也被修改。

      总而言之,单纯传递指针参数实际上是存在两个变量:作为参数传入的变量(p)和在函数中使用的变量(n),他们的值都是同一个地址,他们指向同一个地方(demo),所以能够在函数中使用n变量来修改demo变量的数据;但他们还是两个变量,具有不同的地址,在函数中修改n的值(即修改n的指向)并不能作用与p,p的指向依旧是demo。

      而将指针作为引用来传递可以简单理解为只有一个变量:p,把n当作p的别名,那么修改了n的值(指向)自然p的指向也被修改了;当然,实际上n与p还是两个变量,p存储着demo的地址,而n中存储的是p的地址,编译器会自动将对n的操作转换成对p的操作,所以看起来他们就是同一个变量。

  • 函数返回值使用引用

    将返回值的引用返回,即不进行复制然后返回副本

    当然,如果使用引用作为返回值,那么是无法返回在函数中声明的变量的。因为那些变量在栈中,随着函数的结束运行,栈的内存被释放,该变量也会被释放。

    node* & AVLTree::getRoot(){return this->root;}
    node* & root = tree.getRoot();
    

标签:node,变量,demo,C++,height,修改,引用
From: https://www.cnblogs.com/C111111/p/17594198.html

相关文章

  • C++ | 运算符重载
    运算符重载在类中的函数进行重载(成员函数)运算符重载用于重新定义运算符的作用,使用函数名称operatorOP作为函数名,其中OP为具体的运算符(如operator+)classTime{Timeoperator+(constTime&t);};Timea,b;Timec=a+b;在成员函数中重载的运算符,如+-等,默认左边......
  • C++初始化列表时,形参和实参名可以一样,编译器可以识别
    在这里初始化列表直接用age(age)即可,用this->age(age)反而会出错,C++不允许在成员初始化列表中使用this关键字来初始化类成员classPerson{public:Person(intage):age(age){}//Initializethe'age'memberdirectlyinthememberinitializerlistinta......
  • TreeCtrl 树的存储和还原 2, VC++
    TreeCrtl树的节点可以随意的添加,删除,移动。树保存到数据库中,并能从数据库读出还原。树节点的LPARAM存放ID,这个ID是数据表自增长主键。1.数据库中读出,按PID,SID顺序,这样读出的第一个为root2.读出的数据存入list3.创建root节点,把root放入map,从list中删除4.遍历list,pid,sid在map中找......
  • 从 C++到 Objective-C ----2
    从C++到Objective-C(7):继承简单继承Objective-C也有继承的概念,但是不能多重继承。不过,它也有别的途径实现类似多重继承的机制,这个我们后面会讲到。C++Objective-CclassFoo:publicBar,{}@interfaceFoo:Bar//单继承//如果要同时“继承”Wiz,需要使用......
  • 从 C++ 到Objective-C
    从C++到Objective-C(1):前言DevBean 日期:2011年03月18日Objective-C可以算作Apple平台上“唯一的”开发语言。很多Objective-C的教程往往直接从Objective-C开始讲起。不过,在我看来,这样做有时候是不合适的。很多程序员往往已经掌握了另外一种开发语言,如果对一门新......
  • Name Mangling and extern “C” in C++
    SinceC++supportsfunctionoverloading,additionalinformationhastobeaddedtofunctionnames(calledNamemangling)toavoidconflictsinbinarycode.2.FunctionnamesmaynotbechangedinCasitdoesn'tsupportfunctionoverloading. Toavoid......
  • C++11新特性
    一.智能指针1.std::shared_ptrshared_ptr使用了引用计数,每一个shared_ptr的拷贝都指向相同的内存,每次拷贝都会触发引用计数+1,每次生命周期结束析构的时候引用计数-1,在最后一个shared_ptr析构的时候,内存才会释放。2.std::weak_ptrweak_ptr是用来监视shared_ptr的生命周......
  • 代码随想录-哈希表-c++总结
    哈希表内容整体简单,关键是要有利用map映射的思想,以及巩固一些c++标准库的操作这次三数之和一题没有直接做出来,关键在于如何查重一点比较绕15.三数之和-力扣(LeetCode)利用排序+双指针解决三数之和的思路更加清楚此外,四数之和中,四个数相加会溢出int,应改为 ......
  • 【C++学习之路】#include头文件包含
    头文件包含:在预处理结果将头文件的内容原封不动包含在目标文件中#include建议<>包含系统头文件<>从系统指定目录寻找head.h头文件#include"head.h"建议“”包含自定义头文件“”先从当前目录寻找head.h头文件,如果找不到,再到系统指定的目录下寻找......
  • 怎么还有函数参数不支持引用的?(Excel函数集团)
    函数公式中的参数绝大部分情况下是可以用以下四种:常量引用公式运算(包括函数、四则运算等)自定义名称有少部分函数的参数只支持引用,比如Sumif的第一、第三参数,Subtotal除第一参数以外的其他所有参数等等。但是,有一个函数的参数的特殊用法,只要是引用就会甩脸子,这个函数就是XL......