#include <iostream>
using namespace std;
/*String类的实现*/
/*功能函数*/
/*
1.重载<<运算符
2.重载>>运算符
3.默认构造函数
4.复制构造函数
5.赋值构造函数
6.operator+
7.operator+=
8.operator==
9.operator[](const和非const)
10.析构函数
*/
class String{
friend ostream &operator<<(ostream &, String &);
friend istream &operator>>(istream &, String &);
public:
String(const char *str = NULL);
String(const String &other);
String& operator=(const String &other);
String operator+(const String &other);
bool operator==(const String &other);
char &operator[](unsigned int i);
private:
char *m_data;
};
String::String(const char* str){
if (str == NULL){
m_data = new char[1];
*m_data = '\0';
}
else{
int length = strlen(str);
m_data = new char[length + 1];
strcpy(m_data, str);
}
}
String::String(const String &other){
if (other.m_data == NULL){
m_data = NULL;
}
else{
int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data, other.m_data);
}
}
String& String::operator=(const String &other){
if (this != &other){
delete[] m_data;
if (other.m_data == NULL){
m_data = NULL;
}
else{
int length = strlen(other.m_data);
m_data = new char[length + 1];
strcpy(m_data, other.m_data);
}
}
return *this;
}
String String::operator+(const String &other){
String newString;
if (other.m_data == NULL) newString = *this;
else if (m_data == NULL) newString = other;
else{
newString.m_data = new char[strlen(m_data) + strlen(other.m_data) + 1];
strcpy(newString.m_data, m_data);
strcat(newString.m_data, other.m_data);
}
return newString;
}
char& String::operator[](unsigned int i){
if (i >= 0 && i < strlen(m_data)) return m_data[i];
}
int main(){
return 0;
}
注意:上面的赋值构造函数没有考虑异常安全性,考虑异常安全性的版本如下:
String& String::operator=(const String &other){
if (this != &other){
String strTemp(other);
char *pTemp = strTemp.m_data;
strTemp.m_data = m_data;
m_data = pTemp;
}
return *this;
}