码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【C++】 局部对象,引用返回


    1、new 关键字 会在堆内申请空间,如果仅仅是普通调用构造函数,不会在堆内开辟空间。

    2、函数调用会形成栈帧,进行压栈操作,函数调用结束,会进行弹栈。

    函数内的局部对象,会随着弹栈,而被销毁(析构)。

    所以,不要返回局部变量的地址,没有意义,这块地址内的数据已经随着函数结束而回收,该指针指向栈区的未知空间。

    3、new 会调用构造函数,malloc不会

    4、引用类型使用时一定要进行初始化,不可以修改引用的指向,但是可以通过引用修改引用指向数据的值。

    1. int a = 10;
    2. int b = 20;
    3. int& a_r = a; //引用使用前要被初始化
    4. a_r = b; //这是赋值操作,不是更改引用 把a的值改变了
    5. 错误:
    6. &a_r = b; //这才是修改引用
    7. cout <<"a_r: " << a_r <<" a :" <//结果都是20

    国内教材大多数理解为,引用是一个变量的新名称,用来替代数据的旧名。但是在大多数C++编译器中,引用实际上就是 一个指针常量。

    TypeName data; 

    TypeName & var_ref =  data;  //引用初始化

    TypeName const * var_ptr  =& data, //指针常量初始化

    var_ref 等同于var_ptr

    //以下操作是非法的

    TypeName =data_new;

    &var_ref= data_new;

    var_ptr=&data_new;

    指针常量的特性就是 可以改变指针指向数据本身的值,但是不能修改指针的指向。

    1. #include
    2. #include
    3. using namespace std;
    4. class Example {
    5. public:
    6. int age;
    7. Example(int age) :age(age){
    8. cout << "Example 有参构造" << endl;
    9. }
    10. Example():age(9999) { cout << "Example 无参构造函数调用" << endl; }
    11. ~Example() {
    12. cout <<"age: "<"---析构!!" << endl; }
    13. };
    14. Example testE1() {
    15. Example e(33);
    16. //局部对象,函数结束时,出栈,对象e被析构
    17. return e;
    18. }
    19. Example& testE2() {
    20. Example e(44); //局部对象,同样会被析构
    21. return e;
    22. }
    23. Example& testE3(Example & e) {
    24. e.age = 55;
    25. return e; //其实这里返回不返回都无所谓 最好写成void返回 ,因为修改的是外部对象
    26. }
    27. Example& testE4() {
    28. //堆空间创建对象,生命周期随程序结束而释放,或者可以手动delete
    29. Example *e= new Example(66);
    30. return *e;
    31. }
    32. int main() {
    33. Example e;
    34. // e=testE1();
    35. // e = testE2();
    36. //e = testE3(e);
    37. //引用必须初始化
    38. Example& e_reference = testE4(); //不手动析构则不会析构
    39. //此外 注意 引用是不可被修改的,本质是一个指针常量 Example const *
    40. //&e_reference = e;错误,引用不能被修改
    41. // 这是赋值,不是修改,此处创建了一个匿名对象,age=888, 此句结束后,构造函数弹栈,该匿名对象会弹栈,
    42. e_reference = Example(888) ;
    43. cout << e.age << endl; //9999
    44. cout << e_reference.age << endl; //888
    45. delete &e_reference; //此时才对 e_reference 进行析构
    46. //析构 e
    47. return 0;
    48. }

  • 相关阅读:
    Whale 帷幄技术周大咖分享:AI 迎来大洗牌
    html--旋转眩晕特效
    小黑子—spring:第一章 Bean基础
    【k8s集群搭建(二):基于虚拟机的linux的k8s集群搭建_超详细_可视化界面Dashboard安装_记录全过程踩坑记录及解决方法】
    零基础产品经理如何迅速学习Axure原型制作?快速上手攻略!
    2023 年高教社杯全国大学生数学建模竞赛获奖名单(初稿)公示
    XXL-Job学习笔记
    HBase学习笔记(3)—— HBase整合Phoenix
    前端面试题JS篇(3)
    关于Jetpack Compose的初步使用、学习和总结
  • 原文地址:https://blog.csdn.net/Alex_cf/article/details/133825186
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号