日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 自定义string类 重载相关运算符

發布時間:2025/3/15 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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类 重载相关运算符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。