深拷贝,浅拷贝,赋值操作符的技术要点总结

本文探讨了在C++中如何处理复制指针变量的问题,强调了深拷贝和浅拷贝的概念。作者通过错误的示例解释了为什么需要重载拷贝构造函数和赋值操作符,特别是对于含有指针或动态内存分配的类成员。文章指出,正确的做法是确保拷贝构造函数和赋值运算符实现深拷贝,以避免对象间的相互影响,并提醒开发者注意返回类型为引用的重要性,以提高效率并防止临时对象的创建。

            写这篇文章的目的是因为这两天,遇到一个复制操作指针的问题(在一个列表里,存放的是指针变量,想通过右击鼠标实现复制操作),生成的新变量和源变量都是指向同一个地址,改变其中一个都会影响另一个,这样操作明显是不符合要求的。

             网上找了资料,问了网友,后来回顾一下自己的寻问过程,发现自己很傻逼,不堪回首啊,后面还是要把C++Parimer找出来看啊。左思右想,还是把这个过程写下来,是一种记录,更是一种反思。

             问题起因:

               要实现复制指针变量,复制出来的变量和源变量是独立的,互补干扰。其实就是只要源指针的成员值复制,不要源指针的地址复制。百度发现这是要用拷贝构造函数或赋值操作符。好,先把这两个函数写了:

最开始把参数和返回值写成了指针类型(想想,这不是浅拷贝吗,还是两个一样的变量),把构造函数的:A(a)写在函数体里边A::A(a)(我的A是抽象类啊,抽象类不能实例化啊。如果在函数体里直接调用,其实就是先创建一个对象,然后再调用。正确的应该是图示的,是告诉编译器,先初始化父类部分的变量,然后再初始化本类变量)。这是多煞笔的操

金山软件公司c++面试题 一、请你就C/C++或者JAVA代码行数、注释行数统计工具的实现,描述一下: 1、 需要考虑哪些过滤条件?你如何处理? 答:过滤条件:(取得每行并去掉两头的空格后) ⑴空行,行的长度为0;⑵如果是以//开头,为注释行;⑶//在行中,并判断不是在字符串中,即“”中,为代码+注释混合行,//在“”中为代码行;⑷如果/*在行中,判断是否是在“”内,否则为注释行,*/不在“”中是结束 ;⑸/* */只在一行,判断行中是否有代码,无代码为注释行,有代码是混合行;⑹/* */多行,并且/*前无代码,/*后无代码,去掉其中空行都是注释行;⑺/* */多行,/*在代码后,或*/后有代码,有混合行;⑻一行中有2个/*并且就1个*/,此行为混合行,其后是注释行。 2、 怎样提升这个工具的易用性? 答:把这个工具设置成图形界面,用户只需输入文件名或者在文件对话框中选择文件即可点击运行输出结果。 本题只需要提供思路文档,不需要程序代码。 二、给定一个自然数n,试完成如下程序,它输出不大于n的所有素数(质数)。 1、 请提供程序代码,以及思路文档。 答:思路:求出一个数j的平方根sqrt(j),将j除以2~sqrt(j)之间的数,只要除尽一次,就不是素数,之后数j加2。 #include<stdio.h> #include<math.h> void main() { int N=1000; int i,j,k,m=0; for(j=1;j<N;j=j+2) /*1-N间的素数*/ { k=(int)sqrt(j); /*求平方根*/ for(i=2;i<=k;i++) { if(j%i==0) /*只要除尽一次,就不是素数*/ break; } if(i>k) /*/除到k一直没除尽,是素数*/ printf("%d ",j); } } 3、 请分析一下可以从哪些角度可优化该程序的间性能? 答:偶数(除了2)不能为素数;判断一个数j是否为素数,只要将其除以2 ~ sqrt(j)之间的素数,更进一步,没有必要对所有奇数进行试除,只需对所有sqrt(j)以内的所有质数试除就可以了。 三、高精度乘法 用户输入两个不大于 256 位的正整数,由程序进行乘法运算,并显示运算过程与结果。例: 输入:12, 32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值