1. 程式人生 > >C ++中字串類運算子過載示例

C ++中字串類運算子過載示例

一、基本概念
(一) 函式過載的含義
所謂過載,就是重新賦予新的含義。函式過載就是對一個已有的函式賦予新的含義,使之實現新功能,因此,一個函式名就可以用來代表不同功能的函式,也就是”一名多用”。

(二) 為什麼要進行函式過載
一般情況下,編譯器對現有操作符的運算元是有一定的限制,但是通常情況下使用者使用class會自定義型別,而編譯器是不認可這種型別的操作符運算的,所以可以將操作符進行過載達到可以根據自定義型別進行運算;

(三)函式過載的一般格式
返回值型別 operator op(引數)

(四)一般符號過載的實現步驟:
一般情況下函式過載使用成員函式實現

  • 1)要承認操作符過載是一個函式,寫出函式名稱operator op ()
  • 2)根據所要過載的操作符的運算元,寫出函式引數
  • 3)根據函式的目的,完善函式返回值(看函式是返回引用 還是指標 元素)
  • 4)實現具體的函式內容

二、具體的程式示例
程式分為三部分:
宣告:MyString.h
具體實現:MyString.cpp
應用:example.cpp
執行平臺為:windows 10 & VS2017,所有程式執行結果均正確

1.MyString.h

#pragma once
#include "iostream"
using namespace std;

class MyString
{
public:
//這是建構函式和解構函式
MyString(); MyString(const char *p); MyString(const MyString &s); ~MyString(); private: int m_len; char* m_p; public: //實現 = 操作符的過載 MyString& operator=(const char *p); MyString& operator= (const MyString &s); //實現 [] 操作符的過載 char& operator[](int index); //實現 << 操作符的過載
friend ostream & operator<<(ostream &out, MyString &s); //實現 == 和 != 操作符的過載 bool operator==(const char *p); bool operator!=(const char *p); bool operator==(const MyString&s); bool operator!=(const MyString &s); //實現 < 操作符的過載 int operator<(const char *p); int operator<(const MyString &s); };

2.MyString.cpp

#include "MyString.h"
#include"math.h"
#include "iostream"
#pragma warning(disable:4996)

//建構函式:
	//將物件初始化為空字串
MyString::MyString() 
{
	m_len = 0; 
	m_p = new char[m_len + 1]; 
	//開闢一個存放字元陣列的空間,大小為(m_len + 1) *1 ,並且返回首地址賦值給指標變數m_p 
	strcpy(m_p, " ");
}

  //將物件初始化為一個字串
MyString::MyString(const char *p)
{
	if (p == NULL)
	{
		m_len = 0;
		m_p = new char[m_len + 1];
		strcpy(m_p, "");
	}else
	{
		m_len = strlen(p);
		m_p = new char[m_len + 1];
		strcpy(m_p, p);
	}
}

//拷貝建構函式
	//實現MyString s3 = s2;
 MyString::MyString(const MyString &s)
{
	m_len = s.m_len;   
	m_p = new char[m_len + 1];  //分配空間
	strcpy(m_p, s.m_p);
}


//解構函式的實現
 MyString::~MyString()
 {
	 if (m_p != NULL)
	 {
		 delete[] m_p;
		 m_p = NULL;
		 m_len = 0;
	 }
 }


//下面進行的是操作符過載
	//等號 = 操作符過載
		//用於實現s4 = "s2222"
 MyString&MyString:: operator=(const char *p)
	{
		//因為s4已經分配記憶體,應該先將舊的記憶體空間刪掉然後再分配新的
		
		//1.釋放舊記憶體
		if (m_p != NULL)
		{
			delete[] m_p;
			m_p = NULL;
			m_len = 0;
		}else
		{
			//分配新的記憶體
			if (p == NULL)
			{
				m_len = 0;
				m_p = new char[m_len + 1];
				strcpy(m_p, "");
			}
			else
			{
				m_len = strlen(p);
				m_p = new char[m_len + 1];
				strcpy(m_p, p);
			}
			return *this;
		}
	}


		//用於實現s4 = s2
 MyString&MyString:: operator= (const MyString &s)
	{
		if (m_p != NULL)
		{
			delete[] m_p;
			m_p = NULL;
			m_len = 0;
		}else
		{
			//根據s(對應於s2)分配新的記憶體
			m_len = s.m_len;
			m_p = new char[m_len + 1];
			strcpy(m_p, s.m_p);
			return *this;
		}
	}


//實現[] 操作符過載
 char&MyString::operator[](int index)
 {
	 return m_p[index];
 }


 //注意這個是全域性函式,所以函式名前面不能加上MyString::  
 ostream& operator<<(ostream &out, MyString &s)
 {
	 cout << s.m_p;
	 return out;
 }



 //下面是實現==和!= 的過載,其中分為類和字串的比較與類和類的比較
 bool MyString::operator==(const char *p)
 {
	 if (p == NULL)
	 {
		 if (m_len == 0)
		 {
			 return true;
		 }
		 else
		 {
			 return false;
		 }
	 }
	 else
	 {
		 if (m_len == strlen(p))
		 {
			 return !strcmp(m_p, p);
		 } 
		 else
		 {
			 return false;
		 }
	 }
	 return true;
 }

 bool MyString::operator!=(const char *p)
 {
	 return !(*this == p);
 }


 //兩個類之間的比較
 bool MyString::operator==(const MyString&s)
 {
	if (m_len != s.m_len)
	{
		return false;
	}
	return !strcmp(m_p, s.m_p);
 }

 bool MyString::operator!=(const MyString &s)
 {
	 return !(*this == s);
 }






 //實現  <  的過載

 int MyString::operator<(const char *p)
 {
	 return strcmp(this->m_p, p);
 }
 int MyString::operator<(const MyString &s)
 {
	 return strcmp(this->m_p, s.m_p);
 }

3.example.cpp

// 實現一個字串類
//C語言中 沒有字串這種型別,是通過陣列來模擬字串

//C++中 我們來設計一個字串類 以零結尾的字串

//若len為0,表示空串

#include "iostream"
#include "MyString.h"
using namespace std;
#pragma  warning (disable: 4996)


int main()
{
	MyString s1;
	MyString s2("s2");
	MyString s2_2 = NULL;
	MyString s3 = s2;


//下面進行操作符過載
	//=操作符
	//兩種呼叫方式;
	MyString s4 = "adfdfdn";
	
	s4 = "s2222"; 

	//呼叫方式二;
	s4 = s2;

//實現[]過載
  //當[]當右值的時候
	s4[1] = 'a';
	cout << "s4[1] = " << s4[1] << endl;

//實現<<操作符的過載
	cout << s4 << endl;   //相當於實現字串的整體輸出

//實現== 和!= 的過載
	MyString s5 = "ahhhh";
	
	if (s5 == "shhsk")
	{
		cout << "true" << endl;
	}
	else
	{
		cout << "false" << endl;
	}

	if (s5 != "sjfddsj")
	{
		cout << "false" << endl;
	}
	else
	{
		cout << "true" << endl;
	}
	
	//兩個類之間做判斷
	
	if (s5 == s2)
	{
		cout << "true" << endl;
	}
	else
	{
		cout << "false" << endl;
	}

	if (s5 != s2)
	{
		cout << "false" << endl;
	}
	else
	{
		cout << "true" << endl;
	}



//實現大於小於號的符號過載

	MyString s6 = "skdjfkld";
	if (s6 < "kdjfkdj")
	{
		cout << "s6 smaller than  skdjfkld" << endl;
	} 
	else
	{
		cout << "s6  bigger than  skdjfkld" << endl;
	}


	if (s6 < s5)
	{
		cout << "s6 smaller than s5" << endl;
	}
	else
	{
		cout << "s6 bigger than s5" << endl;
	}


	//使用類中的private:的指標

	MyString s7 = "jdkfjdklfjdl";
	strcpy(s7.c_str(), "lskjdfkljdklf");
	cout << s7 << endl;
}