C++ 自定义string类 重载相关运算符
生活随笔
收集整理的這篇文章主要介紹了
C++ 自定义string类 重载相关运算符
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
c++提供的string類
c++提供的string類可以做很多事情,它本質上是也是類,它的很多運算符都是通過重載進行實現的。
今天我們自己來簡單來實現MyString類來模擬 string類能做得一些事情。重載+、[]、==、!=、<<、>> 幾個運算符。
寫法和自定數組類型重載相關運算符差不多,多了一個+ 拼接運算符重載。
代碼展示
MyString.h
#pragma once #ifndef __MY_STRING_H__ #define __MY_STRING_H__ #include <iostream> using namespace std;class MyString { public:MyString();MyString(int len);MyString(const char* str);//拷貝構造函數MyString(const MyString &another);friend ostream& operator<<(ostream &cout, MyString& myString);friend istream& operator >> (istream &cin, MyString& myString);MyString& operator=(const MyString& another);char& operator[](int index);bool operator==(MyString& another);bool operator!=(MyString& another);MyString operator+(const MyString& myString);~MyString();private:int length;//實際字符個數char* str; }; #endif // !__MY_STRING_H__MyString.cpp
#include "MyString.h"MyString::MyString() {this->length = 0;this->str = NULL; }MyString::MyString(int len) {//cout << "構造函數 MyString::MyString(int len)...." << endl;this->length = len;this->str = new char[len];//初始位空串memset(this->str, 0, len); } MyString::MyString(const char* str) {//cout << "構造函數 MyString::MyString(const char* str)...." << endl;if (str == NULL){this->length = 0;this->str = new char[1];strcpy(this->str, "");return;}this->length = strlen(str);this->str = new char[this->length + 1];strcpy(this->str, str);} //初始化時調用 MyString::MyString(const MyString & another) {//cout << "拷貝構造函數 MyString::MyString(const MyString & another)...." << endl;this->length = another.length;this->str = new char[this->length+1];strcpy(this->str, another.str); }MyString & MyString::operator=(const MyString & another) {//cout << "賦值運算符 MyString & MyString::operator=(const MyString & another)...." << endl;// 防止自身賦值if (this == &another){return *this;}// 如果自身原來有空間,先釋放if (this->str != NULL){delete[] this->str;this->str = NULL;this->length = 0;}// 新開辟空間進行內容拷貝this->length = another.length;this->str = new char[this->length + 1];strcpy(this->str, another.str);return *this; }char& MyString::operator[](int index) {return (this->str[index]); }bool MyString::operator==(MyString & another) {if (this == &another){return true;}if (this->length != another.length){return false;}if (strcmp(this->str, another.str) != 0){return false;}return true; }bool MyString::operator!=(MyString & another) {return !(*this==another); }MyString MyString::operator+(const MyString& another) {int len = this->length + another.length + 1;MyString str1(len);strcat(str1.str, this->str);strcat(str1.str, another.str);return str1; }MyString::~MyString() {//cout << "~MyString()" << endl;if (this->str != NULL){delete[] this->str;this->str = NULL;this->length = 0;} }ostream & operator<<(ostream & cout, MyString & myString) {if(myString.str!=NULL)cout << myString.str;return cout; }istream & operator >> (istream & cin, MyString & myString) {// 如果原來有字符串,將其清空if (myString.str != NULL){delete[] myString.str;myString.str = NULL;myString.length = 0;}//輸入長度未知,用臨時變量接收,然后進拷貝char temp[1024] = { 0 };cin >> temp;int len = strlen(temp);myString.length = len;myString.str = new char[len + 1];//注意:如果目標空間大于等于源字符串strcpy會復制到\0strcpy(myString.str, temp);return cin; }MyStringMain.cpp
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <iostream> #include "MyString.h" using namespace std;int main(int argc, char *argv[]) {MyString str1("hello");//構造函數MyString str2("world");//構造函數//cout << str1 << str2 << endl;MyString str3 = str1;//調用拷貝構造函數cout << str3 <<endl;str3 = str2;// = 調用賦值運算符cout << str3 << endl;MyString str4 = str1 + str2;cout << str4 << endl;cout << "請重置str1和str2:";cin >> str1 >> str2;str4 = str1 + str2;cout << str4 << endl;MyString aa("aaa");MyString bb("aaa");cout <<"aa = " << aa<< ",bb = "<< bb <<",aa==bb:" << boolalpha << (aa == bb) <<endl;return 0; }運行結果
總結
以上是生活随笔為你收集整理的C++ 自定义string类 重载相关运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好看的动画片~
- 下一篇: PMP是什么,PMP最难的是哪些内容?