c 操作符過載

2021-08-20 11:48:59 字數 3803 閱讀 5145

#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 不能重新定義內建型別的操作...