您的位置:首页 > 编程语言 > C语言/C++

C++ - Implement a string class with basic functionality

2012-07-07 22:04 751 查看
// ------String.h------

#ifndef STRING_H
#define STRING_H

#include <iostream>

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){return a[i];}
const char& operator [] (int i) const {return a[i];} // Indexer to constant.
String& operator += (const String& s);
int length();

friend istream& operator >> (istream& is, String& s); // Try to figure out why set ">>" friend function member.
// friend bool operator < (const String& left,const String& right);
friend bool operator > (const String& left, const String& right); // These three operators is not necessary to set them friend. Here is just for simplification.
friend bool operator == (const String& left, const String& right);
friend bool operator != (const String& left, const String& right);
private:
char* a;
int size;
};

#endif
// ------String.cpp------

#include "String.h"
#include <cstring>
#include <cstdlib>

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

String::String(int n, char c)
{
a = new char[n + 1];
memset(a, c, n);
a
= '\0';
size = n;
}

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

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

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

String::~String()
{
delete[] a;
}

String& String::operator += (const String& s)
{
int j = strlen(a);
int size = j + strlen(s.a);
char* tmp = new char[size + 1];
strcpy(tmp, a);
strcpy(tmp + j, s.a);
delete[] a;
a = tmp;

return *this;
}

int String::length()
{
return strlen(a);
}
// ------Main.cpp------

#include <iostream>
#include "String.h"

using namespace std;

bool operator == (const String& left, const String& right)
{
int a = strcmp(left.a, right.a);
if(a == 0)
{
return true;
}
else
{
return false;
}
}

bool operator != (const String& left, const String& right)
{
return !(left == right);
}

ostream& operator << (ostream& os, String& s)
{
int length = s.length();
for(int i = 0; i < length; i++)
{
os << s[i];
}

return os;
}

String operator + (const String& a, const String& b)
{
String temp;
temp = a;
temp += b;
return temp;
}

bool operator < (const String& left, const String& right)
{
int j = 0;
while((left[j] != '\0') && (right[j] != '\0'))
{
if(left[j] < right[j])
{
return true;
}
else
{
if(left[j] == right[j])
{
j++;
continue;
}
else
{
return false;
}
}
}

if((left[j] == '\0') && (right[j] != '\0'))
{
return true;
}
else
{
return false;
}
}

bool operator > (const String& left, const String& right)
{
int a = strcmp(left.a, right.a);
if(a > 0)
{
return true;
}
else
{
return false;
}
}

istream& operator >> (istream& is, String& s)
{
delete[] s.a;
s.a = new char[20];
int m = 20;
char c;
int i = 0;
while(is.get(c) && isspace(c));
if(is)
{
do
{
s.a[i] = c;
i++;
if(i == m - 1)
{
s.a[i] = '\0';
char* b = new char[m];
strcpy(b, s.a);
m = m * 2;
s.a = new char[m];
strcpy(s.a, b);
delete[] b;
}
}
while (is.get(c) && !isspace(c));

if(is)
{
is.unget();
}
}

s.size = i;
s.a[i] = '\0';
return is;
}

int main()
{
String a = "abcd";
String b = "www";
String c(6, 'l');
String d;
String e = a;
String f;
cin >> f;
String g;
g = a + b;

if(a < b)
{
cout << "a < b" << endl;
}
else
{
cout << "a >= b" << endl;
}

if(e == a)
{
cout << "e == a" << endl;
}
else
{
cout << "e != a" << endl;
}

b += a;
cout << a << endl;
cout << b << endl;
cout << c << endl;
cout << d << endl;
cout << e << endl;
cout << f << endl;
cout << g << endl;
cout << g[0] << endl;

return 0;
}

// Output:
/*
t
a < b
e == a
abcd
wwwabcd
llllll

abcd
t
abcdwww
a
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐