C++【よくある面接問題】Stringクラスの実現、および深いコピー、浅いコピーの問題


浅いコピー:実現できません.2つのポインタが同じ空間を指しているため、空間が解放されると2回解放され、プログラムが潰れます.これも深いコピーとは違って改善すべき点です.
深いコピー:空間を再開し、元の空間をコピーし、値をコピーします.(Stringの現代表記を採用)
深いコピー:
#include
#include
using namespace std;

class String
{
public:
    String(const char* str)
        :_str(new char[strlen(str) + 1])  //  \0
    {
        strcpy(_str, str);
    }

    String(const String& s) 
        :_str(NULL)   //         ,   _str           
    {
        String tmp(s._str);     //      
        swap(_str, tmp._str);
    }

    String& operator = (const String& s)
     {
           if (this != &s) //         
          {
              String tmp(s._str);   //      
              swap(_str, tmp._str);
          }
          return *this;
    }

    String& operator = (String s)
    {
        swap(_str, s._str);
        return *this;
    }

    ~String()
    {
        if (_str)
        {
            delete[] _str;    //   new char[n]  
        }
    }

    char* CStr()
    {
        return _str;
    }

    char& operator[](size_t index)  //        
    {
        return _str[index];
    }

private:
    char* _str;
};

void Test()
{
    String s("change world");
    cout < 
  


#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
using namespace std;

class String
{
public:
    String(const char* str)
        :_str(new char[strlen(str) + 1])  // \0
    {
        strcpy(_str, str);
    }

    String(const String& str)
        :_str(str._str)
    {}

    String& operator =(const String& str)
    {
        if (this != &str)
        {
            _str = str._str;
        }
        return *this;
    }

    ~String()
    {
        if (_str)
        {
            delete[] _str;
        }
    }

private:
    char* _str;
};

void Test()
{
    String s1("hello world !");
    String s2 = s1;
}
int main()
{
    Test();
    system("pause");
    return 0;
}