1. 程式人生 > >運算子過載:string類

運算子過載:string類

運算子過載規則如下:

①、 C++中的運算子除了少數幾個之外,全部可以過載,而且只能過載C++中已有的運算子。
②、 過載之後運算子的優先順序和結合性都不會改變。
③、 運算子過載是針對新型別資料的實際需要,對原有運算子進行適當的改造。一般來說,過載的功能應當與原有功能相類似,不能改變原運算子的操作物件個數,同時至少要有一個操作物件是自定義型別。

不能過載的運算子只有五個:

它們是:成員運算子“.”、指標運算子“*”、作用域運算子“::”、“sizeof”、條件運算子“?:”。

運算子過載形式有兩種,過載為類的成員函式和過載為類的友元函式。

運算子過載為類的成員函式的一般語法形式為:
函式型別 operator 運算子(形參表)
{
函式體;
}
運算子過載為類的友元函式的一般語法形式為:
friend 函式型別 operator 運算子(形參表)
{
函式體;
}
其中,函式型別就是運算結果型別;operator是定義運算子過載函式的關鍵字;運算子是過載的運算子名稱。

參考程式碼如下:

class String
{
public:

//構造

String(char* pstring)  //構造
	{
		pstr = new char[strlen(pstring) + 1]();
		strcpy(pstr, pstring);
	}

//類內是this_call的呼叫約定,成員方法隱藏this指標,指向一般為左運算元,所以只用傳右運算元即可

String(const String& rhs)
{
	pstr = new char[strlen(rhs.pstr) + 1]();
	strcpy(pstr, rhs.pstr);
}

類內=(賦值)的過載,左右運算元型別均為String,類內只用傳右運算元即可

String& operator=(const String& rhs)
{
	if (this != &rhs)
	{
		delete[] pstr;
		pstr = new char[strlen(rhs.pstr) + 1]();
		strcpy(pstr, rhs.pstr);
	}
	return *this;
}

//析構

~String()
{
	delete[] pstr;
	pstr = NULL;
}

類內實現+的過載,傳入右運算元型別為char*(可省略:char*可隱式生成臨時物件,呼叫左右運算元都為string類的過載函式)

//const String operator+(char* prhs)
//{
//	char* pnewstr = new char[strlen(pstr) + strlen(prhs) + 1]();
//	strcat(pnewstr, pstr);
//	strcat(pnewstr, prhs);
//	String tmp(pnewstr);
//	delete[] pnewstr;
//	return tmp;
//}

String str2 = str1 + “world”;//“helloworld” +是自左向右,可根據str1.推演str2的型別
String str3 = “hi” + str1;//“hihello”;錯誤,不能根據右邊型別推演左邊型別,只能呼叫左操作符為char*,右操作符為string的函式,或者兩個型別都是string 的函式

類內==的過載,左右運算元型別均為String,類內只用傳右運算元即可

bool operator==(const String& rhs)
{
	return strcmp(pstr, rhs.pstr) == 0;
}

if (str1 == str2)
{
std::cout << str1[0] << std::endl;// int p[10] ==> p int* p[1]
}

類內[]的過載,左運算元型別為String,右運算元型別為int,類內只用傳右運算元即可

char& operator[](int index)
{ 
	return pstr[index];
}

std::cout << str1[0] << std::endl;// int p[10] ==> p int* p[1]

類內<的過載,左運算元型別為std::cout,右運算元型別為String,類內只用傳右運算元即可

bool operator<(const String& rhs)
{
	return strcmp(pstr, rhs.pstr) < 0;
}

if (str2 < str2)
{
std::cout << str2 << std::endl;
}

private:

char* pstr;

//類外不能訪問類內的私有成員變數,設定友元函式

 friend const String operator+(char*, const String&);
    	friend const String operator+(const String&, const String&);
    	friend std::ostream& operator <<(std::ostream&, const String&);

};

//類外是cd_call的呼叫約定,無this指標,需傳兩個物件

//類外實現+的過載,左運算元型別為char*,右運算元為String(可省略:char*可先呼叫構造生成臨時物件,後呼叫左右運算元都為string類的過載函式)

//const String operator+(char* plhs, const String& rhs)
//{
//	char* pnewstr = new char[strlen(plhs) + strlen(rhs.pstr) + 1]();
//	strcat(pnewstr, plhs);
//	strcat(pnewstr, rhs.pstr);
//	String tmp(pnewstr);
//	delete[] pnewstr;
//	return tmp;
//}

String str3 = “hi” + str1;//“hihello”;

類外實現+的過載,左右運算元型別均為String

const String operator+(const String& lhs, const String& rhs)
{
	char* pnewstr = new char[strlen(lhs.pstr) + strlen(rhs.pstr) + 1]();
	strcat(pnewstr, lhs.pstr);
	strcat(pnewstr, rhs.pstr);
	String tmp(pnewstr);
	delete[] pnewstr;
	return tmp;
}

String str4 = str1 + str2; //“hellohelloworld”

類外實現<<的過載,左運算元為std::ostream的型別,右運算元為String型別

std::ostream& operator <<(std::ostream& out, const String& rhs)
{
	out << rhs.pstr;
	return out;
}