1.带有指针的Class,Class with pointer member
当类内带指针,一定自己写出拷贝构造函数。
String s1();
String s2("hello");
String s3(s1); 拷贝构造
s3=s2; 拷贝赋值
往往编译器会自动完成拷贝构造与拷贝赋值,不带有指针的可以一个数据成员一个数据成员的赋值。
但是带有指针时,会出现不同的效果。
2.Class String
class String{
public:
String(const char* cstr = 0);
String(const String& str); 接受自己本身,我们称之为拷贝构造
String& operator = (const String& str); 拷贝赋值
~String(); 析构函数
char* get_c_str() const {return m_data;}
private:
char* m_data;
}
3.ctor和dtor(构造函数和析构函数)
inline
String::String(const char* cstr = 0){
if(cstr){
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
}
else{ 未定义初值
m_data = new char[1];
*m_data = ' ';
}
}
inline 做动态分配后,一定要释放掉
String::~String(){
delete[] m_data; 搭配中括号的delete
}
4.类的创建与调用
{
String s1();
String s2("hello"); 离开作用域后,析构函数自然而然会被调用
String* p = new String("hello");
delete p; 必须使用delete搭配删除
}
~~~~~~~~~~~一共要调用三次析构函数~~~~~~~~~~~~~
5.class with pointer members 必须有copy ctor和 copy op=
String a("hello"); 对应的是 a---------->Hello
String b("World"); 对应的是 b---------->World
使用default copy ctor 或者 default op= 会造成以下局面
a--------------->Hello <------------------b World 浅拷贝
~~~~~~~必须完成深拷贝,主要是通过创建数据副本~~~~~~~~~
inline
String::String(const String& str){
m_data = new char[strlen(str.m_data) + 1]; 创建数据副本
strcpy(m_data, str.m_data);
}
~~~拷贝赋值,因为当前创建空间所以一定要清空自己,而后进行赋值~~~
~~~拷贝构造不需要完成清空自己是因为它刚刚创建出来的~~~~~~~~
inline
String& String::operator= (const String& str){
if(this == &str){ 检测自我赋值/如果这两行没有写检测,甚至会造成结果出错。
return *this;
}
delete[] m_data;
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
return *this;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果if语句没有写,会造成自己销毁自己,而不会完成赋值操作。