C++操作符過載總結operator(小結 更新ing)
阿新 • • 發佈:2018-12-31
#include <iostream> #include<string.h> #include<stdlib.h> using namespace std; /*操作符過載一個原則是:被操作的資料型別,至少有一個是自定義的型別, * 如果被操作的變數都是基本型別,那麼就不能定義操作符過載*/ class mystring { public: char *s; //一元操作符過載 //過載1 mystring operator=(const mystring &it) { memset(s,0,1024); strcpy(s,it.s);return *this; } //過載2 mystring operator+(const mystring &str) { strcat(s,str.s); return *this; } //過載3 mystring operator + (const char *str) { strcat(s,str); return *this; } friend mystring operator + (const char *str,const mystring &it);//過載5 mystring operator +=(const char *str) { strcat(s,str); return *this; } //過載6:<<作為簡單的賦值操作 void operator<<(const char *str) { strcpy(s,str); } //過載7:>>作為簡單的賦值操作 void operator>>(const char *str) { strcpy(str,s); }//過載8:new(必須有空格) /*如果過載了new,則必須過載delete,因為系統知道了你自定義了怎麼new一個空間, * 但是呢你使用delete的時候,系統並不知道怎麼delete你所自定義申請的空間。*/ void * operator new(size_t size) { mystring *p =(mystring *)malloc(size); return p; } //過載9:delete void operator delete(void *obj) { //free(obj) //C:語言不能直接free一個void*型別,他不知道有多大記憶體要釋放 free((mystring*)obj);//使用強制型別轉換 obj=NULL;//防止野指標 } //過載10:new[] void *operator new[](size_t size)//size總比實際分配空間大4個位元組,存放一些系統內部的處理資料,也就是delete[]釋放記憶體所需要的資料 { mystring *p=(mystring *)malloc(size); return p; } //過載10;delete[] void operator delete[](void *obj) { free((mystring*)obj); obj=NULL; } //過載11:==(左邊是自定義類,是一元過載) bool operator==(const mystring &it) { if(strcmp(s,it.s)==0)//判斷二者的字串是否相等。 return true; else { return false; } } //設定友元函式 friend bool operator==(const char* str,const mystring &it); }; /*二元操作符:二元操作符如果操作符左面是類,那麼直接在類裡面實現過載函式即可, 如果左邊是標準變數(標準變數無法呼叫過載函式) 右邊是自定義類,那麼就將過載函式設定為友元函式。 */ //過載4 mystring operator + (const char *str,const mystring &it) { char buf[1024]={0}; mystring str1; sprintf(buf,"%s%s",str,it.s); strcpy(str1,buf); return str1; } //過載12:==(左邊是一個普通的變數型別),定義二元過載函式,在類內部需要設定友元函式 bool operator==(const char* str,const mystring &it) { if(strcmp(str,it.s)==0) return true; else { return false; } } int main() { mystring str1; str1.s="hello"; //使用過載1 mystring str2 = str1; cout<<str2.s<<endl; //使用過載1,2 mystring str3; mystring str4; str4.s=" C++"; str3 = str2 + str4; cout<<str3.s<<endl; //使用操作符3 mystring str5; str5.s="hello5 "; str5=str5+"c++5"; cout<<str5.s<<endl; //使用過載8,9 mystring *str6 = new mystring; delete str6; return 0; }