C++実装Stringクラス
C++実装Stringクラスは、まだ完了していません.続行します.
次の点に注意してください.
(1)代入オペレータはMyString&を返し、リロードされた+はMyStringを返します.その理由は「effective c++」を参照してください.主にリファレンスを返すときは、この関数の前に存在しなければならないリファレンスを返さなければなりません.リファレンスは名前です.「私たちが使用する前に、彼がその名前を代表していることを考えなければなりません.「.ローカルオブジェクトの参照が返されると、この関数が終了すると、この参照は存在しないオブジェクトを指し、動作が定義されていない高速道路を走っていることが明らかになります.
実行結果:
hello,world hello,world hello,world hello,world 1 e hello,worldhello,world
次の点に注意してください.
(1)代入オペレータはMyString&を返し、リロードされた+はMyStringを返します.その理由は「effective c++」を参照してください.主にリファレンスを返すときは、この関数の前に存在しなければならないリファレンスを返さなければなりません.リファレンスは名前です.「私たちが使用する前に、彼がその名前を代表していることを考えなければなりません.「.ローカルオブジェクトの参照が返されると、この関数が終了すると、この参照は存在しないオブジェクトを指し、動作が定義されていない高速道路を走っていることが明らかになります.
# include <iostream>
# include <memory>
# include <cstring>
using namespace std;
class MyString {
private:
char *m_data;
public:
MyString();
MyString(const char* ptr);
MyString(const MyString& rhs);
~MyString();
MyString& operator=(const MyString& rhs);
MyString operator+(const MyString& rhs);
char operator[](const unsigned int index);
bool operator==(const MyString& rhs);
friend ostream& operator<<(ostream& output, const MyString &rhs);
};
//
MyString::MyString() {
m_data = new char[1];
*m_data = '\0';
}
// const char*
MyString::MyString(const char* ptr) {
if (NULL == ptr) {
m_data = new char[1];
*m_data = '\0';
} else {
int len = strlen(ptr);
m_data = new char[len + 1];
strcpy(m_data, ptr);
}
}
//
MyString::MyString(const MyString& rhs) {
int len = strlen(rhs.m_data);
m_data = new char[len + 1];
strcpy(m_data, rhs.m_data);
}
bool MyString::operator ==(const MyString& rhs) {
int result = strcmp(m_data, rhs.m_data);
if (0 == result)
return true;
else
return false;
}
//
MyString& MyString::operator =(const MyString& rhs) {
if (this != &rhs) {
delete[] m_data;
m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data, rhs.m_data);
}
return *this;
}
// +
MyString MyString::operator+(const MyString &rhs) {
MyString newString;
if (!rhs.m_data)
newString = *this;
else if (!m_data)
newString = rhs;
else {
newString.m_data = new char[strlen(m_data) + strlen(rhs.m_data) + 1];
strcpy(newString.m_data, m_data);
strcat(newString.m_data, rhs.m_data);
}
return newString;
}
//
char MyString::operator [](const unsigned int index) {
return m_data[index];
}
//
MyString::~MyString() {
delete[] m_data;
}
// <<
ostream& operator<<(ostream& output, const MyString &rhs) {
output << rhs.m_data;
return output;
}
int main() {
const char* p = "hello,world";
MyString s0 = "hello,world";
MyString s1(p);
MyString s2 = s1;
MyString s3;
s3 = s1;
MyString s4 = s3 + s1;
bool flag(s1 == s2);
cout << s0 << endl;
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << flag << endl;
char result = s3[1];
cout << result << endl;
cout << s4 << endl;
return 0;
}
実行結果:
hello,world hello,world hello,world hello,world 1 e hello,worldhello,world