#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<conio.h>
#include<cstring>
using namespace std;
class String {
public:
String(const char *str = NULL);
String(const String &str);
~String();
size_t size()const { return this->len; }
String& operator=(const String &str);
String& operator+=(const String &str);
String& operator+(const String &str)const;
char operator[](int index) const;
char& operator[](int index);
friend ostream &operator<<(ostream &os, String &str);
friend istream &operator>>(istream &is, String &str);
//friend bool operator==(const String &str1, const String &str2);
bool operator==(const String &str1);
private:
char *data;
size_t len;
};
String::String(const char *str) {
if (!str) {
len = 0;
data = new char[1];
*data = '\0';
}
else {
len = strlen(str);
data = new char[len + 1];
strcpy_s(data, len+1, str);
}
}
String::String(const String &str) {
len = str.len;
data = new char[len + 1];
strcpy_s(data, len+1, str.data);
}
String::~String() {
delete[] data;
len = 0;
}
String& String::operator=(const String &str) {
if (&str != this) {
delete[] data;
len = str.len;
data = new char[len + 1];
strcpy_s(data, len + 1, str.data);
}
return *this;
}
String& String::operator+=(const String &str) {
size_t newLength = len + str.len;
char *tempData = new char[newLength + 1];
strcpy(tempData, data);
strcat(tempData, str.data); //或者strcpy(tempData+len,str.data)
delete[]data;
strcpy(data, tempData);
len = newLength;
return *this;
}
//有错
String& String::operator+(const String &str)const {
String newString;
delete[]newString.data;
newString.len = len + str.len;
newString.data = new char[newString.len + 1];
strcpy(newString.data, data);
strcat(newString.data, str.data);
return newString;
}
char String::operator[](int index)const {
if (index < 0 && index >= len) {
cerr << "invalid index" << endl;
exit(1);
}
else
return data[index];
}
char& String::operator[](int index) {
if (index < 0 && index >= len) {
cerr << "invalid index" << endl;
exit(1);
}
else
return data[index];
}
ostream &operator<<(ostream &os, String &str) {
os << str.data;
return os;
}
istream &operator >> (istream &is, String &str) {
char temp[30];
is >> temp;
str = temp;
return is;
}
bool String::operator==(const String &str1) {
bool ret = this->len == str1.len ? true : false;
if (!ret)
return false;
return strcmp(this->data, str1.data) ? false : true;
}
int main() {
String str1 = "qwer";
String str2("asdf");
String str3(str2);
String str4, str6, str5("ok");
//[]运算符重载的两种情况
{
char c = str2[1];
c = 'x';
cout << str2 << endl;
str2[1] = 'x';
cout << str2 << endl;
}
//+运算符重载出错,尚未成功
str4 = str1 + str2;
str5 += str3;
cout << str5 << endl;
cin >> str6;
cout << str6 << endl;
system("pause");
return 0;
}
c++实现string类
最新推荐文章于 2023-08-29 12:45:32 发布