C++网易云课堂开发工程师-拷贝构造,拷贝复制,析构函数

1.带有指针的ClassClass 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 = '\0';

  }

}

 

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\0

String b("World");                                         对应的是                              b---------->World\0

使用default copy ctor 或者 default op= 会造成以下局面

a--------------->Hello\0<------------------b           World\0                              浅拷贝

~~~~~~~必须完成深拷贝,主要是通过创建数据副本~~~~~~~~~

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语句没有写,会造成自己销毁自己,而不会完成赋值操作。

posted @ 2018-08-20 15:24  sky-zz  阅读(165)  评论(0编辑  收藏  举报