高质量程序设计指南c++/c语言(6)--拷贝构造函数和赋值函数
如果不主动编写拷贝构造函数和赋值函数,编译器就会以按成员拷贝的方式自动生成相应的默认函数。倘若类中含有指针成员或引用成员,那么这两个默认的函数就可能隐含错误。
假设String类有一个char *m_data的数据成员,a.m_data的内容为“hello”,b.m_data的内容也为“hello”,现在将a赋值给b,默认赋值函数的按成员拷贝意味着执行b.m_data = a.m_data。这会造成3个错误
(1)b.m_data原来持有的内存没有释放。
(2)b.m_data和a.m_data指向同一块内存,任何一方的改动会影响其他一方。
(3)在对象被析构时,m_data被delete了两次。
String a("hello");
String b("hello");
String c=a; //调用默认拷贝构造函数,风格不好,宜改写为String c(a);
c=b; //赋值函数
示例:String的拷贝构造函数和赋值函数
Stirng::String(const String &other) { m_data = new char[strlen(other.m_data)+1]; strcpy(m_data, other.m_data); } String & String::operator=(const String &other) { if(this != &other) 、// 有a=a的情况 { char *temp = new char[strlen(other.m_data)+1]; strcpy(temp, other.m_data); delete [] m_data; m_data = temp; } return *this; }