最新要闻
- 世界观速讯丨8万元会成爆款吗?宝骏悦也实车曝光:像吉姆尼、能跑303公里
- 每日热文:印度男子因新娘高三成绩不好要求退婚 还要退5千彩礼:网友看笑
- 热门看点:女生被拍同学勇敢对峙让男子删除 想保护好自己的朋友:网友称赞勇敢
- 1.5mm!iPhone 15 Pro Max将打破最薄边框纪录:CAD外观渲染图曝光 更帅了
- 全球微头条丨没有科技与狠活 :依能天然苏打水2.3元发车 无糖无气0卡
- 03月18日09时福建漳州疫情数据 阳了以后为什么会腰疼?应该怎么办?
- 天天亮点!汽车降价潮蔓延!成都豪撒1亿购车补贴 汽车流通协会称武汉汽车降价不公平
- 【天天热闻】俞敏洪称下辈子宁愿当没钱的流浪汉:自己周围的企业家都在没日没夜的干活
- 比亚迪出海再下一城!乌兹比克斯坦三车齐发:宋PLUS 22万起售
- 【全球速看料】差距有多大?一图看懂蔚来、小鹏、理想汽车2022年第四季度财报:老大变了
- 每日速读!水晶球档杆绝无仅有!韩系豪华电动车捷尼赛思GV60上市:28.58万起
- 【全球聚看点】还买什么汉兰达!全新大七座SUV福特锐界L开售:22.98万历史新低
- 【世界速看料】超市6500元招聘引学生排队投简历 负责人:已收到五十多份
- 世界看点:南宁市2023年事业单位统一考试简章发布 337个岗位共招1764人
- 何小鹏:王凤英一周工作七天、让大家很卷
- 何小鹏谈竞争对手降价:油车一定会反击、小鹏将降低25%生产成本
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界快播:C++ class struct
class and struct
目录
- 前文
- 问题
- 对象与引用
- 引用的传递
- 对象 copy
- shallow copy
- depthcopy
- memcpy(data,a.data,sizeof(T) *n);
- 简单类型
- 复杂类型
- 指针类型的拷贝
- 原位构造
- 返回值优化 (RVO)
- 拷贝构造的现象
- 关键字
- default
- delete
- 函数重载
- 问题
- code
前文
c++ 中的class 和struct
struct 默认为 public
(资料图)
class 默认为private
问题
左值引用,右值引用区别?
什么时候需要定值浅拷贝和深拷贝的函数。
传值和传值的区别
对象与引用
引用的传递
返回引用就意味着是data[ind]的別名。
using namespace std;class Vector{public: Vector(int n =100) : n(n),data(new int[n]){} int &at(int ind){return data[ind];}private : int n ; int *data;};int main(){ Vector arr; for(int i=0; i< 1; i++){ arr.at(i) = i; } return 0; }
对象 copy
实际上两种copy是逻辑上的
class Vector{public: Vector(int n =100) : n(n),data(new int[n]){} int &at(int ind){ cout << "ind" << ind << endl; return data[ind]; } int &operator[](int ind) {return data[ind];} void output (int m = -1){ if(m == -1) m = n; cout <<"Arr" << this << endl; for(int i = 0; i < m; i++){ cout << data[i] << " "; } cout << endl; return ; } private : int n ; int *data;};
shallow copy
int main(){ Vector arr; for(int i=0; i< 10; i++) arr[i]=i; arr.output(10); Vector arr2(arr); arr2.output(10); arr2[3]=1000; arr.output(10); arr2.output(10); return 0;} Arr0x7ffcddc92630 arr 0 1 2 3 4 5 6 7 8 9 Arr0x7ffcddc92620 arr 20 1 2 3 4 5 6 7 8 9 Arr0x7ffcddc926300 1 2 1000 4 5 6 7 8 9 Arr0x7ffcddc926200 1 2 1000 4 5 6 7 8 9 arr {n=100 data=0x000002196c4ad400 {0} } Vector arr2 {n=100 data=0x000002196c4ad400 {0} } Vector vs 的debug 模式下 data
本代码将arr 拷贝给了arr2 ,本身属于两个不同的对象。
既然属于不同的对象,arr2的变动不应对arr1发生改变,但是事与愿违 ,因为受拷贝行为的影响,依次性的拷贝,由于是指针域,拷贝了同一个存储区的值。所以 arr2 发生更改,arr1 也会发生更改。
☕如果copy 的对象是指针类型时,这个方式就无法适用了.
depthcopy
指针类型并非是赋值关系,存arr2 应该是一个额外的存储区。
memcpy(data,a.data,sizeof(T) *n);
当前方法在一定的简单类型的场景下可以进行深拷贝,如果类型中存在了指针类型则也会出现两个指针指向同一个地址的的情况。
#include #include#include#includeusing namespace std;#define BEGINS(x) namespace x {//begin of namespace #define ENDS(x)} //end of namespace x BEGINS(xxx)class A { public : int x , y;};ostream &operator<<(ostream &out ,const A &a){ out << "(" << a.x << " , " << a.y << ")"; return out;}templateclass Vector{ public: Vector(int n =100) : n(n),data(new T[n]){} Vector (const Vector &a): n(a.n){ // 实现深拷贝 data = new T[n]; /* for(int i = 0; i < n; i++){ data[i]=a.data[i]; } */ //实现以上的效果 //1 : memcpy 可能是复制类型是复杂类型的对象 memcpy(data,a.data,sizeof(T) *n); return ; } T &at(int ind){ cout << "ind" << ind << endl; return data[ind]; } T &operator[](int ind) {return data[ind];} void output (int m = -1){ if(m == -1) m = n; cout << "Arr size " << sizeof(data) << " " << this << endl; for(int i = 0; i < m; i++){ cout << data[i] << " "; } cout << endl; return ; }private : int n ; T *data;};ENDS(xxx)
简单类型
BEGINS(test1)using namespace xxx; int main(){ Vector arr; for(int i=0; i< 10; i++) arr[i]=i; arr.output(10); Vector arr2(arr); arr2.output(10); arr2[3]=1000; arr.output(10); arr2.output(10); return 0; }ENDS(test1)Arr size 8 0x7ffc86e546d00 1 2 3 4 5 6 7 8 9 Arr size 8 0x7ffc86e546c00 1 2 3 4 5 6 7 8 9 Arr size 8 0x7ffc86e546d00 1 2 3 4 5 6 7 8 9 Arr size 8 0x7ffc86e546c00 1 2 1000 4 5 6 7 8 9
☕由结果可以看到,很显然在copy后并没有影响arr1的指针域
复杂类型
BEGINS(test2)using namespace xxx; int main(){ Vector arr1; for(int i = 0; i < 10; i++){ arr1[i].x = i; arr1[i].y = 2 * i; } arr1.output(10); Vector arr2(arr1); arr2[3] = (A){4, 100}; arr2.output(10); arr1.output(10); return 0;}ENDS(test2)Arr size 8 0x7ffc053fdeb0 //原 (0 , 0) (1 , 2) (2 , 4) (3 , 6) (4 , 8) (5 , 10) (6 , 12) (7 , 14) (8 , 16) (9 , 18) Arr size 8 0x7ffc053fdea0 (0 , 0) (1 , 2) (2 , 4) (4 , 100) (4 , 8) (5 , 10) (6 , 12) (7 , 14) (8 , 16) (9 , 18) Arr size 8 0x7ffc053fdeb0(0 , 0) (1 , 2) (2 , 4) (3 , 6) (4 , 8) (5 , 10) (6 , 12) (7 , 14) (8 , 16) (9 , 18)
☕在不涉及对象中的(指针类型)(其中类型不需要深拷贝的场景)的情况下,可以实现深拷贝。
指针类型的拷贝
memcpy 是无法做到深拷贝的,无法完美的迁移。
BEGINS(test3)using namespace xxx;int main(){ Vector> arr1; Vector> arr2(arr1); arr2[2][2]=1000; for(int i =0; i <3 ; i++){ arr1[i].output(3); cout <
原位构造
位构造 new (地址),其意思为:在某个地址上调用某个构造函数,构造一个相关的对象
如果数据类型T执行深拷贝的函数,将call T类型的拷贝构造函数
https://hedzr.com/c++/variant/in-place-construction-in-cxx/ 参考文章
Vector(const Vector &a):n(a.n){ // data = new T[n];//实现深拷贝, 带new 就调用n次构造函数 data =(T *)malloc(sizeof(T) * n); /* for(int i = 0; i < n; i++){ data[i]=a.data[i]; } */ //1 : memcpy 可能是复制类型是复杂类型的对象 //原位构造 new (地址),其意思为:在某个地址上调用某个构造函数,构造一个相关的对象 for(int i = 0; i < n; i++){ //如果数据类型T执行深拷贝的函数,将call T类型的拷贝构造函数 new (data + i) T(a.data[i]); //这里也调了i次 } // memcpy(data,a.data,sizeof(T) * n); return ; }
返回值优化 (RVO)
对象: 已经经历了构造过程的数据区 。obj (申请对象数据区)→匹配构造函数 →完成构造(某对象)
-fno-elide-constructors 关闭返回值优化
拷贝构造的现象
按照流程应该是发生了三次构造 ? 为什么输出的解构为什么是同一个地址按照正常逻辑, 中间的匿名对象应该没意义的 只是一个中转的功能所以 第一步就吧匿名的临时变量优化掉 第二 ->tmep 拷贝给A对象 ,既然是拷贝他们是一模一样,加在temp对象所有的操作都会在去往A上 temp 对象其实可以看做A对象的别名,这就是返回值优化的最终版本 最终是 吧temp 当做A对象的引用了
#include#include#include#include#include#include
关键字
隐形的行为,显性化 ,将代码的层面的规则,变成显示的规则
default
不一样点 :如果想要实现拷贝构造必须是初始化列表挨个拷贝, default 关键字会挨个执行拷贝方法
如果是默认的构造函数,他是一个东西
class A{ A() = default; // 隐性的行为显性化 A(const A &) =default; A(const A &) {} //这和上面不是一个东西};
delete
删除后,如果想使用,编译会直接报错。
class A{ |~ A() = default; // 隐性的行为显性化 |~ //A(const A &) =default; |~ A(const A &) = delete; |~ |~ // A() {} 这和上面不是一个东西 |~ }; |~
函数重载
如果一个作用内,函数名称相同,但是参数列表不同,称函数重载 (参数类型不同,参数个数不同(记得默认参数的问题))。
强调一下 和返回值没关系
问题
函数重载 好处?
- 有了函数重载,可以吧把一类通过参数区分的功能,命名成一个函数名。(精细化的处理流程)
- 通过函数参数的列表对函数进行提示
- 对函数进行扩展
code
int func(int x ){ return 2 * x;}double func(double x){ return 2.0 * x;}int ABS(int x ){ return abs(x);}double ABS(double x){ return fabs(x);}int main(){ cout << func(1) << endl; cout << func(22.0) << endl; cout << ABS(222.56) << endl; cout << ABS(-233) << endl ; return 0;}
关键词:
-
世界快播:C++ class struct
classandstruct目录前文问题对象与引用引用的传递对象copyshallowcopydepthcopymemcpy(data,a data,sizeof(T)*n
来源: -
环球视点!Windows OpenGL ES 图像 GPUImageLookupFilter
零基础OpenGLES学习路线推荐:& 160;OpenGLES学习目录>>& 160;OpenGLES基础零基础OpenGLES学习路线推荐:& 160;Op
来源: 世界快播:C++ class struct
环球视点!Windows OpenGL ES 图像 GPUImageLookupFilter
世界观速讯丨8万元会成爆款吗?宝骏悦也实车曝光:像吉姆尼、能跑303公里
每日热文:印度男子因新娘高三成绩不好要求退婚 还要退5千彩礼:网友看笑
世界观焦点:CSS学习笔记
热门看点:女生被拍同学勇敢对峙让男子删除 想保护好自己的朋友:网友称赞勇敢
1.5mm!iPhone 15 Pro Max将打破最薄边框纪录:CAD外观渲染图曝光 更帅了
全球微头条丨没有科技与狠活 :依能天然苏打水2.3元发车 无糖无气0卡
03月18日09时福建漳州疫情数据 阳了以后为什么会腰疼?应该怎么办?
当前要闻:为什么文件删除了但磁盘空间没有释放?
微博图床被废,自己动手丰衣足食。
【聚看点】Source Generator初探
4、AOP
天天亮点!汽车降价潮蔓延!成都豪撒1亿购车补贴 汽车流通协会称武汉汽车降价不公平
【天天热闻】俞敏洪称下辈子宁愿当没钱的流浪汉:自己周围的企业家都在没日没夜的干活
比亚迪出海再下一城!乌兹比克斯坦三车齐发:宋PLUS 22万起售
世界聚焦:调查显示民众预期英国央行将继续加息
【全球速看料】差距有多大?一图看懂蔚来、小鹏、理想汽车2022年第四季度财报:老大变了
每日速读!水晶球档杆绝无仅有!韩系豪华电动车捷尼赛思GV60上市:28.58万起
世界速讯:你对Linux窗口管理程序Tmux了解吗
【全球聚看点】还买什么汉兰达!全新大七座SUV福特锐界L开售:22.98万历史新低
【世界速看料】超市6500元招聘引学生排队投简历 负责人:已收到五十多份
世界看点:南宁市2023年事业单位统一考试简章发布 337个岗位共招1764人
【当前独家】读Java性能权威指南(第2版)笔记20_垃圾回收G
何小鹏:王凤英一周工作七天、让大家很卷
何小鹏谈竞争对手降价:油车一定会反击、小鹏将降低25%生产成本
springboot跨域问题解决方案
天天亮点!听闻索尼PS5 Pro主机明年发售后:老玩家们集体不干了
环球通讯!日本女大胃王菅原初代患肠癌病逝:曾10分钟吞399碗荞麦面
全球热点评!美国一核电站承认150万升核污染水泄漏:已隐瞒数月
导演郭帆都看不下去!众筹1亿的《流浪地球2》周边 为啥要偷工减料?
说句话就能做表格、PPT!微软把GPT-4塞进办公套件 我慌了
每日热门:喉结左侧有个硬疙瘩_左侧睾丸里有个小疙瘩是什么
AIGC的下一站是什么?
速读:vue2前端导出带背景色表格 xlsx xlsx-style
环球新资讯:Attention与SelfAttention
五角大楼官员表示:太阳系中可能存在外星母舰探测地球
环球消息!每日机构分析:3月17日
fiddler:The system proxy was changed.Click to reenable capturing
iPhone 15 Pro Max屏幕边框窄爆:将打破小米13纪录
99元 联想YOGA新款M5无线鼠标上架:鹅卵石设计
张裕葡小萄赤霞珠甜红葡萄酒2支到手39.9元:酒香浓郁
世界热讯:手机百度文库的下载券怎么用啊 为什么(百度文库不能用下载券)
网红店半天妖烤鱼被曝垃圾桶捞回食材上桌!合肥市监局:全市门店停业
天天微头条丨赛博2077支持DLSS3 iGame RTX 40显卡实战:性能2倍提升
河南三月飞雪 突降大雪竟与人工增雨有关
中金所就30年期国债期货合约征求意见
世界观速讯丨铭瑄发布旗舰级MGG RTX 4080、4070 Ti:丧心病狂5风扇、9热管
【焦点热闻】AMD份额涨不动了 专家称Intel的麻烦已结束:CPU竞争力更强
每日视点!山东一公司疑设卑劣人员从业跟踪岗:你去哪我就发函到哪
微头条丨铲屎官注意!研究表明养宠物或影响睡眠
热点评!你买过大船货吗?男子电动滑板车藏84个SSD入境被海关查获
全球新消息丨如何在Docker下部署nacos并注册Java服务
每日讯息!记录--vue中封装一个右键菜单组件(复制粘贴即可使用)
【新要闻】一汽奔腾销量惨淡,靠预售23.58万起的奔腾M9有望逆转吗?
天天快资讯:车主注意:新一轮国内油价降了!加满一箱油将少花4元
焦点要闻:全球最大集装箱船将在宁波舟山港开启首航:比航母还长
今日热讯:接二连三胜!长三乙火箭成功发射高分十三号02星
环球快资讯:《三体》动画播放量破5亿!豆瓣评分暴跌至3.9 差评率高达86%
票房已突破45亿!《满江红》宣布密钥再次延期
全球热门:“315”曝光:带货直播间水军泛滥,该如何应对?
天天观速讯丨债市日报:3月17日
消防车被小车挡道 业主联系未果合力掀翻!车主不干了
滚动:让越野车无路可走!极氪001成功挑战原路虎越野基地
世界热门:座椅加热1299元!smart回应硬件订阅:预埋硬件算送的 成本没进卖车价
环球快播:何炅再提《快乐大本营》:引发网友感慨
全球实时:1个案例读懂——游戏产品如何用 A/B 测试做增长
当前消息!Tailwind CSS 备忘清单_开发速查表分享
python __new__方法与单例模式
【当前热闻】前端有边界,但低代码没有
【快播报】Application Loader及Transporter App上传ipa外、可以在Windows上架iOS APP工具
当前播报:腊肉的保质期多长?
法兴银行:欧洲央行加息对欧元区国家息差的影响越来越小
支持小米、OPPO!三星查询手机OLED屏幕网站上线:你用的啥屏?
通讯!第二代骁龙7+首次支持双5G双卡双通:4.4Gbps网速、Wi-Fi翻倍
观察:性能提升达2倍!真我GT Neo5 SE官宣搭载第二代骁龙7+
索尼背水一战!PS5 Pro已在路上
环球今热点:刹车失灵?福特全球召回近130万辆汽车
世界热资讯!使用代理以及搭建代理池
河南突降大雪:农户40亩葡萄棚被压塌、郑州多个仓库倒塌损失惨重
天天快看点丨卢伟冰现身高通发布会!Redmi全球首发第二代骁龙7+
动态焦点:性能提升2倍!高通正式发布第二代骁龙7+移动平台
环球快消息!前端使用EasyWasmPlayer.js接入hls协议h265编码视频
当前速讯:[EF Core] EF Core Code-First 移除外键 —— 重写SQL生成器
当前快看:带发行版 Logo 的系统信息显示工具
天天快报!歌曲.在我心里没有谁能够代替你原唱_在我心里没有谁能代替你简谱歌谱
文心一言申请测试企业达7.6万 百度股价上涨近15%
锦心似玉林世显是什么身份?锦心似玉林世显的出场有什么作用吗?
人世间冯化成哪集出轨的?人世间冯化成最后的结局是什么?
小米3的充电线是哪种头?小米3手机跑分是多少?
小天鹅洗衣机脱水不干是什么原因?小天鹅洗衣机24小时服务热线
热议:zynq基于DMA的串口传图
天龙八部单机版怎么下载?天龙八部单机版武功搭配
环球头条:899元 雷蛇帝王蝶鼠标垫发布:钢化玻璃一体成型
天天微速讯:6岁女童看店 2人用98元买走60根虫草引热议:无耻不道德行为、交易无效
全球简讯:特斯拉不好惹!网红车评人“蔡老板”被判道歉赔10万后:维持原判 不得上诉
落地成盒!苹果可折叠手机新专利:掉落自动闭合
环球观察:又一网红店翻车 半天妖烤鱼被曝垃圾桶捞回餐食又端上桌 你吃过没
今头条!python 排序算法
天天通讯!uni-app 实现轮播图组件父容器背景色随图片主题色改变