【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.rhkb.cn/news/158489.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jetson Orin NX 开发指南(5): 安装 OpenCV 4.6.0 并配置 CUDA 以支持 GPU 加速

一、前言 Jetson 系列的开发板 CPU 性能不是很强&#xff0c;往往需要采用 GPU 加速的方式处理图像数据&#xff0c;因此本文主要介绍如何安装带有 GPU 加速的 OpenCV&#xff0c;其中 GPU 加速通过 CUDA 来实现。 参考博客 Ubuntu 20.04 配置 VINS-Fusion-gpu OpenCV 4.6.…

SpringBoot Redis 基础使用

目录 Redis能做什么&#xff1a; redis特点 redis优点 opsForValue opsForList opsForSet opsForZSet StringRedisTemplate与RedisTemplate区别点 redis是一个key-value。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、li…

MS9708数模转换器可pin对pin兼容AD9708

MS9708/MS9710/MS9714 是一个 8-Bit/10-Bit/14-Bit 高速、低功耗 D/A 转换器。可pin对pin兼容AD9708。当采样速率达到 125MSPS 时&#xff0c;MS9708/MS9710/MS9714 也能提供优越的 AC 和 DC 性能。 MS9708/MS9710/MS9714 正常工作电压范围为2.7V ~ 5.5V&#xff0c;功耗低能很…

尿检设备“智能之眼”:维视智造推出MV-MC 系列医疗专用相机

​ 尿液分析是临床检验的基础常规项目&#xff0c;随着医疗设备的不断发展&#xff0c;尿液分析相关仪器的国产化和自动化程度也进一步提升。2022 年国内尿液分析市场的规模约为 28 亿元&#xff0c;激烈的竞争推动了尿检仪器自动化、智能化升级&#xff0c;在仪器中加入机器视…

软件工程与计算总结(十一)人机交互设计

目录 ​编辑 一.引例 二.目标 三.人类因素 1.精神模型 2.差异性 四.计算机因素 1.可视化设计 2.常见界面类型 五.人机交互设计的交互性 1.导航 2.反馈 3.设计原则 六.设计过程 1.基本过程 2.界面原型化 一.引例 无论软件功能多么出色&#xff0c;亦或内部的构造…

SpringBoot 过滤器filter当中的自定义异常捕获问题

需求描述&#xff1a;需要根据用户的请求路径拦截做权限控制&#xff1a; 但是这样做全局异常无法捕获 解决方案&#xff1a; 在filter当中引入HandlerExceptionResolver类&#xff0c;通过该类的resolveException方法抛出自定义异常&#xff1a; public class OpenInvokeFil…

计算机指令、机器码

目录 背景 在软硬件接口中&#xff0c;CPU 帮我们做了什么事&#xff1f; 从编译到汇编&#xff0c;代码怎么变成机器码&#xff1f; 解析指令和机器码 总结延伸 背景 上大学的时候&#xff0c;我们系里教 C 语言程序设计的老师说&#xff0c;他们当年学写程序的时候&…

实施运维03(在虚拟机上安装winServer2008系统)

新建虚拟机&#xff08;一直下一步&#xff09; 新建成功后选择镜像&#xff08;右键设置&#xff0c;选择CD/DVD,选择使用IOS镜像文件&#xff0c;浏览选择2008镜像打开&#xff09; 安装2008版本系统&#xff08;一直下一步&#xff09; 修改密码---设置密码 与电脑远程连…

接口测试文档

接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1a;主要介绍为什…

windows系统安装openssl并且转换证书格式

概述 碎碎念&#xff0c;如果你有MAC电脑&#xff0c;就别折腾了&#xff0c;直接用MAC电脑吧,不用安装直接用openssl 本文主要讲到了openssl的基本使用方法&#xff0c;开发环境为windows&#xff0c;开发工具为VS2019.本文主要是说明openssl如何使用&#xff0c;不介绍任何理…

java: 无效的目标发行版: 11

第一步&#xff1a; 第二步&#xff1a; 第三步

UE4和C++ 开发--HUD类

HUD 平视显示器(Head Up Display),简称HUD。在蓝图中是指在屏幕上面绘制的二维物体。 1. 创建HUD 打开蓝图编辑器&#xff0c;创建一个蓝图类&#xff0c;搜索HUD&#xff0c;选择并命名BP_HUD。 2. 开始绘制 打开事件列表&#xff0c;右键搜索 EventReceive Draw HUD。有两…

@Mapper与@MapperScan注解

Mapper Mapper Mapper.xml文件 作用在dao&#xff08;mapper&#xff09;层上的一个注解&#xff0c;将接口生成一个动态代理类&#xff0c;有了这个注解就不用 再写Mapper.xml文件 如果缺少这个注解&#xff0c;运行项目就会报相应的错误 Field userMapper in com.example…

Kafka SASL认证授权(四)认证源码解析

Kafka SASL认证授权(四)认证源码解析。 官网地址:https://kafka.apache.org/ 一、认证流程 在了解kafka网络模型的基础上,了解它的认证流程: ApiVersionsRequest->SaslHandshakeRequest->a series of SASL client and server tokens corresponding to the mechani…

WebRTC 系列(四、多人通话,H5、Android、iOS)

WebRTC 系列&#xff08;三、点对点通话&#xff0c;H5、Android、iOS&#xff09; 上一篇博客中&#xff0c;我们已经实现了点对点通话&#xff0c;即一对一通话&#xff0c;这一次就接着实现多人通话。多人通话的实现方式呢也有好几种方案&#xff0c;这里我简单介绍两种方案…

JVM:虚拟机类加载机制

JVM:虚拟机类加载机制 什么是JVM的类加载 众所周知&#xff0c;Java是面向对象编程的一门语言&#xff0c;每一个对象都是一个类的实例。所谓类加载&#xff0c;就是JVM虚拟机把描述类的数据从class文件加载到内存&#xff0c;并对数据进行校验&#xff0c;转换解析和初始化&a…

【计算机组成体系结构】移码 | 定点小数的表示和运算

一、移码 上篇我们提到了原码&#xff0c;反码和补码的表示形式和如何转换。这篇我们会提到一个新的概念—移码。移码也很简单&#xff0c;其实就是在补码的基础上把符号取反即可。 值得注意的是&#xff0c;移码只能表示整数。而原码&#xff0c;反码和补码既可以表示整数又…

ASEMI整流桥KBL410需要散热片吗?

编辑-Z 在决定电子设备或半导体组件的配置时&#xff0c;了解每个部件的性能和需求至关重要。那么&#xff0c;对于KBL410这款整流桥&#xff0c;它是否需要散热片呢&#xff1f;在本文中&#xff0c;我们将详细解析KBL410的工作原理&#xff0c;以及是否需要散热片。 首先&am…

Linux桌面环境(桌面系统)

早期的 Linux 系统都是不带界面的&#xff0c;只能通过命令来管理&#xff0c;比如运行程序、编辑文档、删除文件等。所以&#xff0c;要想熟练使用 Linux&#xff0c;就必须记忆很多命令。 后来随着 Windows 的普及&#xff0c;计算机界面变得越来越漂亮&#xff0c;点点鼠标…

如何成功安装Node.js并在VS Code终端使用npm

✨✨✨ 感谢优秀的你打开了小白的文章 “希望在看文章的你今天又进步了一点点&#xff0c;生活更加美好&#xff01;”&#x1f308;&#x1f308;&#x1f308; 目录 1.什么是Node.js? 2.解决方法 3.淘宝镜像安装 1.什么是Node.js? Node.js 是一种开源与跨平台的 JavaSc…