C++的拷贝构造,拷贝复制和析构

  • String class

#ifndef __MYSTRING__
#define __MYSTRING__

class String
{
  ... ...
};

String::function(...)...
Global-function

#endif
{
  //构造函数
  String s1();
  String s2("hello");

  String s3(s1);//构造一个String类型的变量,以s1为初值-->拷贝构造
  cout << s3 << endl;
  s3 = s2;//将s2赋值给s3,拷贝赋值

  cout << s3 <

之前的Complex类没有写拷贝构造和拷贝赋值函数,编译器会加上默认的。
要不要重写拷贝构造和拷贝赋值函数,就要看默认的那一套够不够用。
如果是带有指针的类,用默认的那一套,会有很大的问题。

  • Big Three,三个特殊的函数

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;
};
  • 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;
}
{
  String s1();
  String s2("hello");

  String* p = new String("hello");
  delete p;
}
  • class with pointer members必须有copy ctor和copy op=

使用默认的拷贝构造(default copy ctor)或拷贝赋值(default op=)就会造成内存泄漏。

  • copy ctor(拷贝构造函数)

深拷贝

inline
String::String(const String& str)
{
  m_data = new char[strlen(str.m_data) + 1];//直接取另一个object的private data
  //兄弟之间互为friend-->相同class的各个objects互为friends(友元)
  strcpy(m_data, str.m_data);
}
{
  String s1("hello");
  String s2(s1);
//String s2 = s1;
}
  • copy assignment operator(拷贝赋值函数)

inline String&
String::operator=(const String& str)
{
  if(this == &str)//检测自我赋值(self assignment)
    return *this;

  delete [] m_data;
  m_data = new char[strlen(str.m_data) + 1];
  strcpy(m_data, str.m_data);
  return *this;
}
{
  String s1("hello");
  String s2(s1);
  s2 = s1;
}

你可能感兴趣的:(C/C++,c++)