C/C++学習ノート:Stringクラスの構築関数、解析関数、賦課関数


既知:Stringクラス
class String{public:String(const char*str=NULL);//汎用コンストラクション関数String(const String&another);//コピーコンストラクション関数~String();//コンストラクション関数String&operator=(const String&rhs);//賦値関数private:char*m_data;//文字列の保存に使用}; 
#include 

class String
{
public:
	String (const char *str = NULL); //      
	String (const String &another);  //      
	~String();						  //    
	String& operator = (const String &rhs);	 //    
protected:
private:
	char *m_data; //       
};

String::String(const char *str)
{
	if ( NULL == str)
	{
		m_data = new char[1];  ////               '\0'   
		if ( NULL == m_data )  //        
		{
			std::cout << "Application of memory failure" << std::endl;
			exit(1);
		}
		m_data[0] = '\0';
	}
	else
	{
		int length = strlen(str);
		m_data = new char[length + 1];
		if (NULL == m_data)
		{
			std::cout << "Application of memory failure" << std::endl;
			exit(1);
		}
		strcpy(m_data, str);
	}
}

String::String(const String &another)  //     const  
{
	int length = strlen(another.m_data);
	m_data = new char[length + 1];
	if (NULL == m_data)
	{
		std::cout << "Application of memory failure" << std::endl;
		exit(1);
	}
	strcpy(m_data, another.m_data);
}

//    
String::~String()
{
	delete [] m_data;
}

String& String::operator=(const String &rhs)  //     const  
{
	if ( this == &rhs )	 //      
	{				  
		return *this;
	}
	int length = strlen(rhs.m_data);
	delete [] m_data;	//         
	m_data = new char[length+1];
	if (NULL == m_data)
	{
		std::cout << "Application of memory failure" << std::endl;
		exit(1);
	}
	strcpy(m_data, rhs.m_data);
	return *this;	  //        
}



//   
void main()
{
	String A;
	String B("CSDN");
	system("pause");
}

引用:C++でStringクラスを実現し、比較、接続、入力、出力機能を有し、いくつかのテスト例を提供する.
//String.h
#ifndef STRING_H
#define STRING_H

#include
using namespace std;

class String
{
public:
	String();								//      
	String(int n, char c);					 //      
	String(const char* source);				 //      
	String(const String& s);				 //      
	String& operator= (char* s);			  //  =,       
	String& operator= (const String& s);	  //  =,      
	~String();								   //    
	char& operator[] (int i);					//  [],      
	const char& operator[] (int i) const;		//  [],      (     )
	String& operator+= (const String& s);		 //  +=,       
	String& operator+= (const char* s);			 //  +=,        
	friend ostream& operator<< (ostream& out, String& s);	//  <> (istream& in, String& s);	  //  >>,     
	friend bool operator< (const String& left, const String& right);   //  <
	friend bool operator> (const String& left, const String& right);	//  >
	friend bool operator== (const String& left, const String& right);	 //  ==
	friend bool operator!= (const String& left, const String& right);	 //  !=
	char* getData();//  data  
	int length();
private:
	int size;	  //  
	char* data;	   //       
};

#endif
//String.cpp
#include "String.h"

String::String()
{
	data = new char[1];
	*data = '\0';
	size = 0;
}

String::String(int n, char c)
{
	data = new char[n + 1];
	size = n;
	char* tmp = data;
	while( n -- )
	{
		*tmp++ = c;
	}
	*tmp = '\0';
}

String::String(const char* source)
{
	if( NULL == source)
	{
		data = new char[1];
		*data = '\0';
		size = 0;
	}
	else
	{
		size = strlen(source);
		data = new char[size + 1];
		strcpy(data, source);
	}
}

String::String(const String& s)
{
	data = new char[s.size + 1];
	strcpy(data, s.data);
	size = s.size;
}

String& String::operator=(char* s)
{
	if (NULL != data)
	{
		delete [] data;
	}
	size = strlen(s);
	data = new char[size + 1];
	strcpy(data, s);
	return *this;
}

String& String::operator=(const String& s)
{
	if( this == &s )
	{
		return *this;
	}
	if(NULL != data)
	{
		delete[] data;
	}
	size = strlen(s.data);
	data = new char[size + 1];
	strcpy(data, s.data);
	return *this;
}

String::~String()
{
	if( NULL != data)
	{
		delete[] data;
		data = NULL;
		size = 0;
	}
}

char& String::operator[](int i)
{
	return data[i];
}

const char& String::operator[](int i) const
{
	return data[i];
}

String& String::operator+=(const String& s)
{
	int len = size + s.size +1;
	char* temp = data;
	data = new char[len];
	size = len - 1;
	strcpy(data, temp);
	strcat(data, s.data);
	delete[] temp;
	return *this;
}

String& String::operator+=(const char* s)
{
	if( NULL == s)
	{
		return *this;
	}
	int len = size + strlen(s) + 1;
	char* temp = data;
	data = new char[len];
	size = len - 1;
	strcpy(data, temp);
	strcat(data, s);
	delete[] temp;
	return *this;
}

int String::length()
{
	return size;
}

ostream& operator<>(istream& in, String& s)
{
	char p[50];
	in.getline(p,50);
	s = p;
	return in;
}

bool operator< (const String& left, const String& right)
{
	int i = 0;
	while(left[i] == right[i] && left[i] != 0 && right[i] != 0)
	{
		i ++;
	}
	return left[i]-right[i] < 0 ? true:false;
}

bool operator> (const String& left, const String& right)
{
	int i = 0;
	while(left[i] == right[i] && left[i] != 0 && right[i] != 0)
	{
		i ++;
	}
	return left[i]-right[i] > 0 ? true:false;
}

bool operator== (const String& left, const String& right)
{
	int i = 0;
	while(left[i] == right[i] && left[i] != 0 && right[i] != 0)
	{
		i ++;
	}
	return left[i]-right[i] == 0 ? true:false;
}

bool operator!= (const String& left, const String& right)
{
	int i = 0;
	while(left[i] == right[i] && left[i] != 0 && right[i] != 0)
	{
		i ++;
	}
	return left[i]-right[i] != 0 ? true:false;
}