重載函數和重載運算符

C++允許在同一個作用域中的某個函數和運算符指定多個定義,分別稱為函數重載和運算符重載。

重載聲明是指一個與之前已經在該作用域內聲明過的函數或方法具有相同名稱的聲明,但他們的參數列表和定義(實現)不相同。

當調用一個重載函數或重載運算符時,編譯器通過把函數所使用的參數類型和定義中的參數類型進行比較,決定選用最合適的定義。

選擇最合適的重載函數或重載運算符的過程,稱為重載決策。

?

C++函數重載

在同一個作用域內,可以聲明幾個功能類似的同名函數,但是這些同名函數的形式參數(參數個數,類型或者順序)必須不同,不能僅通過返回類型的不同來重載函數。

/***
overload.cpp
***/
#include<iostream>
using namespace std;class printData
{public:void print(int i){cout << "integer is : " << i << endl;}void print(double f){cout << "flota is : " << f << endl;}void print(char c[]){cout << "char is : " << c << endl;}
};int main()
{printData pd;pd.print(5);pd.print(300.1);char c[] = "hello C++";pd.print(c);return 0;
}

運行結果:

exbot@ubuntu:~/wangqinghe/C++/20190807$ vim overload.cpp

exbot@ubuntu:~/wangqinghe/C++/20190807$ g++ overload.cpp -o overload

exbot@ubuntu:~/wangqinghe/C++/20190807$ ./overload

integer is : 5

flota is : 300.1

char is : hello C++

?

運算符重載:

我們可以重新定義或重在大部分C++內置的運算符。這樣就可以使用自定義的運算符了。

重載的運算符是帶有特殊名稱的函數,函數名是由關鍵字operator和其后要重載的運算符號構成。和其他函數一樣,重載運算符有一個返回類型和一個參數列表。

Box operator+(const Box&);

?

聲明加法運算符用于把兩個Box對象相加,返回最終的的Box對象。大多數重載運算符可被定義為普通的非成員函數或被定義為類成員函數。

如果我們定義上面的的函數為類的非成員函數,那么我們需要為每次操作傳遞兩個參數。如下所示:

Box operator+(const Box&, const Box&);

下面實例中,對象作為參數進行傳遞,對象的屬性使用this運算符進行訪問:

/***

overfun.cpp

***/

#include<iostream>

using namespace std;

?

class Box

{

??? public:

??????? Box(double l = 2.0,double b = 2.0,double h = 2.0)

??????? {

??????????? length = l;

??????????? breadth = b;

??????????? height = h;

??????? }

??????? double getVolume()

??????? {

??????????? return length*breadth*height;

??????? }

??????? Box operator+(const Box& b)

??????? {

??????????? Box box;

??????????? box.length = this->length+b.length;

??????????? box.breadth = this->breadth+b.breadth;

??????????? box.height = this->height + b.height;

??????????? return box;

??????? }

??? private:

??????? double length;

??????? double breadth;

??????? double height;

};

?

int main()

{

??? Box box1(3.3,1.2,1.5);

??? Box box2(8.5,6.0,2.0);

??? Box box3;

??? double volume = 0.0;

?

??? volume = box1.getVolume();

??? cout << "Volume of box1 : " << volume << endl;

?

??? volume = box2.getVolume();

??? cout << "Volume of box2 : " << volume << endl;

?

??? box3 = box1 + box2;

?

??? volume = box3.getVolume();

??? cout << "Volume of box3 : " << volume << endl;

?

??? return 0;

}

運行結果:

exbot@ubuntu:~/wangqinghe/C++/20190808$ g++ overfun.cpp -o overfun

exbot@ubuntu:~/wangqinghe/C++/20190808$ ./overfun

Volume of box1 : 5.94

Volume of box2 : 102

Volume of box3 : 297.36

?

可重載運算符:

雙目算數運算符

+,-,*,/,%

關系運算符

==,!=,<,>,<= ,>=

邏輯運算符

|| , &&? , !

單目運算符

+(正),-(負),*(指針),&(取地址)

自增自減運算符

++,--

位運算符

| , &,~,^, ?<< , >>

賦值運算符

=,+=,-=,*=,/=,%=,&=,|=,^=, <<=,>>=

空間申請與釋放

new,delete,new[].delete[]

其他運算符

() (函數調用),->(成員訪問, ,(逗號),[] (下標)

?

不可重載運算符列表:

.

成員訪問運算符

.*,->*

成員指針訪問運算符

::

域運算符

seizeof

長度運算符

?:

條件運算符

#

預處理符號

Attention

  1. 運算重載符不可以改變語法結構
  2. 運算重載符不可以改變操作數個數
  3. 運算重載付不可以改變優先級
  4. 運算重載符不可以改變結合性

?

類重載、覆蓋、重定義的區別:

重載指的是函數具有不同的參數列表,而函數名相同的函數。重載要求參數列表必須不同,比如參數的類型不同、參數的個數不同,參數的順序不同。因為重載要求參數列表必須不同。(同一類中)

覆蓋是存在類中,子類重寫從基類繼承過來的函數。被重寫的函數不能是static的。必須是virtual的。但函數名、返回值、參數列表都必須和基類相同(發生在基類和子類)。

重定義也叫做隱藏,子類重新定義父類中有相同名稱的非虛函數(參數列表可以不同)。(發生在子類和基類)。

轉載于:https://www.cnblogs.com/wanghao-boke/p/11319273.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384889.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384889.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二元運算符重載

以非成員函數方式重載運算符 /*** overtwo.cpp ***/ #include<iostream> using namespace std;class Box {public:Box(double l 2.0,double b 2.0,double h 2.0){length l;breadth b;height h;}double getVolume(){return length*breadth*height;}private:double l…

一元運算符重載

一元運算符只對一個操作數進行操作&#xff0c;下面是一元運算符實例&#xff1a; 遞增運算符&#xff08;&#xff09; 和遞減運算符&#xff08;--&#xff09;一元減運算符&#xff0c;即符號&#xff08;-&#xff09;邏輯非運算符&#xff08;!&#xff09;/*** overone.c…

關系運算符重載

C語言支持各種關系運算符重載(<,>,>,<,)&#xff0c;他們可用于比較C內置的數據類型。 支持重載任意一個關系運算符&#xff0c;重載后的關系運算符可以用于比較類的對象。 /*** overrealate.cpp ***/ #include<iostream> using namespace std;class Distanc…

kill函數

kill函數/命令產生信號 kill命令產生信號&#xff1a;kill -SIGKILL pid kill函數&#xff1a;給指定進程發送指定信號(不一定殺死) int kill(pid_t pid, int sig); 成功&#xff1a;0&#xff1b;失敗&#xff1a;-1 (ID非法&#xff0c;信號非法&#xff0c;普通用戶殺i…

下標運算符重載

重載該運算符用于增強操作C數組的功能。 /*** subscript.cpp ***/ #include<iostream> using namespace std; const int SIZE 10;class safearay {private:int arr[SIZE];public:safearay(){register int i;for(i 0; i < SIZE ;i){arr[i] i;} }int& operator…

賦值運算符重載

重載賦值運算符&#xff08;&#xff09;&#xff0c;用于創建一個對象&#xff0c;比如拷貝構造函數。 /*** evaluate.cpp ***/ #include<iostream> using namespace std;class Distance {private:int feet;int inches;public:Distance(){feet 0;inches 0;}Distance(i…

運算符小括號重載

函數調用運算符()可以被重用于類的對象。當重載()時&#xff0c;沒有創造一個新的調用函數的方式&#xff0c;相反地&#xff0c;這是創建一個可以傳遞任意數目參數的運算符函數。 /*** bracke.cpp ***/ #include<iostream> using namespace std;class Distance {private…

自增自減運算符重載

遞增運算符&#xff08;&#xff09;和遞減運算符&#xff08;--&#xff09;是C語言中兩個重要的一元運算符。 /*** addMyself.cpp ***/ #include<iostream> using namespace std;class Time {private:int hours;int minutes;public:Time(){hours 0;minutes 0;}Time(i…

輸入輸出運算符重載

C能夠使用流提取運算符>>和流插入運算符<< 來輸入輸出內置數據類型&#xff0c;也可以重載流提取運算符和流插入運算符來操作對象等用戶自定義的數據類型。 我們有時需要把運算符重載函數聲明為類的友元函數&#xff0c;這樣我們就能不用構造對象而直接調用函數。 …

alarm函數

alarm函數 設置定時器(鬧鐘)。在指定seconds后&#xff0c;內核會給當前進程發送14&#xff09;SIGALRM信號。進程收到該信號&#xff0c;默認動作終止。 每個進程都有且只有唯一個定時器。 unsigned int alarm(unsigned int seconds); 返回0或剩余的秒數&#xff0c;無失敗…

信號捕捉

signal函數 注冊一個信號捕捉函數&#xff1a; typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 該函數由ANSI定義&#xff0c;由于歷史原因在不同版本的Unix和不同版本的Linux中可能有不同的行為。因此應該盡量避免使用它&#x…

打印未決信號集

信號集操作函數 內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字mask可以影響未決信號集。而我們可以在應用程序中自定義set來改變mask。已達到屏蔽指定信號的目的。 信號集設定 sigset_t set; // typedef unsigned long sigset_t; int sigemptyset(sigset_…

sigaction()函數

sigaction函數 修改信號處理動作&#xff08;通常在Linux用其來注冊一個信號的捕捉函數&#xff09; int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 成功&#xff1a;0&#xff1b;失敗&#xff1a;-1&#xff0c;設置errno 參數&a…

內核實現信號捕捉原理

信號捕捉特性 進程正常運行時&#xff0c;默認PCB中有一個信號屏蔽字&#xff0c;假定為☆&#xff0c;它決定了進程自動屏蔽哪些信號。當注冊了某個信號捕捉函數&#xff0c;捕捉到該信號以后&#xff0c;要調用該函數。而該函數有可能執行很長時間&#xff0c;在這期間所屏蔽…

pause函數

pause函數 調用該函數可以造成進程主動掛起&#xff0c;等待信號喚醒。調用該系統調用的進程將處于阻塞狀態(主動放棄cpu) 直到有信號遞達將其喚醒。 int pause(void); 返回值&#xff1a;-1 并設置errno為EINTR 返回值&#xff1a; ① 如果信號的默認處理動作是終止進程&a…

SIGCHLD函數

SIGCHLD的產生條件 子進程終止時 子進程接收到SIGSTOP信號停止時 子進程處在停止態&#xff0c;接受到SIGCONT后喚醒時 借助SIGCHLD信號回收子進程 子進程結束運行&#xff0c;其父進程會收到SIGCHLD信號。該信號的默認處理動作是忽略。可以捕捉該信號&#xff0c;在捕捉函數中…

成員訪問控制符重載

類成員訪問運算符&#xff08;->&#xff09;可以被重載&#xff0c;但它比較麻煩它被定義用于為一個類賦予“指針”行為。運算符->必須是一個成員函數。如果使用了->運算符&#xff0c;返回類型必須是指針或者是類的對象。 運算符->通常與指針引用運算符 * 結合使…

C++動態內存

C程序中內存分為兩個部分 棧&#xff1a;在函數內部聲明的所有變量都將占用棧內存。 堆&#xff1a;這是程序中未使用的內存&#xff0c;在程序中可用于動態分配內存。 在很多時候&#xff0c;我們無法提前預知需要多少內存來存儲某個變量的特定信息&#xff0c;所需內存的大小…

文件和流

iostream標準庫提供了cin和cout方法用于標準輸入讀取流和向標準輸出寫入流。 從文件讀取流和向文件寫入流&#xff0c;需要用到fstream庫。它定了三個數據類型 數據類型 描述 ofstream 該數據類型表示輸出文件流&#xff0c;用于創建文件并向文件寫入信息 ifstream 該數據…

C++預處理器

預處理器是一些指令&#xff0c;指示表一起在實際編譯之前所需要完成的預處理。 所有的預處理器指令都是以井號(#)開頭&#xff0c;只有空格字符可以出現在預指令處理之前。預處理指令不是C語句&#xff0c;所以他們不會以分號(;)結尾。 #define預處理 #define預處理指令用于創…