首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++拷贝构造函数跟赋值操作符

2013-08-16 
c++拷贝构造函数和赋值操作符c++ primer中有一道这样的题目:Matrix类,其中,实际矩阵在构造函数中动态分配,

c++拷贝构造函数和赋值操作符
c++ primer中有一道这样的题目:
Matrix类,其中,实际矩阵在构造函数中动态分配,在析够函数中删除。这个类的定义需要用到拷贝构造函数和赋值操作符。
不明白为什么? C++ 类 拷贝构造函数 赋值操作符
[解决办法]
http://en.wikipedia.org/wiki/Deep_copy#Deep_copy
[解决办法]

引用:
Quote: 引用:

系统提供的默认拷贝构造和赋值重载只是简单的把所有成员复制一遍,没有去动态new申请内存这个过程。
所以只能自己写这2个函数实现new的操作。

能不能写个小的测试程序,实现题目的要求。(想不通什么时候用这2个函数实现new的操作)


做了1个,直接运行,然后把注释掉的2个函数取消注释,再运行,可以对比。
#include <iostream>
using namespace std;

class A
{
private:
char* m_name;
public:
explicit A(const char* name)
{
int len = strlen(name);
m_name = new char[len + 1];
strcpy(m_name, name);
}
~A() {delete[] m_name;}
/*
A(const A& rhs)
{
int len = strlen(rhs.m_name);
m_name = new char[len + 1];
strcpy(m_name, rhs.m_name);
}
A& operator=(const A& rhs)
{
if (this == &rhs)   //判断自我复制
return *this;
delete[] m_name;
int len = strlen(rhs.m_name);
m_name = new char[len + 1];
strcpy(m_name, rhs.m_name);
}
*/

friend ostream& operator<<(ostream& os, const A& rhs)
{
os << (void*)rhs.m_name << ":" << rhs.m_name;
return os;
}
};


int main()
{
A* a= new A("zhang san");
cout << *a << endl;
A b = *a;
cout << b << endl;
delete a;
cout << b << endl;
return 0;
}

[解决办法]
如果不自己定义复制构造函数和赋值操作符,那么就会使用编译器默认合成的复制构造函数和赋值操作符,编译器默认合成的复制构造函数和赋值操作符进行bitwise copy(浅赋值)即对对象的每一个bit进行复制,但是在Matrix类中,进行bitwise copy会导致悬垂指针和资源泄露!

热点排行