C/C++学習ノート:Stringクラスの構築関数、解析関数、賦課関数
5941 ワード
既知:Stringクラス
class String{public:String(const char*str=NULL);//汎用コンストラクション関数String(const String&another);//コピーコンストラクション関数~String();//コンストラクション関数String&operator=(const String&rhs);//賦値関数private:char*m_data;//文字列の保存に使用};
引用:C++で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;
}