c++深いコピーstringクラスの簡単な実現


#include<iostream>//   
#pragma once

using namespace std;

class String
{
public:
	String(char* str="\0");
	~String();
	String(const String& str );
	void Cout();
	char& operator[](size_t index);
	String operator +(const String& str);
	String operator =(const String& str);
	String& operator +=(const String& str);


private:
	char* _string;

};


//    
#include<iostream>
#include"string.h"

using namespace std;

String::String(char* str)
:_string(new char[strlen(str) + 1])
{
	strcpy(_string, str);
}

String::~String()
{
	if (_string)
	{
		delete[] _string;
		_string = NULL;
	}
}
String::String(const String& str )
{
	_string=new char[strlen(str._string) + 1];
	strcpy(_string, str._string);
}

void String::Cout()
{
	cout << _string << endl;
}

char& String:: operator[](size_t index)
{
	if (index < strlen(_string))
		return _string[index];
	else
		return _string[strlen(_string) - 1];
}

String String::operator +(const String& str)
{
	String tmp;
	tmp._string = new char[strlen(_string) + 1 + strlen(str._string)];
	strcpy(tmp._string, _string);
	strcat(tmp._string, str._string);
	return tmp;
}

String String::operator =(const String& str)
{
	if (&str != this)
	{
		_string = new char[strlen(str._string) + 1];
		strcpy(_string, str._string);
		return *this;
	}
	return *this;
}
String& String::operator +=(const String& str)
{
	char* tmp = new char[strlen(_string) + 1 + strlen(str._string)];
	strcpy(tmp, _string);
	strcat(tmp, str._string);
	delete[] _string;
	_string = tmp;
	return *this;
}

#include<iostream>//         
#include"string.h"

using namespace std;

void test1()
{
	String s1("    !");
	String s2(s1);
	String s3;
	s1.Cout();
	s2.Cout();
	s1[19] = '?';
	s3 = s3;
	
	s3.Cout();
	s1.Cout();
	s3 = s1 + s2;
	s3 += s1;
	s3.Cout();

}

int main()
{
	test1();
	return 0;
}