C++:理解拷贝在变量,指针,引用以及构造函数里的意义

变量,指针,引用

//拷贝与拷贝构造函数

//拷贝(copy):拷贝数据,拷贝内存

//=始终是在拷贝值,但是指针存储的是内存的地址,变量存储的是数据的值

//特别注意,在引用里面的拷贝是改变指向,没有复制的操作!


#include <string>
#include <iostream>//拷贝与拷贝构造函数
//拷贝(copy):拷贝数据,拷贝内存
//=始终是在拷贝值,但是指针存储的是内存的地址,变量存储的是数据的值
//特别注意,在引用里面的拷贝是改变指向,没有复制的操作!
struct Vector2
{float x,y;};
int main()
{//a,b是两个不同的变量,有两个内存地址,拷贝的是数据,因此a.x=2,b.x=5Vector2 a={2,3};Vector2 b=a;b.x=5;//如果分配在堆上,用指针,则不同  这里的拷贝是拷贝地址的数字,指向同一块内存Vector2* c=new Vector2();Vector2* d=c;d->x=5;std::cout<<a.x<<std::endl;std::cout<<b.x<<std::endl;std::cout<<(*c).x<<std::endl;std::cout<<(* d).x<<std::endl;std::cin.get();
}

//深拷贝:复制整个对象 通过 拷贝构造函数 实现(C++默认提供一个拷贝构造函数)


#include <string>
#include <iostream>
//深拷贝:复制整个对象 通过 拷贝构造函数 实现(C++默认提供一个拷贝构造函数)
class String
{
private:char* m_Buffer;unsigned int m_Size;
public:String(const char* string)//用指针访问字符串字面量的首地址{m_Size=(int)strlen(string);m_Buffer=new char[m_Size+1];//给一个空间给空终止符memcpy(m_Buffer, string, m_Size);//拷贝的简单化操作m_Buffer[m_Size]=0;//此时的长度+1后,从0开始,一共有string+1个字符串,最后一个是0,终止符
//验证//        std::cout<<strlen(m_Buffer)<<std::endl;
//        std::cout<<m_Buffer[m_Size-1]<<std::endl;//        for (int i=0; i<m_Size; i++) {
//            m_Buffer[i]=string[i];
//        }}//拷贝构造函数//String(const String& other)=delete;//不允许复制 string2=string就会报错//深拷贝String(const String& other):m_Size(other.m_Size){std::cout<<"copy"<<std::endl;m_Buffer=new char[m_Size+1];memcpy(m_Buffer, other.m_Buffer, m_Size+1);//拷贝的简单化操作}~String(){delete [] m_Buffer;//new,要用delete!因为我们没有用智能指针啦}char& operator[](unsigned int index){return m_Buffer[index];}friend std::ostream& operator<<(std::ostream& stream,const String& string);
};
//打印字符串
std::ostream& operator<<(std::ostream& stream,const String& string)
{stream<<string.m_Buffer;//因为友元的设定,属于可以访问m_Buffer,然后把字符串流放进stream里return stream;
}void Print(const String& string)//如果不是引用传递,这里的string会通过拷贝传值,多调用copy
{std::cout<<string<<std::endl;
}int main()
{String string="QingXiao";String string2=string;//程序会崩溃。因为这里是char*的拷贝,两个指针指向了同一个内存地址,在释放的时候会两次调用析构函数,第一次后,内存已经释放了,第二次时,对应内存块不属于此程序控制,因此程序崩溃string2[2]='b';//没有深拷贝函数之前,可以看到两个结果都是一样的
//    std::cout<<string<<std::endl;
//    std::cout<<string2<<std::endl;Print(string);Print(string2);std::cin.get();//最终运行要按一下回车,才会看到崩溃结果
}

建议打断点看运行过程理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677892.shtml

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

相关文章

Mysql Day04

mysql体系结构 连接层服务层引擎层&#xff08;索引&#xff09;存储层 存储引擎 存储引擎是基于表建立的&#xff0c;默认是innoDB show create table tb; 查看当前数据库支持的存储引擎 show engines; InnoDB 特点 DML&#xff08;数据增删改&#xff09;遵循ACID模…

【算法与数据结构】42、LeetCode接雨水

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;   程序如下&#xff1a; 复杂度分析&#xff1a; 时间复杂度&#xff1a; O ( ) O() O()。空间复…

Modelsim10.4安装

简介&#xff08;了解&#xff0c;可跳过&#xff09; modelsim是Mentor公司开发的优秀的HDL语言仿真软件。 它能提供友好的仿真环境&#xff0c;采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术&#xff0c;编译仿真速…

AI-TestOps —— 软件测试工程师的一把利剑

写在前面软件测试的前世今生测试工具开始盛行AI-TestOps 云平台● AI-TestOps 功能模块● AI-TestOps 自动化测试流程 写在前面 最近偶然间看到一句话&#xff1a;“软件测试是整个 IT 行业中最差的岗位”。这顿时激起了我对软件测试领域的兴趣&#xff0c;虽然之前未涉及过软…

fast.ai 机器学习笔记(二)

机器学习 1&#xff1a;第 5 课 原文&#xff1a;medium.com/hiromi_suenaga/machine-learning-1-lesson-5-df45f0c99618 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这些笔记将继续更…

ASUS华硕灵耀X双屏UX8402V工厂模式原厂Win11.22H2系统安装包,含WinRE恢复出厂时开箱状态自带预装OEM系统

适用型号&#xff1a;UX8402VV、UX8402VU 链接&#xff1a;https://pan.baidu.com/s/1D7tJshKTNFYO4YyzKX0ppQ?pwd3saf 提取码&#xff1a;3saf Zenbook Pro灵耀X笔记本电脑原装出厂Windows11系统 带有ASUS RECOVERY恢复功能、自带面部识别&#xff0c;声卡&#xff0c;网…

【RabbitMQ(二)】:Exchange 详解 | Message Convert 消息转换器

文章目录 03. 使用 Java 代码去操控 RabbitMQ3.1 快速入门3.1.1 创建父子项目3.1.2 编写代码 3.2 Work 模型3.3 RabbitMQ 中的三类交换机3.3.1 Fanout 扇出交换机3.3.2 Direct 交换机3.3.3 Topic 交换机 3.4 声明队列交换机3.4.1 方式一&#xff1a;书写 Config 类3.4.2 方式二…

webgis后端安卓系统部署攻略

目录 前言 一、将后端项目编译ARM64 二、安卓手机安装termux 1.更换为国内源 2.安装ssh远程访问 3.安装文件远程访问 三、安装postgis数据库 1.安装数据库 2.数据库配置 3.数据导入 四、后端项目部署 五、自启动设置 总结 前言 因为之前一直做的H5APP开发&#xf…

LLM之RAG实战(二十五)| 使用LlamaIndex和BM25重排序实践

本文&#xff0c;我们将研究高级RAG方法的中的重排序优化方法以及其与普通RAG相比的关键差异。 一、什么是RAG&#xff1f; 检索增强生成&#xff08;RAG&#xff09;是一种复杂的自然语言处理方法&#xff0c;它包括两个不同的步骤&#xff1a;信息检索和生成语言建模。这种方…

爬虫2—用爬虫爬取壁纸(想爬多少张爬多少张)

先看效果图&#xff1a; 我这个是爬了三页的壁纸60张。 上代码了。 import requests import re import os from bs4 import BeautifulSoupcount0 img_path "./壁纸图片/"#指定保存地址 if not os.path.exists(img_path):os.mkdir(img_path) headers{ "User-Ag…

【九章斩题录】Leetcode:判定是否互为字符重排(C/C++)

面试题 01.02. 判定是否互为字符重排 ✅ 模板&#xff1a;C class Solution { public:bool CheckPermutation(string s1, string s2) {} }; 「 法一 」排序 &#x1f4a1; 思路&#xff1a;看到题目中说 "重新排列后能否变成另一个字符串"&#xff0c;等等……重新…

如何升级 gpt4?快速升级至ChatGPT Plus指南,爆火的“ChatGPT”到底是什么?

提到 ChatGPT。想必大家都有所耳闻。自从 2022 年上线以来&#xff0c;就受到国内外狂热的追捧和青睐&#xff0c;上线2个月&#xff0c;月活突破1个亿&#xff01;&#xff01;&#xff01; 而且还在持续上涨中。因为有很多人都在使用 ChatGPT 。无论是各大头条、抖音等 App、…

UUID算法:独一无二的标识符解决方案

引言 在分布式系统和大数据环境下&#xff0c;唯一标识符的生成和管理是一项关键任务。UUID&#xff08;Universally Unique Identifier&#xff09;算法应运而生&#xff0c;成为了解决重复数据和标识符冲突的有效工具。本文将探讨UUID算法的优势和劣势&#xff0c;分析其在分…

【Spring】

目录 前言 1.Spring框架中的单例bean是线程安全的吗? 2.什么是AOP? 3.你们项目中有没有使用到AOP&#xff1f; 4.Spring中的事务是如何实现的&#xff1f; 5.Spring中事务失效的场景有哪些&#xff1f; 6.Spring的bean的生命周期。 7.Spring中的循环引用 8.构造方法…

休斯顿NASA太空机器人进入最后测试阶段,或可模拟人类执行外星任务!

美国宇航局开发研制的太空智能机器人目前正在德州休斯顿的约翰逊航天中心接受最后的运行测试&#xff0c;距离太空智能化时代又要更进一步了&#xff01; NASA表示&#xff0c;日前在德州休斯顿附近的约翰逊航天中心进行测试的机器人名为Valkyrie&#xff0c;是以北欧神话中的一…

Postgresql 的编译安装与包管理安装, 全发行版 Linux 通用

博客原文 文章目录 实验环境信息编译安装获取安装包环境依赖编译安装安装 contrib 下工具代码 创建用户创建数据目录设置开机自启动启动数据库常用运维操作 apt 安装更新源安装 postgresql开机自启修改配置修改密码 实验环境信息 Ubuntu 20.04Postgre 16.1 编译安装 获取安装…

.NET命令行(CLI)常用命令

本文用于记录了.NET软件开发全生命周期各阶段常用的一些CLI命令&#xff0c;用于开发速查。 .NET命令行&#xff08;CLI&#xff09;常用命令 项目创建&#xff08;1&#xff09;查看本机SDK&#xff08;2&#xff09;查看本机可以使用的.NET版本&#xff08;3&#xff09;生成…

159基于matlab的基于密度的噪声应用空间聚类(DBSCAN)算法对点进行聚类

基于matlab的基于密度的噪声应用空间聚类(DBSCAN)算法对点进行聚类&#xff0c;聚类结果效果好&#xff0c;DBSCAN不要求我们指定集群的数量&#xff0c;避免了异常值&#xff0c;并且在任意形状和大小的集群中工作得非常好。它没有质心&#xff0c;聚类簇是通过将相邻的点连接…

Android:内存泄漏检查内存优化

3.17Android优化 手机移动设备的内存是有限的,需要避免内存泄漏,优化内存使用。 1.java中四种引用类型 强引用、软引用、弱引用、虚引用。 强引用:使用类构造方法,创建对象,当内存超出了,也不会释放对象所占内存空间; String str = new String(‘1223’); 切断引用str=…

代码随想录算法训练营第44天 | 完全背包理论基础 518.零钱兑换II 377.组合总和 Ⅳ

完全背包理论基础 完全背包与01背包只相差在物品是无限取用的。因此和01背包相比第二层对背包容量的遍历应该是正序的&#xff0c;而且正因为这个正序&#xff0c;使得在纯完全背包问题中&#xff0c;背包容量和物品的遍历是可以倒过来的。 #include <bits/stdc.h> usi…