• <二>自己实现简单的string


    我们结合运算符重载知识实现string 类
    在自己实现的String类中可以参考C++中string的方法
    例如构造,加法,大小比较,长度,[] 等操作.
    当前的MyString 类中,暂时不加入迭代器,我们将在下一节中加入迭代器的代码.

    #include 
    using namespace std;
    
    class MyString {
    
    public:
    
    	//构造函数
    	MyString(const char * pSource = nullptr) {
    		if (pSource != nullptr) {
    			pString = new char[strlen(pSource) + 1];
    			strcpy(pString, pSource);
    		}
    		else {
    			pString = new char[1];
    			pString[0] = '\0';
    		}
    		cout << "MyString构造函数,对象地址="<<this << endl;
    	}
    
    	//拷贝构造
    	MyString(const MyString & _rValue) {
    
    		pString = new char[strlen(_rValue.pString) + 1];
    		strcpy(pString, _rValue.pString);
    		cout << "MyString拷贝构造函数" << endl;
    	}
    
    	//赋值函数
    	MyString & operator=(const MyString & _rValue) {
    
    		if (this == &_rValue) {
    			return *this;
    		}
    		delete[] this->pString;
    		this->pString = nullptr;
    	
    		char * _tpString = new char[strlen(_rValue.pString) + 1];
    		strcpy(_tpString, _rValue.pString);
    		
    		cout << "MyString赋值函数" << endl;
    
    	}
    
    	//可编辑
    	char & operator[](int index) {
    
    		int len = strlen(this->pString);
    		if (index<0) { return pString[0]; }
    		else if (index>len) { return pString[index]; }
    		else { return pString[index]; }
    
    	}
    
    	//不可编辑
    	const char operator[](int index) const {
    
    		int len = strlen(this->pString);
    		if (index<0) { return pString[0]; }
    		else if (index>len) { return pString[index]; }
    		else { return pString[index]; }
    
    	}
    
    	bool operator>(const MyString & _rValue) const {
    		return strcmp(this->pString, _rValue.pString)>0;
    	}
    	bool operator<(const MyString & _rValue) const {
    		return strcmp(this->pString, _rValue.pString)<0;
    	}
    	bool operator==(const MyString & _rValue) const {
    		return strcmp(this->pString, _rValue.pString)==0;
    	}
    
    	int length() const {
    		return strlen(this->pString);
    	}
    
    	~MyString() {
    		if (this->pString != nullptr) {
    			delete[] this->pString;
    			this->pString = nullptr;
    			cout << "MyString析构函数" << this << endl;
    		}
    	}
    
    	const char * c_str()  const { return this->pString; }
    
    private:
    	char * pString ;
    	friend MyString operator+  (const MyString & s1, const MyString &s2) ;
    	friend ostream & operator<<(ostream & out, const MyString &s) ;
    
    };
    
    MyString operator+(const MyString & s1, const MyString &s2) {
    	
    	/*
    	   方式1 这段代码有 内存泄漏问题  tp 没有释放掉
    	   int newLength = strlen(s1.pString) + strlen(s2.pString) + 1;
    	   char *tp = new char[newLength + 1];//重新申请空间
    	   strcpy(tp, s1.pString);
    	   strcat(tp, s2.pString);
    
    	   MyString s(tp);
    	   cout << "operator+ = " << &s << endl;
    	   return s;
    	*/
    
    	/*
    	  方式2 对比方式1 效果更高
    	*/
    	MyString s;
    	int newLength = strlen(s1.pString) + strlen(s2.pString) + 1;
    	s.pString = new char[newLength + 1];//重新申请空间
    	strcpy(s.pString, s1.pString);
    	strcat(s.pString, s2.pString);	
    	cout << "operator+ = " << &s << endl;
    	return s;
    }
    
    ostream & operator<<(ostream & out, const MyString &s) {
    	    cout << s.pString << endl;
    		return out;
    }
    
    void test() {
    
    	MyString s1("12345");
    	MyString s2("6789ABC");
    
    	cout << s1 << endl;
    	cout << s2 << endl;
    
    	MyString s3 = s1 + s2;
    	cout << s3 << endl;
    	cout << "s3 = " << &s3 << endl;
    
    	for (int i = 0; i < s3.length(); i++) {
    		cout << s3[i] << endl;
    	}
    	
    	cout <<"--------------------" << endl;
    	s3[0] = 'W';
    	for (int i = 0; i < s3.length(); i++) {
    		cout << s3[i] << endl;
    	}
    
    	const MyString s4("hello");
    	
    	for (int i = 0; i < s4.length(); i++) {
    		cout << s4[i] << endl;
    	}
    
    }
    int main() {
    
    	test();
    
    	system("pause");
    	return 0;
    }
    
  • 相关阅读:
    Python入门
    C#的Switch语句2(case后的值与模式匹配)
    专利非正常申请,需要我们注意什么
    手写RPC框架--2.介绍Zookeeper
    项目管理工具dhtmlxGantt甘特图入门教程(五):甘特图实例特点
    Java——面向对象进阶(封装、继承、多态)
    ubuntu 安装harbor
    从小白到架构师(1): 应对高并发
    皮球 - 博客园主题
    devops 流程整理
  • 原文地址:https://www.cnblogs.com/erichome/p/16913628.html