運算子過載的概念:對已有的運算子重新進行定義,賦於其另一種功能,以適應不同的資料型別。
1.加號運算子過載
#include using namespace std;
class person
};//通過全域性函式過載加號運算子
person operator+(person &p1, person &p2)
//運算子過載也可以發生函式過載
person operator+(person &p1, int num) //函式名相同,引數個數相同,型別不同
int main()
;//通過全域性函式過載左移運算子
ostream & operator<<(ostream &cout, person &p)
//前置++運算子的過載
myinteger & operator++()
//後置++運算子的過載
myinteger operator++(int) //佔位符防止函式名相同
private:
int m_num;
};ostream & operator<<(ostream &cout, myinteger &m)
int main()
總結:前置遞增返回引用(目的是一直對乙個資料進行遞增操作),後置遞增返回值。
注:以上遞增運算子過載的**是在visual studio中完成,非dev c++。
4.賦值運算子過載
c++編譯器至少給乙個類新增4個函式:
如果類中有屬性指向堆區,做賦值操作時也會出現深拷貝和淺拷貝帶來的問題(堆區記憶體的重複釋放)
#include using namespace std;
class person
~person()
}//不使用編譯器提供的預設賦值運算子,自己定義過載賦值運算子
//預設
//void operator=(person &p)
//person & operator=(person &p)
//深拷貝
m_age = new int(*p.m_age);
return *this;
}private:
int * m_age;
};void test01()
int main()
總結:在賦值運算子過載時,如果出現連續賦值操作,此時返回值為物件本身;賦值運算子必須為類的成員函式。
注:以上遞增運算子過載的**是在visual studio中完成,非dev c++。
5.關係運算子過載
#include using namespace std;
#include class person
//過載關係運算子==
bool operator==(person &p)
else
}string m_name;
int m_age;
};void test01()
else }
int main()
注:以上遞增運算子過載的**是在visual studio中完成,非dev c++。
6.函式呼叫運算子過載
#include using namespace std;
#include class myprint
};void test01()
{ myadd myadd;
int ret = myadd(10, 10);
cout<注:匿名函式物件的建立,執行完畢後系統立即**匿名物件 。
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...