C++函數重載

1、函數重載的概念

在實際開發中,有時候咱們須要實現幾個功能相似的函數,例如把變量的值寫入文件,變量的類型多是int、long、double、char,經過參數把變量傳入函數。在C語言中不容許函數同名,程序員只能設計出四個不一樣名的函數,其函數聲明以下:程序員

bool writetofile_int(char *filename,int value);  // 寫入int
  bool writetofile_long(char *filename,long value);  // 寫入long
  bool writetofile_double(char *filename,double value); // 寫入double
  bool writetofile_char(char *filename,char *value); // 寫入char字符串

C語言中函數命名不能重複對程序員是一種負擔,編程序的時候須要想象出相近的函數名,調用函數的時候,書寫函數名也是一件麻煩的事情。編程

C++容許多個函數擁有相同的名字,只要它們的參數列表不一樣就能夠,這就是函數的重載(Function Overloading),藉助重載,多個功能相近的一系列函數可使用同一函數名。ide

函數的參數列表包括參數的類型、參數的個數和參數的順序,只要有一個不一樣就叫作參數列表不一樣。函數

使用C++函數重載,把變量的值寫入文件的函數聲明修改以下:學習

bool writetofile(char *filename,int value);     // 寫入int
  bool writetofile(char *filename,long value);   // 寫入long
  bool writetofile(char *filename,double value); // 寫入double
  bool writetofile(char *filename,char *value);   // 寫入char字符串

重載就是在一個做用範圍內(同一個程序、同一個類、同一個命名空間等)有多個名稱相同但參數列表不一樣的一系列函數。測試

在使用重載函數時,同名函數的功能應當類似,不要用相同名稱的函數名去實現不相干的功能,雖然程序也能運行,但可讀性很差,令人以爲莫名其妙。.net

注意,參數列表不一樣包括參數的個數不一樣、類型不一樣或順序不一樣,僅僅參數名稱不一樣是不能夠的,函數返回值也不能做爲重載的依據。設計

2、C++ 是如何作到函數重載的

編譯器在編譯C++程序時會根據參數列表對函數進行重命名,例如:3d

bool writetofile(char *filename,int value);

重命名爲code

bool _writetofile_char_int(char *filename,int value);
bool writetofile(char *filename,long value);

重命名爲

bool _writetofile_char_long(char *filename,long value);

程序被編譯時,編譯器會根據參數列表逐個匹配,選擇對應的函數,若是匹配失敗,編譯器就會報錯,這叫作重載決議(Overload Resolution)。

因此,函數重載僅僅是語法層面的,本質上它們仍是不一樣的函數,佔用不一樣的內存,入口地址也不同。

3、函數重載的示例

咱們在介紹C語言字符串的時候,學習了strcpy函數。

char *strcpy(char *dest, const char *src);

strcpy函數有兩個缺陷:1)沒有對dest變量進行初始化;2)若是src的長度超過dest,會形成內存溢出。

咱們如今來重寫strcpy函數,彌補這兩個缺陷,新函數名仍是採用strcpy命名,但參數列表不一樣,聲明以下:

char *strcpy(char *dest, const char *src,size_t destsize);

dest和src參數的含義與庫函數strcpy相同,第三個參數destsize是dest佔用內存的大小。

示例(book201.cpp)

/*
 * 程序名:book201.cpp,此程序用於演示C++函數重載,修復strcpy函數的缺陷
 * 做者:C語言技術網(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>

// 重載strcpy函數,對dest初始化,防止內存溢出。
char *strcpy(char *dest, const char *src,size_t destsize);

int main()
{
  char dest[10];

  strcpy(dest,"www.freecplus.net",sizeof(dest));  // 新strcpy
  printf("=%s=\n",dest);

  strcpy(dest,"www.freecplus.net");   // 舊strcpy
  printf("=%s=\n",dest);
}

// 重載strcpy函數,對dest初始化,防止內存溢出
char *strcpy(char *dest, const char *src,size_t destsize)
{
  memset(dest,0,destsize);  // 對dest初始化

  // 計算須要複製的字符數,不能超出destsize-1
  size_t len=0;
  if (strlen(src)<=destsize-1) len=strlen(src);
  else len=destsize-1;

  strncpy(dest,src,len);   // 複製字符串,超出的將扔掉
  dest[len]=0;  // 強制字符串的結尾標誌

  return dest;
}

運行效果

在這裏插入圖片描述

C語言提供了一些庫函數,這些庫函數的功能確定不能知足實際開發的需求,須要程序員從新擴展加固,這是優秀程序員與普通程序員的差異。

4、課後做業

1)編寫示例程序,把本章節介紹的知識點所有演示一遍,用程序演示能夠加深您的理解和映象。

2)編寫示例程序,測試函數的返回值不一樣可否做爲函數重載的依據。

3)編寫示例程序,測試函數的參數名不一樣可否做爲函數重載的依據。

5、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、做者和原文的連接。
來源:C語言技術網(www.freecplus.net)
做者:碼農有道

若是這篇文章對您有幫助,請點贊支持,或在您的博客中轉發個人文章,謝謝!!!若是文章有錯別字,或者內容有錯誤,或其餘的建議和意見,請您留言指正,很是感謝!!!

相關文章
相關標籤/搜索