c++運算子過載(簡單易懂)
運算子過載,就是對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別。
你可以重定義或過載大部分 c++ 內建的運算子。例如 + 、 - 、 * 、 / 、
++、–、>>、《等,這樣,你就能使用自定義型別的運算子。
運算子過載的基本格式
過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和
其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個
返回型別和乙個引數列表。
point operator+(
const point &
);
運算子過載有兩種方式:一種是類內過載(運算子過載函式作為類的成員函式),另一種是類外過載(運算子過載函式作為類的友元函式)
#include
using
namespace std;
class
point
; point (
int x,
int y):x
(x),
y(y)
; point operator+(
const point &a)
int x,y;};
intmain()
當上面的**被編譯和執行時,它會產生下列結果:
x :7y:
7
運算子過載是類內過載時,運算子過載函式作為類的成員函式,以上述**為例 a + b 相當於 a 物件呼叫+方法並且傳入引數時 b 物件
#include
using
namespace std;
class
point
; point (
int x,
int y):x
(x),
y(y)
;friend point operator+(
const point &
,const point &);
int x,y;};
point operator+(
const point &a,
const point &b)
intmain()
當上面的**被編譯和執行時,它會產生和上面一樣的結果
各種運算子過載例項
下面將進行各種運算子過載例項的**演示,演示幾種基本的運算子過載。
插入運算子過載》 and 提取運算子過載<<
以提取運算子過載《為例,cout 是 ostream 類的物件。ostream 類和 cout 都是在標頭檔案 中宣告的。ostream 類將《過載為成員函式。
下面我們過載《使用cout輸出a物件
#include
using
namespace std;
class
point
; point (
int x,
int y):x
(x),
y(y)
;friend point operator+(
const point &
,const point &);
friend ostream &
operator
<<
(ostream &out ,
const point &a)
;private
:int x,y;};
point operator+(
const point &a,
const point &b)
ostream &
operator
<<
(ostream &out ,
const point &a)
intmain()
當上面的**被編譯和執行時,它會產生下列結果:
< point>( 7, 7)
注意:過載《時,是類外過載,習慣上人們是使用 cin>> 和 cout<< 的,得使用友元函式來過載運算子,如果使用成員函式來過載會出現 c《另外應該會有人對ostream &operator<<(ostream &out , const point &a)函式感到疑惑,首先在過載《時,返回值型別是ostream&, 第乙個引數也是ostream& 。也就是說,表示式cout《前置運算子過載++ and 後置運算子過載++
#include
using
namespace std;
class
point
; point (
int x,
int y):x
(x),
y(y)
;friend point operator+(
const point &
,const point &);
friend ostream &
operator
<<
(ostream &out ,
const point &a)
; point&
operator++(
)const point operator++(
int)
private
:int x,y;};
point operator+(
const point &a,
const point &b)
ostream &
operator
<<
(ostream &out ,
const point &a)
intmain()
當上面的**被編譯和執行時,它會產生下列結果:
(7,
7)< point>(8
,8)< point>(9
,9)
為區別前置和後置運算子,需要在後置運算子過載函式中加引數「int」,雖然這個型別在此除了以示區別之外並不代表任何實際含義;
前置返回的是變數的引用,後置返回的是常量。所以++++c合法,而c++++不合法;
為什麼不讓c++++也合法呢?如果要實現c++++合法,必須使後置返回變數或變數的引用。c++是先返回c值再+1,所以不可能返回c,那就只能先建立區域性變數來儲存c的初值,然後再返回區域性變數(區域性變數不允許返回引用),但返回了區域性變數之後,如果再連著進行下一次++運算,參與運算的就是這個區域性變數的值了,所以此時c++++其實等效與c++,也就沒有存在的意義了。
定義乙個運算子過載就像定義乙個函式,只不過這個函式名稱以operator關鍵字開頭
// test.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include
#include
using namespace std;
class
test
~test()
;//過載 + 運算子 - * / %運算子類似
const test& operator +
(const test & test)
const
;//最後乙個const表示不會修改當前成員變數的值
//過載賦值運算子
const test& operator =
(const test &test)
; int getvalue()
private
: int m_value;};
test:
:test()
:m_value(0
)test::~
test()
//過載 + 運算子
const test& test:
:operator +
(const test & test)
const
//過載賦值運算子
const test& test:
:operator =
(const test &test)
void
main()
不能過載的運算子:.(點運算子),*(成員指標訪問運算子),::(域運算子),sizeof(長度運算子),?:(三目運算子)過載不能改變運算變數個數
過載不能改變運算子的優先順序
過載不修改運算順序
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...