说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

散分,来拿把

编辑:说三道四文库 发布时间:2017-12-13 08:59
HTML文档下载 WORD文档下载 PDF文档下载
#include"iostream.h"
#include"string.h"
  
 class  person
{
protected:
char *name;
public:
person(char*k);
person(const person& k);
~person();
static int num;
};
int person::num=0;
person::person(char*k)
{
num++;
  name=new char[strlen(k)+1];
  strcpy(name,k);
}
person::person(const person &k)
{
num++;
name=new char[strlen(k.name)+1];
strcpy(name,k.name);
}
person::~person()
{
num--;
delete [] name;

 
void main()
{
  cout<<person::num<<endl;
person john("john");
cout<<person::num<<endl;
person yang(john);
cout<<person::num<<endl;
person k("k");
k=john; //这里出错,难道只有重载=才能搞定吗?有没有别的办法?
 

}
关注
重载运算符
你说的这里出错是什么错呢?
虽然你没重载=操作符,但编译器有啊。这个赋值操作没错,但是会有潜在的错误隐患,即使多个指针同时指向同一内存块。记住,数据成员中有指针,构造函数中也用了new分配了一块内存,地址赋给这个指针的话,那么必须显式的给出拷贝构造函数、西够函数、重载赋值操作赋。析够函数应该包含有delete的语句。这些均为能进行正确的拷贝既深拷贝。
好像是拷贝构造函数的问题
不是k=john这句话错了,是在析构k的时候发生错误。
所以只要你写了k=john这句话,编译器就肯定要调用Operator=().
在“=“时调用默认的构造函数,name没有释放原空间,又分配空间,造成错误,解决的办法可以增加一个判定条件,如if(name!=NULL)(事先要初始化name=NULL)释放原空间,在进行重新分配空间。
to dfh716(突袭): 
"在“=“时调用默认的构造函数" ,这句有点问题。要调用也是调用(默认)拷贝构造函数,但这是指在初始化的时候。对于这个程序,调用的是默认的=操作符。
来拿分了
只管接分,别的就不管了。
我接
谢楼主
:)
晕,我重载可以,我也是怎么做的,但是有没有好的办法?
编译器可以为类自动生成copy constructor

但是只有在类创建时才会调用,一般(没有多态,成员变量没有显式copy constructor等)会导致一个bitcopy操作产生。

所以你必须重载operator=

而且你这段程序也有问题,会导致内存泄漏,因为在你operator=

之后,应当delete name;
要重载运算符。
要重载运算符。拿分
……
拿分
up
guanzhu
:D
:():
乐乐,你来找我要分吗?
哈哈
楼上的朋友解释的很清楚了。
收到,接分
收分,谢谢了.
当然要重载operator=了
coming 
拿分
只有重载!
成员变量中有指针时,一定要注意该问题!
谢谢
up
3x
ok
拿分
谢谢!
谢谢
接分了
ok
Thanks.
?????
ganggangkaishi???
关注ing!
up
我c++学得不好,应该重载operator=吧
楼主langzi8818 (涂春银) ,你怎么把程序删了?帮你贴一下:

#include"iostream.h"
#include"string.h"
  
 class  person
{
protected:
char *name;
public:
person(char*k);
person(const person& k);
~person();
static int num;
};
int person::num=0;
person::person(char*k)
{
num++;
  name=new char[strlen(k)+1];
  strcpy(name,k);
}
person::person(const person &k)
{
num++;
name=new char[strlen(k.name)+1];
strcpy(name,k.name);
}
person::~person()
{
num--;
delete [] name;

 
void main()
{
  cout<<person::num<<endl;
person john("john");
cout<<person::num<<endl;
person yang(john);
cout<<person::num<<endl;
person k("k");
k=john; //这里出错,难道只有重载=才能搞定吗?有没有别的办法?
 

}

在BC31下编译能过,运行有时会有问题(一开始出现“Null pointer assignment"报错,后来改了一通,改不回来了就重新把原来你的程序拷回去运行却没有错误了:),所以说“有时”),总之是有问题了。

k=john;这句赋值是不会错的,问题出在析构的时候。查了一下钱能C++教材,在14.6节讲浅拷贝和深拷贝的地方的例子ch14_3.cpp,应该和你这个有点像,但是你是有自定义拷贝构造函数的。他例子的目的就是要说明自定义拷贝构造函数的必要。不知你有没有试过,去掉自定义拷贝构造函数,而用默认的就能通过了,不知道默认的是怎么做的。

我跟踪了一下,发现做到k=john;时并没有去调用自定义拷贝构造函数,可能问题就是出在这里了,深拷贝变成了浅拷贝,析构时遇到NULL指针,报错。但有时却不报错,也奇怪。

到VC6里试了一下,编译连接能过,运行后在console里显示了0 1 2后弹出一个Debug错误“Debug Assertion Failed!”还有一些相关信息。VC可以发现这个错误。

说了一大堆,还是没有说清。搞清楚了发个消息给我,学习学习,谢了。
谢谢
接分了
谢谢
版主呢
谢谢~~~
楼主,该解贴了吧^_^
谢谢了!
祝你成功!!
精简Delphi数据库应用系统-定制BDE驱动程序 精简数据库应用系统-Delphi资料 开 发 基 于ORACLE7 数 据 库 的 管 理 信 息 系 统-Delphi资料 开 发AS/400 应 用 系 统: PB5 与Delphi3 的 比 较 利 用Delphi 开 发 响 应 用 户 输 入 的 数 据 库 查 询Web Server 程 利用Delphi开发响应用户输入的数据库查询Web Server程序 利用Tbatch组件完成数据批处理-Delphi资料 如 何 恢 复Sybase SQL Anywhere 的 数 据 库-Delphi资料 如何捕捉KEY VIOLATION等错误-Delphi资料 如何得到SQL返回的计算结果-Delphi资料 如何动态的读取Delphi中的PopupMenu的Caption ? 如何动态设置DBGRID。比如,动态设置DBGRID的COLUMNS。及如何在数值数据格式成千分位 如何返回BDE的状态信息?-Delphi资料 如何控制关键字段的重复输入及报错-Delphi资料 如何设置Microsoft SQL Server 全文索引服务 ?-Delphi资料 如何设置多用户环境的PARADOX数据库-Delphi资料 如何实现在一个Dbgrid中显示多数据库-Delphi资料 如何用SQL查询日期型字段?-Delphi资料 如何在数据库中存放avi文件-Delphi资料 如何在注册表中注册BDE-Delphi资料 筛选数据-Delphi资料 实现不同数据库系统之间的数据转移-Delphi资料 使 用WISQL32 同 时 访 问SQL SERVER 和SYBASE 数 据 库Delphi资 使用Session构件可以在打开有密码的库时不用输入密码-Delphi资料 使用SQL实现字段数据的模糊查询-Delphi资料 数据表的索引被损坏了怎么办-Delphi资料 数据库的密码、日期显示-Delphi资料 数据库应用程序开发中图像数据的存取技术-Delphi资料 数据库中图像数据的存取技术-Delphi资料 数据库转换-Delphi资料 数据浏览部件的应用及编程-Delphi资料 我的redhat8+adsl能上网,请问局域网用户怎么上网呀(NAT) 急用!!!!!!!!!!!!!!!!!!!! 高手进!! 现在开培训班,如果运行office2002,autocad之类的软件,需要什么样的机器配置? 如何用让RadioButtonlist的text显示图片? 散分有什么好处? 我装了LINUX后不能安装windows2000了???? 菜鸟问题 如何让Foxmail显示所有邮箱中的邮件?! 解决的这个问题,你要什么给什么,在线等 求助朋友,好人, 我的作业要交,请您帮忙,真的很急 怎么样学好c++ DBGrid滚动条拉动问题 如何合并两个图像处理的程序!! 9.9 阅读理解 (Unit 5) 求一C程序:当前目录下最新(最后)创建的文件的文件名,并将其赋给char fname[ ]. 关于数据库设计的问题(觅高手!) 有没有人用 Symantec Enterprise Firewall With VPN 7.0,给个cdkey啦 怎样才能用ado.net把数据库中一个select语句的结果,逐个显示出来。 而不用任何绑定。 有关悬浮的工具栏窗体问题,没人知道啊 第一次接触汇编CASL,请问SP,(SP),((SP))的区别?如将SP换成其他变量或寄存器是否一样? 網絡問題? 共享访问的问题 请问众高手一个语句的写法,谢谢! 大新闻:Microsoft.MSDN.Library.October.2003-TBE(3CD)出了!!!有人可以找到吗?? 请问如何设置诺顿个人防火墙的作为网关上网? 请问一下大家,大家在背mcse、ccna等考试的题库时有什么方法背最好呀,或则是用什么办法作弊最好呀? 如何通过VB向EXCEL模板写入数据? 一个运行时间错误!!! 在linux下使用highpoint的hpt372芯片做raid1,有做成功的朋友吗? WEB数据库 请问oracle的ORACLE_HOME环境变量怎么设置? 多态问题! 在游标中,如何跳出本次循环,执行下一次循环?我用的是sybase数据库 关于ShellExecute的简单问题,会的朋友都来看看啊 请问:一个简单的表单数据传送问题 如何用php获得一个表单里面的值? 100分在线紧急求救进程调度和内存分配程序,分不够再加,操作系统原理高手请进 这几天忙,提前祝中秋快乐! 高分求助win2k和SQL server 关于安全与数据备份的解决方案 在游标中,如何跳出本次循环,执行下一次循环?我用的是sybase数据库 一直没有搞清楚的问题(关于字节对齐):求助大侠---》》》》先谢了 大家好才是真的好,有个好网你一定要知道 问:物流管理信息系统与物流信息系统有什么区别! ==好的网络发文系统,应该具备哪些功能?== PHP小问题,望指教! 怎么安装grub? 怎样返回从数据库中查到的记录数目,并把它用Label显示出来啊? 提示:无法找到脚本库“/aspnet_client/system_web/1_0_357_0/webUiValication.js。请尝试手动配置此文件,或通过运行aspnet_resiis-c重 请问版主,是谁删了我的贴子,又扣我的信誉分? 高分求助win2k和SQL server 关于安全与数据备份的解决方案 请教关于CriticalSection 世上到底有没有水怪啊 为什么南方就要热呢? 为什么南方这么热 南方现在热吗 为什么三价Fe离子,比二价的稳定(结构角度) 我不相信2012的预言但我相信人类终会自我毁灭,你认为会在几十年后呢还是几年后? 古诗的音韵是什么啊谢谢大家 以高中水品回答 想知道“镇定思痛”这个词语的解释 皇上我要废了你,全部番外内容,939924256Q邮 女人的通病是什么? 人类的通病是什么 韩媒:中国人在韩免税店消费额首超过韩美情报委员会主席:白宫已承诺停止监听日本称中国军机连续3天飞越宫古海峡实美一男子喝红牛饮料后死于心脏病 家人艺术家将住“蛋壳屋”内 旨在警示气候利比亚运钞车遭抢 劫匪抢走总计数千万男子将中国瓷器当垃圾尘封20年 拍出奥巴马以“不知情”回应窃听风波 政客美国军火巨头创新型侦察工具 可安放于青海民间手工艺展在曼谷拉开\"今日中英国海军借“小甜甜”歌曲“吓退”索马明代关公金身首次来榕五爪金龙 爬上尤溪洲大桥好对象在这里 就等你来27岁男子杀害48岁女子 分尸弃路边纯生态慢生活能享受美食的温泉骑手被铐着带回派出所明朝古社 被原址保留榕写字楼迈入多核时代 三分天下格局生仓山福湾新城秋月苑门口 摊贩为占位摆云南江城县专项整治贩卖野生动物行为公交站台乱写乘客觉得不雅逆行都市植草人生李元霸重生之我是姚铭魔兽世界里的那些事长生纪武者心经魂裂抗战小兵传奇穿越修真界玄破苍穹龙吟虎啸耀神州青龙大瀑布旅游宋街旅游一线天旅游水帘洞旅游金石滩黄金海岸旅游发现王国主题公园旅游海之韵公园旅游汤旺河石林旅游龟山公园旅游巴松措旅游宗角禄康公园旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘