【C++ 函數重載】

C++ 函數重載

  • ■ C++ 函數重載簡介
  • ■ C++ 運算符重載
    • ■ 一元運算符重載
    • ■ 二元運算符重載 (+,-,*,/)
    • ■ 關系運算符重載 ( < 、 > 、 <= 、 >= 、 == 等等)
    • ■ 輸入/輸出運算符重載(運算符 >> 運算符 << )
    • ■ 賦值運算符重載( = )
    • ■ 函數調用運算符 () 重載
    • ■ 下標運算符 [] 重載
    • ■ 類成員訪問運算符 -> 重載

■ C++ 函數重載簡介

C++ 允許在同一作用域中的某個函數和運算符指定多個定義,分別稱為函數重載和運算符重載。
重載聲明是指一個與之前已經在該作用域內聲明過的函數具有相同名稱的聲明,但是它們的參數列表和定義(實現)不相同。
函數名相同,參數不同;

示例一:函數重載

#include <iostream>
using namespace std; 
class printData
{public:void print(int i) {cout << "整數為: " << i << endl;}void print(double  f) {cout << "浮點數為: " << f << endl;}void print(char c[]) {cout << "字符串為: " << c << endl;}
};int main(void)
{printData pd;// 輸出整數pd.print(5);// 輸出浮點數pd.print(500.263);// 輸出字符串char c[] = "Hello C++";pd.print(c); return 0;
}
會產生下列結果:
整數為: 5
浮點數為: 500.263
字符串為: Hello C++

■ C++ 運算符重載

您可以重定義或重載大部分 C++ 內置的運算符。
函數名是由關鍵字 operator 和其后要重載的運算符符號構成的。
重載運算符有一個返回類型和一個參數列表。

Box operator+(const Box&);     //聲明加法運算符用于把兩個 Box 對象相加,返回最終的 Box 對象

■ 一元運算符重載

一元運算符只對一個操作數進行操作

示例一:

#include <iostream>
using namespace std;class Box
{public:double getVolume(void){return length * breadth * height;}void setLength( double len ){length = len;}void setBreadth( double bre ){breadth = bre;}void setHeight( double hei ){height = hei;}// 重載 + 運算符,用于把兩個 Box 對象相加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;                // 聲明 Box1,類型為 BoxBox Box2;                // 聲明 Box2,類型為 BoxBox Box3;                // 聲明 Box3,類型為 Boxdouble volume = 0.0;     // 把體積存儲在該變量中// Box1 詳述Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0);// Box2 詳述Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0);// Box1 的體積volume = Box1.getVolume();cout << "Volume of Box1 : " << volume <<endl;// Box2 的體積volume = Box2.getVolume();cout << "Volume of Box2 : " << volume <<endl;// 把兩個對象相加,得到 Box3Box3 = Box1 + Box2;// Box3 的體積volume = Box3.getVolume();cout << "Volume of Box3 : " << volume <<endl;return 0;
}
它會產生下列結果:
Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

示例二:一元減運算符,即負號( - )

#include <iostream>
using namespace std;class Distance
{private:int feet;             // 0 到無窮int inches;           // 0 到 12public:// 所需的構造函數Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}// 顯示距離的方法void displayDistance(){cout << "F: " << feet << " I:" << inches <<endl;}// 重載負運算符( - )Distance operator- ()  {feet = -feet;inches = -inches;return Distance(feet, inches);}
};
int main()
{Distance D1(11, 10), D2(-5, 11);-D1;                     // 取相反數D1.displayDistance();    // 距離 D1-D2;                     // 取相反數D2.displayDistance();    // 距離 D2return 0;
}
它會產生下列結果:
F: -11 I:-10
F: 5 I:-11

■ 二元運算符重載 (+,-,*,/)

二元運算符需要兩個參數(+,-,*,/)

示例一:

   // 重載 + 運算符,用于把兩個 Box 對象相加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;}
函數使用:
// 把兩個對象相加,得到 Box3
Box3 = Box1 + Box2;

■ 關系運算符重載 ( < 、 > 、 <= 、 >= 、 == 等等)

C++ 語言支持各種關系運算符( < 、 > 、 <= 、 >= 、 == 等等)

示例一:

#include <iostream>
using namespace std;class Distance
{private:int feet;             // 0 到無窮int inches;           // 0 到 12public:// 所需的構造函數Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}// 顯示距離的方法void displayDistance(){cout << "F: " << feet << " I:" << inches <<endl;}// 重載負運算符( - )Distance operator- ()  {feet = -feet;inches = -inches;return Distance(feet, inches);}// 重載小于運算符( < )bool operator <(const Distance& d){if(feet < d.feet){return true;}if(feet == d.feet && inches < d.inches){return true;}return false;}
};使用:
int main()
{Distance D1(11, 10), D2(5, 11);if( D1 < D2 ){cout << "D1 is less than D2 " << endl;}else{cout << "D2 is less than D1 " << endl;}return 0;
}
它會產生下列結果:
D2 is less than D1

■ 輸入/輸出運算符重載(運算符 >> 運算符 << )

C++ 能夠使用流提取運算符 >> 和流插入運算符 << 來輸入和輸出內置的數據類型。
您可以重載流提取運算符和流插入運算符來操作對象等用戶自定義的數據類型。
示例一:

#include <iostream>
using namespace std;class Distance
{private:int feet;             // 0 到無窮int inches;           // 0 到 12public:// 所需的構造函數Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}friend ostream &operator<<( ostream &output, const Distance &D ){ output << "F : " << D.feet << " I : " << D.inches;return output;            }friend istream &operator>>( istream  &input, Distance &D ){ input >> D.feet >> D.inches;return input;            }
};
int main()
{Distance D1(11, 10), D2(5, 11), D3;cout << "Enter the value of object : " << endl;cin >> D3;cout << "First Distance : " << D1 << endl;cout << "Second Distance :" << D2 << endl;cout << "Third Distance :" << D3 << endl;return 0;
}它會產生下列結果:
$./a.out
Enter the value of object :
70
10
First Distance : F : 11 I : 10
Second Distance :F : 5 I : 11
Third Distance :F : 70 I : 10

■ 賦值運算符重載( = )

用于創建一個對象,比如拷貝構造函數。

示例一:

#include <iostream>
using namespace std; 
class Distance
{private:int feet;             // 0 到無窮int inches;           // 0 到 12public:// 所需的構造函數Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}void operator=(const Distance &D ){ feet = D.feet;inches = D.inches;}// 顯示距離的方法void displayDistance(){cout << "F: " << feet <<  " I:" <<  inches << endl;}};
int main()
{Distance D1(11, 10), D2(5, 11);cout << "First Distance : "; D1.displayDistance();cout << "Second Distance :"; D2.displayDistance();// 使用賦值運算符D1 = D2;cout << "First Distance :"; D1.displayDistance();return 0;
}
它會產生下列結果:
First Distance : F: 11 I:10
Second Distance :F: 5 I:11
First Distance :F: 5 I:11

■ 函數調用運算符 () 重載

函數調用運算符 () 可以被重載用于類的對象。
當重載 () 時,您不是創造了一種新的調用函數的方式,相反地,這是創建一個可以傳遞任意數目參數的運算符函數。

示例一:

#include <iostream>
using namespace std;class Distance
{private:int feet;             // 0 到無窮int inches;           // 0 到 12public:// 所需的構造函數Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}// 重載函數調用運算符Distance operator()(int a, int b, int c){Distance D;// 進行隨機計算D.feet = a + c + 10;D.inches = b + c + 100 ;return D;}// 顯示距離的方法void displayDistance(){cout << "F: " << feet <<  " I:" <<  inches << endl;}      
};
int main()
{Distance D1(11, 10), D2;cout << "First Distance : "; D1.displayDistance();D2 = D1(10, 10, 10); // invoke operator()cout << "Second Distance :"; D2.displayDistance();return 0;
}
它會產生下列結果:
First Distance : F: 11 I:10
Second Distance :F: 30 I:120

■ 下標運算符 [] 重載

下標操作符 [] 通常用于訪問數組元素。
重載該運算符用于增強操作 C++ 數組的功能。

示例一:

#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[](int i){if( i >= SIZE ){cout << "索引超過最大值" <<endl; // 返回第一個元素return arr[0];}return arr[i];}
};
int main()
{safearay A; cout << "A[2] 的值為 : " << A[2] <<endl;cout << "A[5] 的值為 : " << A[5]<<endl;cout << "A[12] 的值為 : " << A[12]<<endl;return 0;
}它會產生下列結果:
$ g++ -o test test.cpp
$ ./test 
A[2] 的值為 : 2
A[5] 的值為 : 5
A[12] 的值為 : 索引超過最大值
0

■ 類成員訪問運算符 -> 重載

類成員訪問運算符( -> )可以被重載,但它較為麻煩。
它被定義用于為一個類賦予"指針"行為。運算符 -> 必須是一個成員函數。
如果使用了 -> 運算符,返回類型必須是指針或者是類的對象。

運算符 -> 通常與指針引用運算符 * 結合使用,用于實現"智能指
示例一:

#include <iostream>
#include <vector>
using namespace std;// 假設一個實際的類
class Obj {static int i, j;
public:void f() const { cout << i++ << endl; }void g() const { cout << j++ << endl; }
};// 靜態成員定義
int Obj::i = 10;
int Obj::j = 12;// 為上面的類實現一個容器
class ObjContainer {vector<Obj*> a;
public:void add(Obj* obj){ a.push_back(obj);  // 調用向量的標準方法}friend class SmartPointer;
};// 實現智能指針,用于訪問類 Obj 的成員
class SmartPointer {ObjContainer oc;int index;
public:SmartPointer(ObjContainer& objc){ oc = objc;index = 0;}// 返回值表示列表結束bool operator++() // 前綴版本{ if(index >= oc.a.size() - 1) return false;if(oc.a[++index] == 0) return false;return true;}bool operator++(int) // 后綴版本{ return operator++();}// 重載運算符 ->Obj* operator->() const {if(!oc.a[index]){cout << "Zero value";return (Obj*)0;}return oc.a[index];}
};int main() {const int sz = 10;Obj o[sz];ObjContainer oc;for(int i = 0; i < sz; i++){oc.add(&o[i]);}SmartPointer sp(oc); // 創建一個迭代器do {sp->f(); // 智能指針調用sp->g();} while(sp++);return 0;
}
當上面的代碼被編譯和執行時,它會產生下列結果:10
12
11
13
12
14
13
15
14
16
15
17
16
18
17
19
18
20
19
21

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

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

相關文章

【嵌入式學習】網絡編程day03.02

一、項目 1、TCP機械臂測試 #include <myhead.h> #define SER_IP "192.168.126.32" #define SER_PORT 8888 #define CER_IP "192.168.126.42" #define CER_PORT 9891 int main(int argc, const char *argv[]) {int wfd-1;//創建套接字if((wfdsocke…

ubuntu創建賬號和samba共享目錄

新建用于登錄Ubuntu圖形界面的用戶 sudo su #切換為root用戶獲取管理員權限用于新建用戶 adduser username #新建用戶&#xff08;例如用戶名為username&#xff09; adduser username sudo #將用戶添加到 sudo 組 新建只能用于命令行下登錄的用戶 sudo su #切換為root用戶…

《TCP/IP詳解 卷一》第8章 ICMPv4 和 ICMPv6

目錄 8.1 引言 8.1.1 在IPv4和IPv6中的封裝 8.2 ICMP 報文 8.2.1 ICMPv4 報文 8.2.2 ICMPv6 報文 8.2.3 處理ICMP報文 8.3 ICMP差錯報文 8.3.1 擴展的ICMP和多部報文 8.3.2 目的不可達和數據包太大 8.3.3 重定向 8.3.4 ICMP 超時 8.3.5 參數問題 8.4 ICMP查詢/信息…

劃分開始結束位置設置標記

劃分開始結束位置 初始音軌如下圖所示 在想開始地方單擊左鍵&#xff0c;長按直到你想要的結束位置松開。就可以劃分開始和結束位置 設置標記 方式1 &#xff1a;直接點擊該圖標 方式二&#xff1a;使用快捷鍵M 設置標記點可以自定義名稱方便檢索標記點

javaWebssh酒店客房管理系統myeclipse開發mysql數據庫MVC模式java編程計算機網頁設計

一、源碼特點 java ssh酒店客房管理系統是一套完善的web設計系統&#xff08;系統采用ssh框架進行設計開發&#xff09;&#xff0c;對理解JSP java編程開發語言有幫助&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;系統主要采用B/S模式開發。開發環境為TOMCAT7.0…

STL容器之string類

文章目錄 STL容器之string類1、 什么是STL2、STL的六大組件3、string類3.1、string類介紹3.2、string類的常用接口說明3.2.1、string類對象的常見構造3.2.2、string類對象的容量操作3.2.3、string類對象的訪問及遍歷操作3.2.4、 string類對象的修改操作3.2.5、 string類非成員函…

車輛維護和燃油里程跟蹤器LubeLogger

什么是 LubeLogger &#xff1f; LubeLogger 是一個自托管、開源、基于網絡的車輛維護和燃油里程跟蹤器。 LubeLogger 比較適合用來跟蹤管理您的汽車的維修、保養、加油的歷史記錄&#xff0c;比用 Excel 強多了 官方提供了在線試用&#xff0c;可以使用用戶名 test 和密碼 123…

oracle-long類型轉clob類型及clob類型字段的導出導入

1、若oracle數據庫表字段類型有long類型&#xff0c;有時候我們需要模糊匹配long類型字段時&#xff0c;是查詢不出來結果的&#xff0c;此時使用TO_LOB&#xff0c;將long類型轉成clob類型&#xff0c;就可以模糊匹配信息。 例如&#xff1a;oracle數據庫查詢所有視圖內容中包…

機器學習-4

文章目錄 前言數組創建切片索引索引遍歷切片編程練習 總結 前言 本篇將介紹數據處理 Numpy 庫的一些基本使用技巧&#xff0c;主要內容包括 Numpy 數組的創建、切片與索引、基本運算、堆疊等等。 數組創建 在 Python 中創建數組有許多的方法&#xff0c;這里我們使用 Numpy 中…

機器學習-5

文章目錄 前言Numpy庫四則運算編程練習 前言 本片將介紹Numpy庫中的四則運算。 Numpy庫四則運算 Numpy庫可以直接進行一些四則運算&#xff0c;快速的處理兩個Numpy數組&#xff1a; a np.array([[1,2,3],[4,5,6]]) b np.array([[4,5,6],[1,2,3]])向量與向量之間 1.加法 …

14.最長公共前綴

題目&#xff1a;編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴&#xff0c;返回空字符串""。 解題思路&#xff1a;橫向掃描&#xff0c;依次遍歷每個字符串&#xff0c;更新最長公共前綴。另一種方法是縱向掃描。縱向掃描時&#xff0c;從前…

基于tomcat的JavaWeb實現

Tomcat服務器 免費&#xff0c;性能一般的服務器 安裝配置 基于Java&#xff0c;故需要配置環境變量&#xff0c;新加系統路徑JAVA_HOME&#xff0c;路徑為jdk的主目錄。 而后打開bin目錄下的startup.bat文件出現如下窗口說明配置成功 idea繼承tomcat服務器 使用java開發…

Linux 之壓縮與解壓相關命令的基礎用法

目錄 1、zip 與 unzip 2、gzip 命令 3、tar 命令 1、zip 與 unzip 在桌面新建一個文件和文件夾用于測試 在 test 目錄下有一個 1.txt 文件 我們使用 zip 命令對其壓縮 用法&#xff1a; zip 自定義壓縮包名 被壓縮文件路徑位置 zip myon.zip 1.txt 因為我們這里就是在 …

linux_day04

大綱&#xff1a;命令&#xff0c;vim&#xff0c;gcc&#xff0c;編譯工具&#xff0c;生成代碼&#xff0c;調試&#xff0c;庫makefile&#xff0c;系統編程 文件系統&#xff1a;文件屬性&#xff0c;文件內容&#xff0c;萬物皆文件&#xff08;不在內存中的是文件&#…

ProtoBuf 是什么?

1. 序列化概念 序列化和反序列化 序列化&#xff1a;把對象轉換為字節序列的過程稱為對象的序列化。 反序列化&#xff1a;把字節序列恢復為對象的過程稱為對象的反序列化。 什么情況下需要序列化 存儲數據&#xff1a;當你想把的內存中的對象狀態保存到?個?件中或者存到數…

怎么壓縮成mp4視頻?

在數字化時代&#xff0c;視頻已經成為我們日常生活中不可或缺的一部分。然而&#xff0c;有時候我們可能會遇到視頻文件太大的問題&#xff0c;不便于傳輸、存儲或分享。那么&#xff0c;如何將視頻壓縮成MP4格式&#xff0c;以減小文件大小呢&#xff1f;本文將為您介紹幾種簡…

docker學習第一步:基于Linux安裝docker!

要求Linux下的CentOS 7.0 以上的版本 01、安裝docker版本倉庫 1、設置倉庫 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2、穩定倉庫 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 現在我也找了很…

醫學大數據|文獻閱讀|有關“胃癌+機器學習”的研究記錄

目錄 1.基于32基因特征構建的機器學習模型可有效預測胃癌患者的預后和治療反應 2.胃癌患者術后90天死亡率的機器學習風險預測模型 3.使用機器學習模型預測幽門螺桿菌根除患者胃癌患病風險 4.利用初始內窺鏡檢查和組織學結果進行個性化胃癌發病率預測 1.基于32基因特征構建的…

隨想錄算法訓練營第四十八天|121. 買賣股票的最佳時機、122.買賣股票的最佳時機II

121. 買賣股票的最佳時機 public class Solution {public int MaxProfit(int[] prices) {int result0;int lowint.MaxValue;for(int i0;i<prices.Length;i){if(prices[i]<low){lowprices[i];}else{resultMath.Max(result,prices[i]-low);}}return result;} } 先遍歷找到…

機器學習_10、集成學習-AdaBoost

AdaBoost AdaBoost&#xff08;Adaptive Boosting的簡稱&#xff09;是一種集成學習方法&#xff0c;它的核心思想在于將多個弱學習器組合起來&#xff0c;形成一個強學習器。通過這種方式&#xff0c;AdaBoost能夠顯著提高分類性能。下面詳細介紹AdaBoost的主要概念和工作原理…