做为学习重载的最佳练习,自己写了这个string类,请大家指正!
//string.h
#ifndef MyString_H
#define MyString_H
#include <iostream>
using namespace std;


class MyString...{
private:
char *data;
int length;
public:
MyString();
~MyString(); //destructor

MyString(const char *str); //constructor
MyString(const MyString& str);
int getLength() const;
//overloading
const MyString& operator=(const char *str); //str = "a"
const MyString& operator=(const MyString& str); //str1 = str2

char& operator[](int i); // str[i] = n
const char& operator[](int i) const; // const str, char m = str[i];

MyString& operator+=(const char *str); // str += "a", str += "b"
MyString& operator+=(const MyString& str); // str1 += str2, str1 += str3

bool operator!() const; //judge whether is empty
bool operator==(const char *str) const; // str1 == "a"
bool operator==(const MyString& str) const; // str1 == str2

bool operator!=(const char *str) const; // str1 != "a"
bool operator!=(const MyString& str) const; // str1 != str2
bool operator<(const char *str) const; // str1 < "a"
bool operator<(const MyString& str) const; // str1 < str2

bool operator>(const char *str) const; // str1 > "a"
bool operator>(const MyString& str) const; // str1 > str2

bool operator<=(const char *str) const; // str1 <= "a"
bool operator<=(const MyString& str) const; // str1 <= str2

bool operator>=(const char *str) const; // str1 >= "a"
bool operator>=(const MyString& str) const; // str1 >= str2
public:
friend ostream& operator<<(ostream& output, const MyString& str);
friend istream& operator>>(istream& input, MyString& str);
};
#endif

//string.cpp
#include "string.h"
#include <assert.h>


MyString::MyString(const char *str)...{
length = strlen(str);
data = new char[length+1];
strcpy(data,str);
}


MyString::MyString(const MyString& str)...{
length = str.length;
data = new char[length+1];
strcpy(data,str.data);
}


MyString::MyString()...{
data = NULL;
length = 0;
}

MyString::~MyString()...{
delete[] data;
}


int MyString::getLength() const...{
return length;
}


const MyString& MyString::operator=(const char *str)...{
length = strlen(str);
delete[] data;
data = new char[length+1];
strcpy(data, str);
return *this;
}


const MyString& MyString::operator=(const MyString& str)...{

if(this != &str)...{
delete[] data;
length = str.length;
data = new char[length+1];
strcpy(data, str.data);
}
return *this;
}


char& MyString::operator[](int i)...{
assert(i>0 && i < length);
return data[i];
}


const char& MyString::operator[](int i) const...{
assert(i > 0 && i < length);
return data[i];
}


MyString& MyString::operator+=(const char *str)...{
int len = length + strlen(str);
char *tempdata = new char[len+1];
strcpy(tempdata, data); // copy self to new place
strcpy(tempdata+length, str); // copy str
delete[] data;
data = tempdata;
length = len;
return *this;
}



MyString& MyString::operator+=(const MyString& str)...{
int len = length + str.length;
char *tempdata = new char[len+1];
strcpy(tempdata, data);
strcpy(tempdata+length, str.data);
delete[] data;
data = tempdata;
length = len;
return *this;
}


bool MyString::operator!() const...{
return length == 0;
}


bool MyString::operator==(const char *str) const...{
return strcmp(data,str) == 0;
}


bool MyString::operator==(const MyString& str) const...{
return strcmp(data,str.data) == 0;
}


bool MyString::operator!=(const char *str) const...{
return !(*this == str);
}


bool MyString::operator!=(const MyString& str) const...{
return !(this == &str);
}


bool MyString::operator<(const char *str) const...{
return strcmp(data, str) < 0;
}


bool MyString::operator<(const MyString& str) const...{
return strcmp(data,str.data) < 0;
}


bool MyString::operator>(const char *str) const...{
return strcmp(data, str) > 0;
}


bool MyString::operator>(const MyString& str) const...{
return strcmp(data, str.data) > 0;
}


bool MyString::operator<=(const char *str) const...{
return !(*this > str);
}


bool MyString::operator<=(const MyString& str) const...{
return !(*this > str);
}


bool MyString::operator>=(const char *str) const...{
return !(*this < str);
}


bool MyString::operator>=(const MyString& str) const...{
return !(*this < str);
}


ostream& operator<<(ostream& output, const MyString& str)...{
output << str.data;
return output;
}


istream& operator>>(istream& input, MyString& str)...{
char temp[1024];
input >> temp;
str = temp;
return input;
}

P.S: 在自己动手写之前,参考过别人写的代码,对
const char& operator[](int i) const;
没想明白,因为无论是 str[i]=c 或 c = str[i]都是调用的非const的形式,至于带const什么时候调用,心里有疑惑。网上搜了一圈,恍然大悟!
举个例子:
Mystring str("hello");
str[1]='m'
char c = str[1]
这两处都是调用非const修饰的成员函数,可是如果定义
const Mystring str("world");
char c = str[1];
str[1] = 'n'----这里将出现编译错误:C2166: l-value specifies const object
为什么呢?因为对象是const,所以呢会调用const修饰的重载函数,但由于其返回值为const,所以返回值就不能被修改,符合逻辑。
如果返回值不是const,即如果是 char& operator[](int i) const; 就有机会修改常量对象了,不符合逻辑。