当前位置: 首页 > news >正文

【C++】 局部对象,引用返回

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

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

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

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

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

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

int a = 10;
int b = 20;
int& a_r = a;  //引用使用前要被初始化a_r = b;  //这是赋值操作,不是更改引用 把a的值改变了错误:
&a_r = b; //这才是修改引用cout <<"a_r: " << a_r <<"  a :" <<a << endl; //结果都是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;

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

#include<iostream>
#include <string>
using namespace std;class Example {public:int age;Example(int age) :age(age){cout << "Example 有参构造" << endl; }Example():age(9999) { cout << "Example 无参构造函数调用" << endl; }~Example() { cout <<"age: "<<age << "---析构!!" << endl; }
};Example testE1() {Example e(33);//局部对象,函数结束时,出栈,对象e被析构return e;
}Example& testE2() {Example e(44); //局部对象,同样会被析构return e;
}Example& testE3(Example & e) {e.age = 55;return e; //其实这里返回不返回都无所谓  最好写成void返回 ,因为修改的是外部对象
}Example& testE4() {//堆空间创建对象,生命周期随程序结束而释放,或者可以手动deleteExample *e= new Example(66); return *e;
}int main() {Example e;
//	e=testE1();
//	e = testE2();
//e = testE3(e); //引用必须初始化
Example& e_reference = testE4(); //不手动析构则不会析构
//此外 注意 引用是不可被修改的,本质是一个指针常量   Example const *//&e_reference = e;错误,引用不能被修改// 这是赋值,不是修改,此处创建了一个匿名对象,age=888, 此句结束后,构造函数弹栈,该匿名对象会弹栈,
e_reference = Example(888) ;cout << e.age << endl; //9999cout << e_reference.age << endl; //888delete &e_reference; //此时才对 e_reference 进行析构 //析构 ereturn 0;
}

http://www.lryc.cn/news/192257.html

相关文章:

  • 线性代数中涉及到的matlab命令-第二章:矩阵及其运算
  • 计算机毕业设计选什么题目好?springboot 美食推荐系统
  • 爆肝整理,Jmeter接口性能测试-跨线程调用变量实操(超详细)
  • Maven导入程序包jakarta.servlet,但显示不存在
  • es6(二)——常用es6说明
  • 经典垃圾回收器
  • 台达DOP-B07S410触摸屏出现HMI no response无法上传的解决办法
  • [资源推荐] 复旦大学张奇老师科研分享
  • C++数位动态规划算法:统计整数数目
  • ip 网段设置 --chatGPT
  • 使用JMeter进行接口测试教程
  • 文本生成解码策略
  • 华为数通方向HCIP-DataCom H12-831题库(单选题:221-240)
  • AttributeError: module ‘hanlp.utils.rules‘ has no attribute ‘tokenize_english‘
  • 苍穹外卖(四) AOP切面公共字段自动填充及文件上传
  • vue-cli + vue3 项目 ios 苹果手机白屏问题
  • Spring Boot中的JdbcTemplate是什么,如何使用
  • Python测网络连通性、能否访问某个网络或者端口号<网络检测、ping主机、测试端口>
  • 【沧元图】玉阳宫主是正是邪,和面具人有勾结吗?现在已有答案了
  • C++笔记之popen()和std_system()和std_async()执行系统命令比较
  • pycharm2020无法打开,点击无反应
  • 深度学习之微调
  • 【# 完美解决 node.js 模块化后报错 ReferenceError: require is not defined】
  • Jackson忽略json数组中null元素
  • 基于SpringBoot的网上订餐系统
  • 【04】基础知识:React组件实例三大核心属性 - state
  • SpringBoot 过滤器filter当中的自定义异常捕获问题
  • 实验3:左右循环LED灯
  • 行业追踪,2023-10-13
  • 【实用小工具】一键分离音频中的纯人声~