快速入门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;
}
因为你在operator=的重载中使用了delete ptr,但是当ptr尚未初始化时,这个语句就会造成非法访问内存,导致出错,错误点在obj4 隐袭战龙 发表于 2014-3-29 10:46 static/image/common/back.gif
因为你在operator=的重载中使用了delete ptr,但是当ptr尚未初始化时,这个语句就会造成非法访问内存,导致 ...
谢谢,我是看着视频照着敲的,没找出原因来 隐袭战龙 发表于 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:55 static/image/common/back.gif
Myclass::Myclass( int *p)
{
std::cout
因为ptr=p用的就是你重载额operator=啊&&&…… 隐袭战龙 发表于 2014-3-29 10:57 static/image/common/back.gif
因为ptr=p用的就是你重载额operator=啊&&&……
进入主构造器里没有重载啊,要不然它会显示进入重载赋值语句的,现在它是进入主构造器 离开朱构造器 进入副本构造器 进入重载赋值语句,然后完蛋了。。。 吃肉的考拉 发表于 2014-3-29 11:00 static/image/common/back.gif
进入主构造器里没有重载啊,要不然它会显示进入重载赋值语句的,现在它是进入主构造器 离开朱构造器 进入 ...
啊……对,我调试一下看看 我这里甚至编译不过去 额,你的obj4=obj3是在副本构造器里面的,并没有执行ptr=p,还是delete发生了错误 隐袭战龙 发表于 2014-3-29 11:11 static/image/common/back.gif
额,你的obj4=obj3是在副本构造器里面的,并没有执行ptr=p,还是delete发生了错误
你的意思是它没有进入主构造器? 吃肉的考拉 发表于 2014-3-29 11:12 static/image/common/back.gif
你的意思是它没有进入主构造器?
是的,他是进入的副本构造器,你看看你的图 隐袭战龙 发表于 2014-3-29 11:17 static/image/common/back.gif
是的,他是进入的副本构造器,你看看你的图
吃肉的考拉 发表于 2014-3-29 11:20 static/image/common/back.gif
那个是obj3的,你往下看 你或者单步执行调试一下就知道了 隐袭战龙 发表于 2014-3-29 11:22 static/image/common/back.gif
那个是obj3的,你往下看
哦哦哦,懂了,谢谢你~
页:
[1]