鱼C论坛

 找回密码
 立即注册
查看: 2257|回复: 14

快速入门C++副本构造器

[复制链接]
发表于 2014-3-29 10:41:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 吃肉的考拉 于 2014-3-29 11:44 编辑

AXJ@9_8SD)CB4[S@SHU08)O.jpg 课堂练习2 是因为版本的问题吗?

#include <iostream>
#include <string>

class Myclass
{
public:
Myclass( int *p );
Myclass(const Myclass &rhs);
~Myclass();
Myclass & operator = (const Myclass &rhs);
void print();
private:
int *ptr;
};
Myclass::Myclass( int *p)
{
std::cout << "进入主构造器\n";
ptr = p;
std::cout << "离开主构造器\n";
}
Myclass::Myclass( const Myclass &rhs)
{
std::cout << "进入副本构造器\n";
*this = rhs;  //该=已经被重载
std::cout << "离开副本构造器\n";
}
Myclass::~Myclass ()
{
std::cout << "进入析构造器\n";
delete ptr;
std::cout << "离开析构造器\n";
}
Myclass & Myclass::operator = (const Myclass &rhs)
{
std::cout << "进入赋值语句重载\n";
if(this != &rhs)
{
  delete ptr;
  ptr = new int;
  *ptr = *rhs.ptr; //两个指针,指向不同的地址,但里面的内容值是一样的
}
else
{
  std::cout << "赋值号两边为同个对象,不做处理!\n";
}
std::cout <<"离开赋值语句重载\n";
return *this;
}
void Myclass::print ()
{
std::cout  <<  *ptr << std::endl ;
}
int main()
{
Myclass obj1(new int (1));
Myclass obj2(new int (2));
obj2 = obj1;
obj1.print ();
obj2.print ();
std::cout << "-----------------------------\n";

Myclass obj3(new int (3));
Myclass obj4 = obj3;
obj3.print ();
obj4.print ();
std::cout << "-----------------------------\n";
Myclass obj5(new int (5));
obj5 = obj5;
obj5.print ();



return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-29 10:46:37 | 显示全部楼层
因为你在operator=的重载中使用了delete ptr,但是当ptr尚未初始化时,这个语句就会造成非法访问内存,导致出错,错误点在obj4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-29 10:50:28 | 显示全部楼层

谢谢,我是看着视频照着敲的,没找出原因来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-29 10:55:44 | 显示全部楼层
隐袭战龙 发表于 2014-3-29 10:46
因为你在operator=的重载中使用了delete ptr,但是当ptr尚未初始化时,这个语句就会造成非法访问内存,导致 ...

Myclass::Myclass( int *p)
{
std::cout << "进入主构造器\n";
ptr = p;
std::cout << "离开主构造器\n";
}
可是它先进入了主构造器里,不是把obj3的赋值给obj4了么,还算是没有初始化吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-29 10:57:12 | 显示全部楼层
吃肉的考拉 发表于 2014-3-29 10:55
Myclass::Myclass( int *p)
{
std::cout

因为ptr=p用的就是你重载额operator=啊&&&……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-29 11:00:47 | 显示全部楼层
隐袭战龙 发表于 2014-3-29 10:57
因为ptr=p用的就是你重载额operator=啊&&&……

进入主构造器里没有重载啊,要不然它会显示进入重载赋值语句的,现在它是进入主构造器 离开朱构造器 进入副本构造器 进入重载赋值语句,然后完蛋了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-29 11:04:11 | 显示全部楼层
吃肉的考拉 发表于 2014-3-29 11:00
进入主构造器里没有重载啊,要不然它会显示进入重载赋值语句的,现在它是进入主构造器 离开朱构造器 进入 ...

啊……对,我调试一下看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-29 11:08:58 | 显示全部楼层
我这里甚至编译不过去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-29 11:11:02 | 显示全部楼层
额,你的obj4=obj3是在副本构造器里面的,并没有执行ptr=p,还是delete发生了错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-29 11:12:58 | 显示全部楼层
隐袭战龙 发表于 2014-3-29 11:11
额,你的obj4=obj3是在副本构造器里面的,并没有执行ptr=p,还是delete发生了错误

你的意思是它没有进入主构造器?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-29 11:17:45 | 显示全部楼层
吃肉的考拉 发表于 2014-3-29 11:12
你的意思是它没有进入主构造器?

是的,他是进入的副本构造器,你看看你的图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-29 11:20:53 | 显示全部楼层
隐袭战龙 发表于 2014-3-29 11:17
是的,他是进入的副本构造器,你看看你的图

M22ED(Y9L466OH_$A]LOHKJ.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-29 11:22:51 | 显示全部楼层

那个是obj3的,你往下看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-29 11:23:25 | 显示全部楼层
你或者单步执行调试一下就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-29 11:25:31 | 显示全部楼层
隐袭战龙 发表于 2014-3-29 11:22
那个是obj3的,你往下看

哦哦哦,懂了,谢谢你~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 00:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表