C++ (第二天上午---函數重載和缺省參數和占位參數)

一、函數重載

1、問題的引入
在實際開發中,有時候我們需要實現幾個功能類似的函數,只是有些細節不同。例如希望交換兩個變量的值,這兩個變量有多種類型,可以是 int、float、char、bool 等,我們需要通過參數把變量的地址傳入函數內部。在C語言中,程序員往往需要分別設計出三個不同名的函數,其函數原型與下面類似:

void swap1(int *a, int *b);      //交換 int 變量的值
void swap2(float *a, float *b);  //交換 float 變量的值
void swap3(char *a, char *b);    //交換 char 變量的值
void swap4(bool *a, bool *b);    //交換 bool 變量的值

那么在C++中,有沒有一種方法,允許多個函數擁有相同的名字,只要它們的參數列表不同就可以呢。
答案:使用函數重載。
2、概念
用相同的函數名定義多個不同的功能稱為函數重載。重載的函數根據參數的個數和類型進行區分,但不能單獨根據返回類型進行區分。
3、例子

void swap(int *a,int *b)
{*a = *a + *b;*b = *a - *b;*a = *a - *b;
}
void swap(float *a,float *b)
{*a = *a + *b;*b = *a - *b;*a = *a - *b;
}
void swap(char *a,char *b)
{*a = *a + *b;*b = *a - *b;*a = *a - *b;
}
void swap(bool *a,bool *b)
{*a = *a + *b;*b = *a - *b;*a = *a - *b;
}

在函數調用的時候會根據不同的參數列表選擇調用對應的函數
4、函數重載的規則

  • 函數名稱必須相同
  • 參數列表必須不同(個數不同、類型不同、參數排列順序不同等)
  • 函數的返回類型可以相同也可以不相同。
  • 僅僅返回類型不同不足以成為函數的重載
    5、函數重載的作用
  • 解決函數名字資源問題
  • 函數調用的時候很方便,自動根據不同的參數調用不同函數(靜態多態-編譯時候多態)
    6、注意
    在c++中編譯器會檢查函數名稱和參數列表, 在c語言中編譯器只檢查函數名稱
    7、函數重載原理
    在這里插入圖片描述
    總結:返回值不一樣不能實現函數重載
    const參數能實現函數重載

二、函數默認參數(缺省實參)和占位參數

1、概念
在聲明函數的時候可以賦予函數參數默認值。所謂默認值就是在調用時,可以不寫某些參數的值,編譯器會自動把默認值傳遞給調用語句中。
2、特點

  • 如果函數的聲明和定義是分開的,必須在聲明的時候設置默認值,不可以在定義的時候設置默認值;
  • 不能將實際值傳遞給引用類型的參數。可以將變量作引用類型參數的默認值,這時變量必須是已經聲明且是全局變量
#include<iostream>using namespace std;int g_val = 10;//默認值是在函數聲明的時候進行設置
int func(int a=10);
//不能將實際值傳遞給引用類型的參數。可以將變量作引用類型參數的默認值,這時變量必須是已經聲明且是全局變量 
//int rfunc(int &a=10); --除非 const int &a=10
int rfunc(int &a=g_val);int main()
{func();return 0;
}
//如果函數的定義和聲明是分開的,那么函數定義的時候不能設置默認值,而是在聲明的時候進行設置
int func(int a)
{cout<<"a:"<<a<<endl;
}
int rfunc(int &a)
{cout<<"a:"<<a<<endl;
}
  • 若給某一參數設置了默認值,那么在參數表中其后所有的參數都必須也設置默認值
如果多參數默認,必須滿足從右往左連續默認
void fun(int a, int b=9, int c=1); 允許
void fun(int a=1, int b, int c=2); 不允許

3、占位參數
占位參數:跟默認參數不同,在函數定義時,形參只寫類型,不寫形參變量名
語法:

返回值類型  函數名(type ) //type --- int char
{}
占位參數的使用場景比較少,只在運算符重載中可以應用
void test(int) //占位參數
{}
void test1(char) //占位參數
{}
int main()
{int b = 10;test(b); //帶占位參數的函數調用時,要傳入對應類型的參數值return
}

練習5:使用鏈表設計一個錄入學生信息的函數(參數為學生信息)(輸入信息有個學號,姓名,年齡,班級 參數順序自定),結合函數重載和默認參數的特點,設計的時候使后期使用更方便

#include <iostream>
#include <cstring>/* 練習2:設計一個錄入學生信息的函數(參數就是學生信息)
(輸入的時候有姓名、年齡、班級...),結合函數重載和默認參數的特點
設計出來的程序使用的時候 更加方便 */using namespace std;enum MODE
{ADD, //增加SHOW,    //顯示EXIT    //退出
};struct student{char name[256];int age;char classes[256];//班級
};//單向非循環鏈表
typedef struct node{struct student info;//數據域struct node *next;//指針域
}Node_t;//鏈表的頭結點
typedef struct list{Node_t *head;//數據的首結點Node_t *tail;//數據的尾結點int nodeNumber;//鏈表中結點的個數
}List_t;List_t *create_list()
{//1、申請一個頭結點的內存空間List_t *list = new List_t;list->head = list->tail = NULL;list->nodeNumber = 0;return list;
}void insert_nodeToList_tail(List_t *list,const char *name,const int age=21,const char *classes="gz2166")
{if(list==NULL)return ;//1、新建數據結點Node_t *newNode = new Node_t;//2、初始化strcpy(newNode->info.name,name);newNode->info.age = age;strcpy(newNode->info.classes,classes);newNode->next = NULL;//3、將新建的結點插入到鏈表中if(list->head == NULL) //從無到有{list->head = newNode;list->tail = newNode;}else{ //從少到多  ---尾插法//當前尾結點的next指向新結點list->tail->next = newNode;//更新尾結點list->tail = newNode;}list->nodeNumber++;}void print_allToList(List_t *list)
{Node_t *p = list->head;cout<<"姓名\t\t"<<"年齡\t"<<"班級\t"<<endl;while(p){cout<<p->info.name<<"\t\t"<<p->info.age<<"\t"<<p->info.classes<<"\t\t"<<endl;p = p->next;}
}int main()
{List_t *list = create_list();insert_nodeToList_tail(list,"zhang3",22);insert_nodeToList_tail(list,"li4");insert_nodeToList_tail(list,"laowang",23,"gz2169");print_allToList(list);return 0;
}

四、函數重載與函數默認參數
思考:假如一個程序中有如下兩個函數

void test()
{
}
void test(int x=10)
{
}
調用:
test(11);//調用 的是:void test(int x=10)
test();//調用的是???歧義

答案:有歧義,解決方法:可以定義命名空間

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

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

相關文章

Executors 提供了哪些創建線程池的方法?

java.util.concurrent.Executors 是一個工廠類&#xff0c;提供了一些靜態方法來創建各種類型的線程池。這些方法簡單易用&#xff0c;可以快速創建常見的線程池類型。以下是 Executors 提供的主要創建線程池的方法及其特性&#xff1a; 1. newFixedThreadPool(int nThreads) …

計算機系統基礎(二)

1.數值數據的表示 為什么采用二進制&#xff1f; 二進制只有兩種基本狀態&#xff0c;兩個物理器件就可以表示0和1二進制的編碼、技術、運算規則都很簡單0和1與邏輯命題的真假對應&#xff0c;方便通過邏輯門電路實現算術運算 數值數據表示的三要素 進位記數制&#xff08;十…

以太網常用協議——ARP協議

文章目錄 一、 ARP協議與MAC層1.TCP/IP協議2. MAC地址3. ARP映射4. ARP請求和ARP應答 二、以太網幀格式三、ARP協議1. 以太網ARP通信測試&#xff1a; 以太網使用的協議很多&#xff0c;常用的有ARP、UDP等。 再介紹具體協議之前需要先知道一些基本的概念&#xff1a; 一、 AR…

COB顯示屏與GOB顯示屏封裝方式有哪些不同?

很多用戶因為使用場景的特殊性&#xff0c;所以會選擇防護能力更強的COB顯示屏或者是GOB顯示屏&#xff0c;兩種產品從名稱上看只是有一個字母的懸殊&#xff0c;其實使用的工藝截然不同&#xff0c;GOB顯示屏通常是在SMD顯示屏的基礎上進行升級&#xff0c;而COB顯示屏則是完全…

獨立開發者系列(15)——git的使用

上一篇14文章觸發了敏感話題&#xff0c;直接未過審核&#xff0c;看來技術博客也有敏感點。 大部分情況下&#xff0c;獨立項目是你一個人開發&#xff0c;但是當你接的項目比較大的時候&#xff0c;你需要其他人的幫忙&#xff0c;這個時候你要把代碼分享給別人。因為如果你…

【分布式數據倉庫Hive】Hive的安裝配置及測試

目錄 一、數據庫MySQL安裝 1. 檢查操作系統是否有MySQL安裝殘留 2. 刪除殘留的MySQL安裝&#xff08;使用yum&#xff09; 3. 安裝MySQL依賴包、客戶端和服務器 4. MySQL登錄賬戶root設置密碼&#xff0c;密碼值自定義&#xff0c;這里是‘abc1234’ 5. 啟動MySQL服務 6…

maven設置阿里云鏡像源(加速)

一、settings.xml介紹 settings.xml是maven的全局配置文件&#xff0c;maven的配置文件存在三個地方 項目中的pom.xml&#xff0c;這個是pom.xml所在項目的局部配置文件用戶配置&#xff1a;${user.home}/.m2/settings.xml全局配置&#xff1a;${M2_HOME}/conf/settings.xml 優…

YOLOV10訓練集制作+Train+Val記錄

代碼地址&#xff1a;THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection (github.com) 一、數據制作 在這篇文章有講過如何制作數據集及代碼實現 YOLOV9訓練集制作TrainVal記錄_yolov9 train yaml-CSDN博客 二、配置文件 &#xff08;1&#xff09;代碼結構…

“私域流量:解鎖電商新機遇,共創數字化未來“

一、私域流量的戰略意義再探 步入數字化浪潮的深處&#xff0c;流量已成為企業成長不可或缺的血液。與廣泛但難以掌控的公域流量相比&#xff0c;私域流量以其獨特的專屬性和復用潛力&#xff0c;為企業鋪設了通往深度用戶關系的橋梁。它不僅賦能企業實現精準營銷&#xff0c;…

國產跨平臺高性能遠程控制軟件 RayLink,暢享高清流暢遠程辦公

不管是手機還是電腦&#xff0c;出色的硬件是好用的基礎。而其中的軟件工具&#xff0c;也是提高效率、減輕負擔的好東西。 免費的軟件工具眾多&#xff0c;當然付費工具也不少。大家可能會覺得正版軟件很貴&#xff0c;但國內軟件代理商的價格其實很實惠。 本次為大家介紹一…

CF1375D Replace by MEX 題解

題目大意 令 m e x mex mex 為序列中最小的沒有出現的數。 給你一個長度為 n n n 的序列 a a a&#xff0c;你可以進行不超過 2 n 2\times n 2n 次操作&#xff0c;使得序列 a a a 單調不降。每次操作你可以選定一個位置 p p p&#xff0c;并將 a p a_p ap? 賦值為 …

一文看盡AI繪畫工具 Stable Diffusion發展史,AI繪畫究竟發展到什么地步了?!

01、引言 Stable Diffusion 在短短兩年內發布了多個版本。最著名的版本是 1.5 和 SDXL。不過&#xff0c;還有許多其他版本值得一提。讓我們一起來探索穩定擴散模型的起源和發展。 閑話少說&#xff0c;我們直接開始吧&#xff01; 02、缺失的SD V1.0版本 Stable Diffusion…

材質相關內容整理 -ThreeJs

在Three.js中&#xff0c;材質是用來定義3D對象外觀的關鍵部分。Three.js支持多種材質文件和類型&#xff0c;每種材質都有其特定的用途和優勢。下面簡單整理了一下目前Three.js支持的材質文件和類型。 一、Three.js支持的材質文件類型 JPEG (.jpg) 和 PNG (.png) 用途&#x…

iphone新機官網驗機流程

若您想購買新款iPhone并在官方網站上驗證機器的真實性&#xff0c;可以按照以下流程進行&#xff1a; 打開蘋果官方網站&#xff08;https://www.apple.com&#xff09;。在導航欄中選擇“iPhone”選項&#xff0c;進入iPhone的產品頁面。在頁面中找到您想要購買的新款iPhone&…

C語言快速學習筆記

學習網站&#xff1a;C 語言教程 | 菜鳥教程 (runoob.com)C 語言教程 | 菜鳥教程 (runoob.com)C 語言教程 | 菜鳥教程 (runoob.com) 這個網站知識完整&#xff0c;講解清晰。 在線C語言編程工具&#xff1a;菜鳥教程在線編輯器 (runoob.com) 國外學習網站&#xff1a;C語言介…

【機器學習】機器學習的重要方法——線性回歸算法深度探索與未來展望

歡迎來到 破曉的歷程博客 引言 在數據科學日益重要的今天&#xff0c;線性回歸算法以其簡單、直觀和強大的預測能力&#xff0c;成為了眾多領域中的基礎工具。本文將詳細介紹線性回歸的基本概念、核心算法&#xff0c;并通過五個具體的使用示例來展示其應用&#xff0c;同時探…

使用conda創建虛擬環境,并將虛擬環境加載到jupyter notebook中【已解決】

使用conda創建虛擬環境&#xff0c;并將虛擬環境加載到jupyter notebook中【已解決】

免費分享:2000-2021年全國分省250mNDVI數據集(附下載方法)

NDVI (Normalized Difference Vegetation Index)歸一化植被指數&#xff0c;又稱標準化植被指數。是目前應用最廣泛的植被指數&#xff0c;與植被的分布呈線性相關&#xff0c;是植被生長狀態和空間分布的最佳指示因子&#xff0c;也是遙感估算植被覆蓋度(FVC&#xff0c;Fract…

深入學習 Kafka(2)- Partition 和 Topic

1. Partition的作用 Topic是邏輯的概念&#xff0c;Partition是物理的概念&#xff1a; Partition 對一個 Topic 的消息進行物理上的分離&#xff0c;讓消息可以分布在不同的實體機器上&#xff0c;可以提升系統吞吐量和并行處理能力。每個Partition可以有多個副本&#xff08…

交換機06_vlantrunk

一、虛擬局域網vlan 目的&#xff1a;劃分廣播域 思科設備如何去配置vlan 創建vlan設置對應的接口模式將接口加入vlan全局模式配置vlan vlan 2 設置接口模式&#xff08;目前需要將接口加入對應vlan&#xff0c;一般用于連接PC&#xff09; en conf t int f0/0 switchport m…