#define _crt_secure_no_warnings
#include
using namespace std;
//操作符過載除了左移和右移,其他最好定義在類裡
class complex
complex(int a, int b)
//方法2:
complex complexadd2(complex &another)//這只是乙個方法,不是什麼建構函式或者拷貝建構函式
//方法4:
complex operator+(complex &another)
complex &operator=(const complex &another)
complex operator-(complex &another)
complex &operator+=(complex &another)
complex &operator++()
complex operator++(int)
void *operator new(size_t size)
int operator()(int value)
/*//這個中形式是錯誤的,下面一段**的本質意義為c1.operator<<(cout),即為c1 << cout;
//因此「<<」操作符過載不能寫在類的內部,否則呼叫的順序會變反,c1 << cout;
void operator<<(ostream &os)
*/private:
int a;
int b;
};//方法1:
complex complexadd1(complex &c1, complex &c2)
//方法3:操作符過載寫在全域性
//操作符過載寫在全域性時,此操作符不僅包含過載的意義,也包含之前的意義,編譯器會自己去比較操作符兩邊,判斷操作符該不該過載
//操作符只能過載一次,不論是在類裡還是在全域性,都算上也只能過載一次
/*complex operator+(complex &c1, complex &c2)//operator為操作符過載關鍵字,後面跟什麼符號就過載什麼符號,這裡後面跟的是+好,所以過載的是+號操作符
*//*
complex operator-(complex &c1, complex &c2)
*///"+="運算子過載
//全域性時
/*complex &operator+=(complex c1, complex c2)//要區分清什麼時候可以返回引用,什麼時候不可以,區域性變數的時候不可以返回引用,函式結束,變數不被**的物件可以返回引用
*///"++"單目運算子的過載
//全域性時
/*//正常些的時候,等價於++c,前++
complex &operator++(complex c)//全域性時,單目即就其本身乙個引數,雙目就兩個引數
*///後++運算子過載的時候,需要佔位符,且後++運算子不能連加加,但前加加運算子可以連加加
/*complex operator++(complex &c, int)
*///左移操作符過載只能寫在全域性中,不可以寫在類的內部
ostream &operator<<(ostream &os, complex &c)
//右移操作符同樣只能寫在全域性中,不能寫在類的內部
istream &operator>>(istream &is, complex &c)
class student
student(int id, const char *name)
student(int id, int age)
student(const student &another)
else
}student operator+(const student &another)
student &operator=(const student &another)
//2.如果自身開闢了空間,先把開闢的空間釋放
if (this->name != null)
//3.剩下執行深拷貝動作就可以了
this->id = another.id;
this->age = another.age;
if (another.name != null)//這兒的another物件為拷貝temp的匿名物件
return *this;
}//操作符過載也可以過載,因為c++編譯函式時,會編譯函式名,函式引數型別和個數
int operator()(int value)
int operator()(int value1, int value2)
//new和delete操作符也可以過載,但很少過載
//void *和void沒有任何關係,void *表示萬能指標,可以指向任何型別,viod表示沒有型別
void *operator new(size_t size)//typedef unsigned int size_t;size指開闢的空間,這兒的size只是型別大小,由編譯器自動幫我們從型別換為所佔空間大小
void operator delete(void *p)//這是的函式引數為萬能指標,即型別為void *
}~student()
}private:
int id;
int age;
char *name;
};ostream &operator<<(ostream &out, student &s)
class test
test(int a, int b)
test(const test &another)
test &operator=(const test &another)
test operator+(const test &another)
private:
int a;
int b;
};class box
box(int volume)
bool operator&&(const box &another)
else
}bool operator||(const box &another)
else
}private:
int volume;
};int main()
if (b1 || b2)
return 0;
}//操作符過載總結:
//1.左移和右移操作符過載只能寫在類的外面,定義成全域性函式,其他的類裡和類外都可以
//2.有4個操作符不能過載「.」「::」「:?」(條件運算子)「.*」
//3.乙個程式裡一種操作符可以過載多次,在不同類裡的相同操作符過載並不影響,因為類內部操作符過載的作用域只在類內部,肯定不互相影響,編譯器會先從類裡幫我們匹配,再從全域性幫我們匹配
// 在類外部時,相同操作符的過載只要操作符兩邊物件的型別不同時,也不會發生歧義,因為編譯器會自動幫我們匹配操作符兩邊引數型別,進而幫我們唯一匹配到過載的操作符
//4.=號操作符過載,其函式引數一定要用const修飾
//5.對於類內部含有指標的物件進行=號操作符過載,需要先判斷是不是給自己賦值,再判斷本物件的指標指向是否為空,為空則需要先釋放指向的空間,再判斷賦值的物件的指標是否為空,為空就不需要new開闢空間cpy賦值了
和delete操作符也可以過載,new操作符過載函式裡的形參為無符號整形,形引數值為我們傳入型別的大小,編譯器會自動幫我們計算出型別大小並賦值給size,new和delete即使過載了,也會觸發構造和析構函式
//7.不建議過載操作符&&和||,因為過載過的&&和||操作符不能發生短路現象,且沒法解決,因此最好不重寫這兩個操作符
C 操作符過載
1.作為成員過載 class myclass public myclass operator const myclass d cons friend myclass operator const myclass a1,const myclass a2 關於返回值型別的討論 呼叫者堆疊裡返回乙個物件效...
C 過載操作符
過載操作符 一 過載操作符的定義 1.過載操作符的結構 返回型別 operator 需要過載的操作符 形參列表 注意 形引數目應和運算元數目相同。2.過載操作符的幾條注意事項 1 過載的操作符名不能通過連線其他合法符號來建立任何新的操作符。如 2 過載操作符必須具備至少乙個類型別或列舉型別的運算元。...
c 操作符過載
過載操作符 一 限制 1 不能增加新的操作符 2 有些操作符不能過載,如.物件中的訪問成員 作用域解析操作符 sizeof 三元操作符 3 不能改變操作符的元數,元數是指與操作符相關的引數或運算元個數。比如一元操作符 只能應用於乙個操作符 4 不能改變操作符的優先順序 5 不能重新定義內建型別的操作...