1、在类中可以访问private成员包括两层含义:可以访问this指针的private成员;可以访问同类对象的private成员。
2、这里的String可以认为是个资源管理类,内部有个char指针,在堆上分配对象,而且对于String应该是深复制,不是复制指针,而是要复制指针指向的内容。
String类的定义(头文件):
1 #ifndef String_H_ 2 #define String_H_ 3 class String 4 { 5 public: 6 String(const char* src); 7 String(const String& rhs); 8 String& operator=(const String& rhs); 9 ~String(); 10 private: 11 char* _data; 12 }; 13 #endif
String类的实现(cpp文件):
1 #include "String.h" 2 #include <iostream> 3 String::String(const char* src) 4 { 5 if(src==NULL) 6 { 7 _data = new char[1]; 8 _data[0]='\0'; 9 } 10 else 11 { 12 _data = new char[strlen(src)+1]; 13 strcpy(_data,src); 14 } 15 } 16 17 String::String(const String& rhs) 18 { 19 _data = new char[strlen(rhs._data)+1]; 20 strcpy(_data,rhs._data); 21 } 22 23 String& String::operator=(const String& rhs) 24 { 25 if(this == &rhs) 26 { 27 return *this; 28 } 29 delete[]_data; 30 _data = new char[strlen(rhs._data)+1]; 31 strcpy(_data,rhs._data); 32 return *this; 33 } 34 35 String::~String() 36 { 37 delete []_data; 38 }
上面的String实现,使用了new char在堆上分配内存,当然也可以使用malloc,需要注意的是,这种情况下,要使用free释放内存。而且,要注意的是,new和delete是关键字,而malloc和free是方法。
1 #include "String.h" 2 #include <iostream> 3 String::String(const char* src) 4 { 5 if(src==NULL) 6 { 7 _data = (char*)malloc(1); 8 _data[0]='\0'; 9 } 10 else 11 { 12 _data = (char*)malloc(strlen(src)+1); 13 strcpy(_data,src); 14 } 15 } 16 17 String::String(const String& rhs) 18 { 19 _data = (char*)malloc(strlen(rhs._data)+1); 20 strcpy(_data,rhs._data); 21 } 22 23 String& String::operator=(const String& rhs) 24 { 25 if(this == &rhs) 26 { 27 return *this; 28 } 29 free(_data); 30 _data = (char*)malloc(strlen(rhs._data)+1); 31 strcpy(_data,rhs._data); 32 return *this; 33 } 34 35 String::~String() 36 { 37 free(_data); 38 }