含有指针变量的类需要重写拷贝构造函数,拷贝赋值函数,析构函数
Posted yy-1046741080
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了含有指针变量的类需要重写拷贝构造函数,拷贝赋值函数,析构函数相关的知识,希望对你有一定的参考价值。
编译器自带拷贝构造(ctor)和拷贝赋值函数(operator =), 但是对于成员变量含有指针的类,其不能使用默认的拷贝赋值函数。因为使用默认的,会直接将指针指向的地址进行赋值 (浅拷贝,共享内存,共指一个对象),而不是分配一块内存,具有相同的数值 (深拷贝,独立,两个对象)。
浅拷贝容易造成dangling pointer。
用一个例子来展示:
1 #ifndef __MYSTRING__ 2 #define __MYSTRING__ 3 4 class String{ 5 public: 6 String(const char* cstr=0); 7 String(const String& str); // 拷贝构造 8 String& operator= (const String& str); // 拷贝赋值 9 ~String(); 10 char* get_c_str const(){ 11 return m_data; 12 } 13 private: 14 char* m_data; // 带指针成员的类:一定要注意拷贝赋值,拷贝构造,析构 15 // String的底部通过char实现,在外部表现为string 16 }; 17 18 inline String::String ( const char* cstr=0 ){ 19 if(cstr){ 20 m_data=new char[strlen(cstr)+1]; 21 strcpy(m_data,cstr); // char * strcpy ( char * destination, const char * source ); 22 } 23 else{ // 考虑cstr=0; 24 m_data=new char[1]; 25 m_data[0]=‘