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://xiahunao.cn/news/2779327.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

新年加载中特效 —— 后期需要添加备注和消化

代码来源&#xff1a;链接: https://www.bilibili.com/video/BV1qA4m1573V/?spm_id_from333.880.my_history.page.click&vd_sourceb91967c499b23106586d7aa35af46413 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8&…

数据库管理-第14期 Oracle Vector DB AI-01(20240210)

数据库管理149期 2024-02-10 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xff09;1 机器学习2 向量3 向量嵌入4 向量检索5 向量数据库5 专用向量数据库的问题总结 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xf…

ChatGPT高效提问—prompt常见用法(续篇十一)

ChatGPT高效提问—prompt常见用法(续篇十一) 1.1 增加角色 ​ 在prompt里可以适当增加角色,来满足一些特殊场景的需求。先来看一个不带角色的简单示例。 输入prompt: ​ ChatGPT输出: ​ 如上所示,问题比较难,ChatGPT的答案也确实晦涩难懂。试想一下,如果将这个解释将…

猫头虎分享已解决Bug || 日志文件过大(Log File Oversize):LogFileOverflow, ExcessiveLoggingError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Java:Arrays类、Lambda表达式、JDK新特性(方法引用) --黑马笔记

一、Arrays类 1.1 Arrays基本使用 Arrays是操作数组的工具类&#xff0c;它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。 下面我们用代码来演示一下&#xff1a;遍历、拷贝、排序等操作。需要用到的方法如下&#xff1a; public class ArraysTest1 {public stat…

【机器学习】数据清洗之识别异常点

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步…

IDEA中Git的使用小技巧-Toolbar(工具栏)的设置

目录 1 前言 2 步骤 2.1 打开设置 2.2 找到Menus and Toolbars 2.3 Menus and Toolbars界面的介绍 2.4 选择工具 2.5 查看 1 前言 工具栏的合理运用&#xff0c;能够极大程度上为我们省时省力 &#xff0c;接下来我将以Git工具的添加&#xff0c;介绍如何定制我们IDEA…

C++学习笔记 | 基于Qt框架开发实时成绩显示排序系统1

目标&#xff1a;旨在开发一个用户友好的软件工具&#xff0c;用于协助用户基于输入对象的成绩数据进行排序。该工具的特色在于&#xff0c;新输入的数据将以红色高亮显示&#xff0c;从而直观地展现出排序过程中数据变化的每一个步骤。 结果展示&#xff1a; 本程序是一个基于…

游戏服务器哪家强?国内几款主流云服务器测评

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;华为云26元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;游戏专业服务器公网带宽10M、12M、15M…

决策树之scikit-learn

实例 from sklearn.datasets import load_iris from sklearn import tree import matplotlib.pyplot as plt# Load iris dataset iris load_iris() X, y iris.data, iris.target# Fit the classifier clf tree.DecisionTreeClassifier() clf clf.fit(X, y)# Plot the deci…

python 基础知识点(蓝桥杯python科目个人复习计划37)

今日复习内容&#xff1a;DFS--回溯 1.介绍 回溯&#xff1a;就是DFS是一种&#xff0c;在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。 回溯更强调&#xff1a;此路不通&#xff0c;另寻他路&…

linux系统下vscode portable版本的c++/Cmake环境搭建001

linux系统下vscode portable版本的Cmake环境搭建 vscode portable 安装安装基本工具安装 build-essential安装 CMake final script code安装插件CMake Tools & cmakeC/C Extension Pack Testsettings,jsonCMakeLists.txt调试和运行工具 CG 目的&#xff1a;希望在获得一个新…

自定义Function MyRandom函数获得随机数

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息表格数据显示及搜索实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

C++构造和折构函数详解,超详细!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家龙年好呀&#xff0c;今天我们来学习一下C构造函数和折构函数。 文章目录 1.构造函数 1.1构造函数的概念 1.2构造函数的思想 1.3构造函数的特点 1.4构造函数的作用 1.5构造函数的操作 1.6构造函数…

k8s -ingress

概念 Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由&#xff0c;ingress能代理集群为内部的网络&#xff0c;将集群外部的HTTP/HTTPS网络请求转发至不同的service&#xff0c;其本质就是创建一个NodePort类型的svc,和一个nginx 组成 k8s中的ingress 其实是指…

c语言:全局变量与局部变量重名

结论&#xff1a; 作用域小的覆盖作用域大的&#xff0c;顺带一提&#xff0c;在C中&#xff0c;调用全局的变量前面要加:: #include <stdio.h> using namespace std;int a, b; void fun() {a 100;b 200; }int main() {int a 5, b 7;fun();printf("%d %d\n&quo…

Linux操作系统基础(十):Linux系统信息

文章目录 Linux系统信息 一、时间和日期 1、date时间 2、cal日历 二、磁盘、内存信息 Linux系统信息 本篇文章内容主要是为了方便通过远程终端维护服务器时, 查看服务器上当前 系统日期和时间 / 磁盘空间占用情况 /程序执行情况。 学习终端命令都是查询命令, 通过这些命…

假期day7

设计qq界面 代码 ui->lab1->setPixmap(QPixmap(":/pictrue/denglu.webp"));ui->lab1->setScaledContents(true);ui->lab2->setPixmap(QPixmap(":/pictrue/passwd.jpg"));ui->lab2->setScaledContents(true);ui->lab3->setP…

Python API的使用简述

文章目录 Web APIGit 和 GitHub使用 API 调用请求数据安装 requests处理响应 API处理响应字典监视API的速率限制使用 Pygal 可视化仓库改进Pygal图表添加自定义工具提示 本篇文章&#xff1a;我们叙述如何编写一个独立的程序&#xff0c;并对其获取的数据进行可视化。这个程序将…