#ifndef _STRING_H_
#define _STRING_H_
#include<iostream>
using namespace std;
class String{
private:
char* pStr;
void copy(const char* src);
void copy(const char& ch);
public:
// コンストラクタ
String();
String(const char* src);
String(const char& ch);
String(const String& src);
// デストラクタ
~String();
// 代入演算子
String& operator=(const char* src);
String& operator=(const char& ch);
String& operator=(const String& src);
// キャスト演算子
operator const char*()const;
// 比較演算子
bool operator< (const char* p)const;
bool operator<=(const char* p)const;
bool operator> (const char* p)const;
bool operator>=(const char* p)const;
bool operator==(const char* p)const;
bool operator!=(const char* p)const;
bool operator< (const String& s)const;
bool operator<=(const String& s)const;
bool operator> (const String& s)const;
bool operator>=(const String& s)const;
bool operator==(const String& s)const;
bool operator!=(const String& s)const;
// 比較演算子(外部関数)
friend bool operator< (const char* p, const String& s);
friend bool operator<=(const char* p, const String& s);
friend bool operator> (const char* p, const String& s);
friend bool operator>=(const char* p, const String& s);
friend bool operator==(const char* p, const String& s);
friend bool operator!=(const char* p, const String& s);
// +=演算子
String& operator+=(const char* p);
String& operator+=(const String& s);
// +演算子
String operator+(const char* p)const;
String operator+(const String& s)const;
friend String operator+(const char* p, const String& s);
// 入力演算子
friend istream& operator>>(istream& is, String& s);
istream& GetLine(istream& is);
// 出力演算子
friend ostream& operator<<(ostream& os, const String& s);
// 大文字・小文字変換
String& ToUpper();
String& ToLower();
// 指定文字を返す
char& operator[](int n);
// 空文字か?
bool IsEmpty()const;
// 文字数を返す
int GetLength()const;
};
#endif //_STRING_H_
#include<string> // strlen, strcmp, strcpy, strcatなど
#include"String.h"
// デフォルトコンストラクタ
String::String(){
pStr = new char('\0');
}
// コピーコンストラクタ
String::String(const String& src){
copy( src.pStr );
}
// コンストラクタ
String::String(const char& ch){
copy( ch );
}
// コンストラクタ
String::String(const char* src){
copy( src );
}
// デストラクタ
String::~String(){
delete pStr;
}
// ヘルパー関数
void String::copy(const char* src){
int len = strlen( src );
pStr = new char[len + 1];
strcpy(pStr, src);
}
// ヘルパー関数
void String::copy(const char& ch){
pStr = new char[2];
*(pStr+0) = ch;
*(pStr+1) = '\0';
}
// 代入演算子
String& String::operator=(const char* src){
delete pStr;
copy( src );
return *this;
}
// 代入演算子
String& String::operator=(const char& ch){
delete pStr;
copy( ch );
return *this;
}
// 代入演算子
String& String::operator=(const String& src){
delete pStr;
copy( src.pStr );
return *this;
}
// キャスト演算子
String::operator const char*()const{
return pStr;
}
// 比較演算子
bool String::operator< (const char* p)const{
return strcmp( pStr, p ) < 0;
}
// 比較演算子
bool String::operator<=(const char* p)const{
return strcmp( pStr, p ) <= 0;
}
// 比較演算子
bool String::operator> (const char* p)const{
return strcmp( pStr, p ) > 0;
}
// 比較演算子
bool String::operator>=(const char* p)const{
return strcmp( pStr, p ) >= 0;
}
// 比較演算子
bool String::operator==(const char* p)const{
return strcmp( pStr, p ) == 0;
}
// 比較演算子
bool String::operator!=(const char* p)const{
return strcmp( pStr, p ) != 0;
}
// 比較演算子
bool String::operator< (const String& s)const{
return strcmp( pStr, s.pStr ) < 0;
}
// 比較演算子
bool String::operator<=(const String& s)const{
return strcmp( pStr, s.pStr ) <= 0;
}
// 比較演算子
bool String::operator> (const String& s)const{
return strcmp( pStr, s.pStr ) > 0;
}
// 比較演算子
bool String::operator>=(const String& s)const{
return strcmp( pStr, s.pStr ) >= 0;
}
// 比較演算子
bool String::operator==(const String& s)const{
return strcmp( pStr, s.pStr ) == 0;
}
// 比較演算子
bool String::operator!=(const String& s)const{
return strcmp( pStr, s.pStr ) != 0;
}
// 比較演算子(外部関数)
bool operator< (const char* p, const String& s){
return strcmp( p, s.pStr ) < 0;
}
// 比較演算子(外部関数)
bool operator<=(const char* p, const String& s){
return strcmp( p, s.pStr ) <= 0;
}
// 比較演算子(外部関数)
bool operator> (const char* p, const String& s){
return strcmp( p, s.pStr ) > 0;
}
// 比較演算子(外部関数)
bool operator>=(const char* p, const String& s){
return strcmp( p, s.pStr ) >= 0;
}
// 比較演算子(外部関数)
bool operator==(const char* p, const String& s){
return strcmp( p, s.pStr ) == 0;
}
// 比較演算子(外部関数)
bool operator!=(const char* p, const String& s){
return strcmp( p, s.pStr ) != 0;
}
// +=演算子
String& String::operator+=(const char* p){
int len = strlen( pStr ) + strlen( p ) + 1;
char* pTmp = pStr;
pStr = new char[len];
strcpy( pStr, pTmp );
strcat( pStr, p );
return *this;
}
// +=演算子
String& String::operator+=(const String& s){
return *this+=s.pStr;
}
// +演算子
String String::operator+(const char* p)const{
String str(*this);
str+=p;
return str;
}
// +演算子
String String::operator+(const String& s)const{
String str(*this);
str+=s.pStr;
return str;
}
// +演算子(外部関数)
String operator+(const char* p, const String& s){
String str(p);
str+=s.pStr;
return str;
}
// 入力演算子(外部関数)
istream& operator>>(istream& is, String& s){
char buffer[512]; // 危険!!
is >> buffer;
s = buffer;
return is;
}
// 入力演算子
istream& String::GetLine(istream& is){
char buffer[512]; // 危険!!
is.getline(buffer, sizeof(buffer));
*this = buffer;
return is;
}
// 大文字・小文字変換
String& String::ToUpper(){
for( char *p = pStr ; *p ; p++ )
*p = toupper( *p );
return *this;
}
String& String::ToLower(){
for( char *p = pStr ; *p ; p++ )
*p = tolower( *p );
return *this;
}
// 指定文字を返す
char& String::operator[](int n){
return *(pStr+n);
}
// 空文字か?
bool String::IsEmpty()const{
return *pStr == '\0';
}
// 文字数を返す
int String::GetLength()const{
return strlen( pStr );
}
// 出力演算子
ostream& operator<<(ostream& os, const String& s){
return os << s.pStr;
}
|