吃肉的考拉 发表于 2014-3-29 10:41:38

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

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

课堂练习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;
}

隐袭战龙 发表于 2014-3-29 10:46:37

因为你在operator=的重载中使用了delete ptr,但是当ptr尚未初始化时,这个语句就会造成非法访问内存,导致出错,错误点在obj4

吃肉的考拉 发表于 2014-3-29 10:50:28

隐袭战龙 发表于 2014-3-29 10:46 static/image/common/back.gif
因为你在operator=的重载中使用了delete ptr,但是当ptr尚未初始化时,这个语句就会造成非法访问内存,导致 ...

谢谢,我是看着视频照着敲的,没找出原因来

吃肉的考拉 发表于 2014-3-29 10:55:44

隐袭战龙 发表于 2014-3-29 10:46 static/image/common/back.gif
因为你在operator=的重载中使用了delete ptr,但是当ptr尚未初始化时,这个语句就会造成非法访问内存,导致 ...

Myclass::Myclass( int *p)
{
std::cout << "进入主构造器\n";
ptr = p;
std::cout << "离开主构造器\n";
}
可是它先进入了主构造器里,不是把obj3的赋值给obj4了么,还算是没有初始化吗?

隐袭战龙 发表于 2014-3-29 10:57:12

吃肉的考拉 发表于 2014-3-29 10:55 static/image/common/back.gif
Myclass::Myclass( int *p)
{
std::cout

因为ptr=p用的就是你重载额operator=啊&&&……

吃肉的考拉 发表于 2014-3-29 11:00:47

隐袭战龙 发表于 2014-3-29 10:57 static/image/common/back.gif
因为ptr=p用的就是你重载额operator=啊&&&……

进入主构造器里没有重载啊,要不然它会显示进入重载赋值语句的,现在它是进入主构造器 离开朱构造器 进入副本构造器 进入重载赋值语句,然后完蛋了。。。

隐袭战龙 发表于 2014-3-29 11:04:11

吃肉的考拉 发表于 2014-3-29 11:00 static/image/common/back.gif
进入主构造器里没有重载啊,要不然它会显示进入重载赋值语句的,现在它是进入主构造器 离开朱构造器 进入 ...

啊……对,我调试一下看看

隐袭战龙 发表于 2014-3-29 11:08:58

我这里甚至编译不过去

隐袭战龙 发表于 2014-3-29 11:11:02

额,你的obj4=obj3是在副本构造器里面的,并没有执行ptr=p,还是delete发生了错误

吃肉的考拉 发表于 2014-3-29 11:12:58

隐袭战龙 发表于 2014-3-29 11:11 static/image/common/back.gif
额,你的obj4=obj3是在副本构造器里面的,并没有执行ptr=p,还是delete发生了错误

你的意思是它没有进入主构造器?

隐袭战龙 发表于 2014-3-29 11:17:45

吃肉的考拉 发表于 2014-3-29 11:12 static/image/common/back.gif
你的意思是它没有进入主构造器?

是的,他是进入的副本构造器,你看看你的图

吃肉的考拉 发表于 2014-3-29 11:20:53

隐袭战龙 发表于 2014-3-29 11:17 static/image/common/back.gif
是的,他是进入的副本构造器,你看看你的图

隐袭战龙 发表于 2014-3-29 11:22:51

吃肉的考拉 发表于 2014-3-29 11:20 static/image/common/back.gif


那个是obj3的,你往下看

隐袭战龙 发表于 2014-3-29 11:23:25

你或者单步执行调试一下就知道了

吃肉的考拉 发表于 2014-3-29 11:25:31

隐袭战龙 发表于 2014-3-29 11:22 static/image/common/back.gif
那个是obj3的,你往下看

哦哦哦,懂了,谢谢你~
页: [1]
查看完整版本: 快速入门C++副本构造器