【无标题】C++3:拷贝构造以及编译器优化
this指针我们在创建变量时如果名字与类的普通成员方法名字相撞那我们应该如何区分到底是把哪个值赋给谁呢这时候就引出this指针可以区别classTest{public:intnum;// 成员变量voidsetNum(intnum){// this-num类自身的成员变量// num传入的形参局部变量this-numnum;}由此我们引出this指针定义你创建一个类的实例对象电脑会在内存里给它单独划分一块地盘对象调用自己的成员函数时编译器会自动把这个对象的内存地址打包成this偷偷传给成员函数在成员函数内部this就代表 “正在干活的这个对象自己”。总之谁调用这个成员函数this就指向谁。△ this指针专门指向调用该方法的对象拷贝构造咱们在重新构造一个和之前某一个一摸一样的对象时就叫拷贝构造。但是拷贝构造分为浅拷贝与深拷贝。默认拷贝构造视为浅拷贝浅拷贝就例如照着蛋糕 A 的样子复刻一块配料、造型完全一致的新蛋糕 B全程不用重新走一遍基础配料初始化。classPerson{public:intage;// 手动实现默认风格的拷贝构造Person(constPersonp){agep.age;}};intmain(){Personp1(18);// 普通构造造出第一个对象Personp2(p1);// 调用拷贝构造照着p1复制出全新p2return0;} 为什么需要深拷贝呢 浅拷贝只是单纯把指针变量里存的地址原样复制一份。 两个对象的指针指向同一块堆内存 对象 A 释放内存delete对象 B 的指针变成野指针等到 B 析构再次执行delete程序直接崩溃重复释放同一块内存。 深拷贝如下 cpppublic:intage;char*name;// 堆区动态开辟的字符串必须深拷贝Person(constPersonp){agep.age;//自己新开一块堆内存而不是直接复制指针地址namenewchar[strlen(p.name)1];strcpy(name,p.name);}// 析构函数释放堆内存~Person(){delete[]name;}intmain(){Personp1(20,小明) Person p2 p1;return0;}那什么时候要深拷贝呢1… 类内包含手动 new/malloc 在堆上开辟的内存2. 独占资源赋值per1per2看似是赋值其实调用了per1的operator函数//per1per2Personoperator(constPersonp){if(thisp){return*this;//防止自己给自己赋值}delete[]this-name;// 拷贝普通成员this-agep.age;//this-namenewchar[strlen(p.name)1];strcpy(this-name,p.name);// 返回自身引用支持连续赋值 p1p2p3return*this;什么是explicit在未加关键字前会出现隐式转换加完之后写Person p 18; test(20);会报错但是可以// 方式1Personp(18);// 方式2Person pPerson(18);// 方式3test(Person(20));C编译器对临时对象的优化1.使用临时对象拷贝构造同类型新对象临时对象被优化使用构造临时对象的方式直接构造新对象即可例如person per4(Person(z张飞23‘M’))就不会构造临时对象直接构造出来相当于per4“张飞”23‘M’2.但是如果你进行赋值的话那么临时对象不会被优化因为一旦优化就无法对新对象进行赋值PersonGetperson(person per){constchar*nameper.getName();intageper.getAge();charsexper.getSex();PersontmpPer(name,age,sex);returntmpPer;}intmain(){Personper1(x““22”“m”);Person per2;per2Getperson(per1);per2.show;}以上这段代码我们可以理解为从main函数开始分析先进行per1的三个参数构造再进行per2的默认构造然后实参到形参是一个拷贝构造编译器直接优化不再拷贝构造tmpPer生成一个main函数栈上的临时对象然后对per2进行赋值操作PersonGetperson(person per){constchar*nameper.getName();intageper.getAge();charsexper.getSex();PersontmpPer(name,age,sex);returntmpPer;}intmain(){Personper1(x““22”“m”);Person per2Getperson(per1);per2.show;}我们从Person per2Getperson(per1);开始分析本来的顺序Getperson 值接收参数把 per1 拷贝一份得到栈上形参 per在 Getperson 函数自身栈空间里正常构造局部对象 tmpPer调用普通构造函数把 tmpPer 拷贝构造一份放到 main 栈的返回值临时对象再用这个临时对象拷贝构造 main 里的 per2函数退出销毁 tmpPer、形参 per最后析构临时、per1、per2。但是编译器优化时直接就把tmpPer当成per2进行常规构造心得总结本节课主要内容为this指针拷贝构造赋值函数C编译器优化我认为this指针指向被调用方法的对象是一个很重要的点在此之前我一直以为this指针是每个参数都拥有的其次拷贝构造中我认为为什么会出现深拷贝这种问题是很重要的只有知道为什么需要深拷贝我们才能了解深拷贝的底层原理C编译器优化中比较难的我认为是何时临时对象会进行赋值而何时不能够省略临时对象这需要再琢磨琢磨以上包含我这节课所认为重点核心难点以及还未攻克的难题

相关新闻

VSCode配置ESP32 MicroPython开发环境:从零搭建到点灯实战

VSCode配置ESP32 MicroPython开发环境:从零搭建到点灯实战

在嵌入式开发领域,ESP32 凭借其强大的双核处理能力、丰富的无线连接选项(Wi-Fi 和蓝牙)以及极佳的性价比,已成为物联网和智能硬件项目的首选微控制器之一。而 MicroPython 作为一种在微控制器上运行的 Python 3 实现,极…

2026/8/7 7:56:34 阅读更多 →
Sentinel热点参数限流:从原理到实战的完整指南

Sentinel热点参数限流:从原理到实战的完整指南

1. 从一次线上“秒杀”故障说起:为什么需要热点规则?去年双十一大促前,我们团队负责的一个商品秒杀系统在压测时遇到了一个诡异的问题。系统整体QPS(每秒查询率)和CPU使用率都在健康范围内,但RT&#xff08…

2026/8/7 7:56:34 阅读更多 →
Python.二.(三).迭代器和生成器

Python.二.(三).迭代器和生成器

Python 中迭代器的概念?核心结论:可迭代对象(Iterable)实现 __iter__,迭代器(Iterator)实现 __iter__ __next__。迭代器是带状态的惰性求值对象 。我们来看一个🌰:from …

2026/8/7 7:56:34 阅读更多 →

最新新闻

Guava RateLimiter单机限流:原理、实战与Spring Boot集成

Guava RateLimiter单机限流:原理、实战与Spring Boot集成

1. 项目概述:为什么我们需要单机流量控制? 在分布式系统、微服务架构乃至一个简单的单体应用里,流量控制都是一个绕不开的话题。想象一下,你开了一家网红奶茶店,突然有一天被探店博主带火了,门口瞬间排起了…

2026/8/7 8:46:57 阅读更多 →
AWS IAM 权限怎么设置:子账号、角色与最小权限实践指南

AWS IAM 权限怎么设置:子账号、角色与最小权限实践指南

为什么先把 IAM 权限设计清楚 在 AWS 上开通 EC2、S3、RDS、CloudFront 等服务之前,很多团队会先关注实例规格、区域、网络和预算,但真正影响长期安全与协作效率的,往往是 IAM 权限设计。IAM 是 AWS Identity and Access Management 的缩写&a…

2026/8/7 8:46:57 阅读更多 →
MFC对话框最小化至系统托盘:Shell_NotifyIcon API详解与实战

MFC对话框最小化至系统托盘:Shell_NotifyIcon API详解与实战

1. 项目概述与核心价值 在桌面应用开发中,尤其是后台工具、即时通讯或监控类软件,我们常常希望主窗口在用户点击最小化按钮时,不是缩放到任务栏,而是“消失”并变成一个图标驻留在屏幕右下角的系统托盘区。这个功能对于提升用户体…

2026/8/7 8:46:57 阅读更多 →
STM32+FreeRTOS保姆级实战教程:从零到项目开发的完整路径

STM32+FreeRTOS保姆级实战教程:从零到项目开发的完整路径

如果你正在寻找一套从零开始、能带你真正做出项目的 STM32 单片机教程,那么这篇文章就是为你准备的。我们这次要看的不是零散的知识点,而是一套号称“保姆级”的完整学习路径,它整合了 STM32 硬件、FreeRTOS 实时操作系统,并直接导…

2026/8/7 8:46:57 阅读更多 →
深圳知名网站建设价格解析与实战避坑指南

深圳知名网站建设价格解析与实战避坑指南

说到深圳,很多人的第一反应就是“搞钱”,是速度,是创新,是那种走在时代最前沿的紧迫感。在这座被称为“中国硅谷”的城市里,互联网行业如雨后春笋般爆发,大大小小的企业都在忙着建官网、做小程序、搞APP。对于老板或者市场部门负责人来说,当需要找一家靠谱的团队来建设官…

2026/8/7 8:46:57 阅读更多 →
Java 数组操作

Java 数组操作

1. 数组遍历 操作数组时,最常见的操作就是遍历。通过 for 循环即可遍历数组——因为数组的每个元素都可以通过索引来访问,因此使用标准的 for 循环就能完成遍历: public class Main {public static void main(String[] args) {int[] ns {1…

2026/8/7 8:45:56 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →