一、 運算子過載的規則
運算子過載規則如下:
①、 c++中的運算子除了少數幾個之外,全部可以過載,而且只能過載c++中已有的運算子。
②、 過載之後運算子的優先順序和結合性都不會改變。
③、 運算子過載是針對新型別資料的實際需要,對原有運算子進行適當的改造。一般來說,過載的功能應當與原有功能相類似,不能改變原運算子的操作物件個數,同時至少要有乙個操作物件是自定義型別。
不能過載的運算子只有五個,它們是:成員運算子「.」、指標運算子「*」、作用域運算子「::」、「sizeof」、條件運算子「?:」。
運算子過載形式有兩種,過載為類的成員函式和過載為類的友元函式。
運算子過載為類的成員函式的一般語法形式為:
函式型別 operator 運算子(形參表)
運算子過載為類的友元函式的一般語法形式為:
friend 函式型別 operator 運算子(形參表)
其中,函式型別就是運算結果型別;operator是定義運算子過載函式的關鍵字;運算子是過載的運算子名稱。
當運算子過載為類的成員函式時,函式的引數個數比原來的操作個數要少乙個;當過載為類的友元函式時,引數個數與原運算元個數相同。原因是過載為類的成員函式時,如果某個物件使用過載了的成員函式,自身的資料可以直接訪問,就不需要再放在參數列中進行傳遞,少了的運算元就是該物件本身。而過載為友元函式時,友元函式對某個物件的資料進行操作,就必須通過該物件的名稱來進行,因此使用到的引數都要進行傳遞,運算元的個數就不會有變化。
運算子過載的主要優點就是允許改變使用於系統內部的運算子的操作方式,以適應使用者自定義型別的類似運算。
二、 運算子過載為成員函式
對於雙目運算子b,如果要過載b為類的成員函式,使之能夠實現表示式oprd1 b oprd2,其中oprd1為類a的物件,則應當把b過載為a類的成員函式,該函式只有乙個形參,形參的型別是oprd2所屬的型別。經過過載後,表示式oprd1 b oprd2 就相當於函式呼叫oprd1.operator b(oprd2).
對於前置單目運算子u,如「-」(負號)等,如果要過載u為類的成員函式,用來實現表示式u oprd,其中oprd為a類的物件,則u應當過載為a類的成員函式,函式沒有形參。經過過載之後,表示式u oprd相當於函式呼叫oprd.operator u().
對於後置運算子「++」和「- -」,如果要將它們過載為類的成員函式,用來實現表示式oprd++或oprd--,其中oprd為a類的物件,那麼運算子就應當過載為a類的成員函式,這時函式要帶有乙個整型形參。過載之後,表示式oprd++和oprd—就想當於函式呼叫oprd.operator++(0)和oprd.operator—(0);
運算子過載就是賦予已有的運算子多重含義。通過重新定義運算子,使它能夠用於特定類的物件執行特定的功能,這便增強了c++語言的擴充能力。
1. 運算子過載的作用:
運算子過載允許c/c++的運算子在使用者定義型別(類)上擁有乙個使用者定義的意義。
關於string類大概可以重寫的運算子如下:
int m_len; // 字串長度
char *m_p; // 字串資料
};#endif // __mystring_h__
mystring.cpp
#include "mystring.h"
#include #include #include #include using namespace std;
ostream& operator<
istream& operator>>(istream& in, mystring &str)
mystring::mystring()
mystring::mystring(const char *s)
mystring::mystring(int len, char data)
mystring::mystring(const mystring &s)
mystring::~mystring()
}mystring& mystring::operator=(const char *s)
m_len = strlen(s);
m_p = new char [m_len+1];
strcpy(m_p,s);
return *this;
}mystring& mystring::operator=(const mystring &s)
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)
mystring& mystring::operator+(const char *str)
mystring& mystring::operator+(const mystring &s)
mystring& mystring::operator+=(const char *str)
mystring& mystring::operator+=(const mystring &s)
bool mystring::operator==(const char *str) const
return false;
}bool mystring::operator>(const mystring &str) const
return false;
}bool mystring::operator
return false;
}bool mystring::operator
return false;
}
main.cpp
#include "mystring.h"
#include int main()
{ mystring s1;
mystring s2 = "hello";
mystring s3("world");
mystring s4(10);
mystring s5(5,'a');
mystring s6 = s3;
printf("s1:%s,%d\n",s1.c_str2(),s1.leng());
printf("s2:%s,%d\n",s2.c_str2(),s2.leng());
printf("s3:%s,%d\n",s3.c_str2(),s3.leng());
printf("s4:%s,%d\n",s4.c_str2(),s4.leng());
printf("s5:%s,%d\n",s5.c_str2(),s5.leng());
printf("s6:%s,%d\n",s6.c_str2(),s6.leng());
cout<
cout<< s2.c_str2()<> s5;
printf("s5:%s,%d\n",s5.c_str2(),s5.leng());
s5 = s3;
printf("執行s5=s3後,s5:%s,%d\n",s5.c_str2(),s5.leng());
s5 = "hah";
printf("執行s5=hah後,s5:%s,%d\n",s5.c_str2(),s5.leng());
printf("s5[1]=%c\n",s5[1]);
s5 = s5 + "qqq";
printf("執行s5=s5+qqq後,s5:%s,%d\n",s5.c_str2(),s5.leng());
s5 = s5 + s2;
printf("執行s5=s5+s2後,s5:%s,%d\n",s5.c_str2(),s5.leng());
s5 += "aaa";
printf("執行s5+=aaa後,s5:%s,%d\n",s5.c_str2(),s5.leng());
if(s5 == s3)
printf("s5與s3相等\n");
else
printf("s5與s3不相等\n");
if(s5 == s5)
printf("s5與s5相等\n");
else
printf("s5與s5不相等\n");
if(s5 == "aaa")
printf("s5與aaa相等\n");
else
printf("s5與aaa不相等\n");
if(s5 != "aaa")
printf("s5與aaa不相等\n");
else
printf("s5與aaa相等\n");
if(s5 > "aaa")
printf("s5>aaa\n");
else
printf("s5
運算子過載 string類
c 中的運算子除了少數幾個之外,全部可以過載,而且只能過載c 中已有的運算子。過載之後運算子的優先順序和結合性都不會改變。運算子過載是針對新型別資料的實際需要,對原有運算子進行適當的改造。一般來說,過載的功能應當與原有功能相類似,不能改變原運算子的操作物件個數,同時至少要有乙個操作物件是自定義型別。...
String運算子過載
運算子的過載實際是一種特殊的函式過載,必須定義乙個函式,並告訴c 編譯器,當遇到該過載的運算子時呼叫此函式。這個函式叫做運算子過載函式,通常為類的成員函式。定義運算子過載函式的一般格式 返回值型別 類名 operator過載的運算子 參數列 operator是關鍵字,它與過載的運算子一起構成函式名。...
運算子過載 類 C
運算子過載 就是對已有的運算子 c 中預定義的運算子 賦予多重的含義,是同乙個運算子作用與不同型別的資料是導致不同型別的行為 實質 函式過載 1 可以過載為普通函式也可以過載為成員函式 2 把含運算子的表示式轉換成對運算子函式的呼叫 3 把運算子的運算元轉換 成 運算子函式的引數 4 運算子被多次過...