《c++入門經典》筆記5

《c++入門經典》筆記5

第五章 調用函數

5.1函數是什麼

函數是程序的一部分,可對數據執行操做並返回一個值。每一個c++至少有一個函數:main()ios

 

5.2聲明與定義函數

編寫函數代碼前應該聲明該函數,包括返回類型、函數名和形參列表c++

函數定義以前說過了,此處就略了。函數

例如:atom

int getArea(int length,int width);//函數聲明

int getArea(int length,int width)
{
   return length * width;
}//函數定義

 

5.3在函數中使用變量

局部變量與全局變量:spa

局部變量:函數內建立的變量爲局部變量,函數返回後,其全部局部變量都不能供程序使用。內存

全局變量:在c++中,可在函數(包括main()函數)外定義c++變量,這種全局變量在程序的任何地方均可用。函數外定義的變量的做用域爲全局,音詞可在程序的任何函數中使用ci

我認爲,只要是被代碼塊{}所包裹起來的變量都是局部變量,而在代碼塊以外定義的變量則是全局變量作用域

程序清單5.3 Global.cppget

#include <iostream>
void convert();

float fahrenheit;
float celsius;

int main()
{
   std::cout<<"Please enter the temperature in Fahrenheit: ";
   std::cin>>fahrenheit;
   convert();
   std::cout<<"\nHere's the temperature in Celsius: ";
   std::cout<<celsius<<"\n";
   return 0;
}

void convert()
{
   celsius = ((fahrenheit - 32) * 5) / 9;
}

 

5.4函數形參

input

 

5.5從函數返回值

函數返回一個值或void。要從函數返回一個值,可以使用關鍵字return,並在它後面指定要返回的值。這個值能夠是字面量、變量或表達式,由於全部表達式都生成一個值。

程序清單5.4 LeapYear.cpp

#include <iostream>
bool isLeapYear(int year);

int main()
{
   int input;
   std::cout << "Please enter a year: ";
   std::cin >> input;
   if (isLeapYear(input))
       std::cout << input << " is a leap year\n";
   else
       std::cout << input << " is not a leap year\n";
   return 0;
}

bool isLeapYear(int year)
{
   if (year % 4 == 0)
  {
       if (year % 100 == 0)
      {
           if (year % 400 == 0)
               return true;
           else
               return false;
      }
       else
           return true;
  }
   else
       return false;
}

 

5.6默認函數形參

程序清單5.5 AreaCube.cpp

#include <iostream>
int findArea(int length,int width=20,int height = 12);

int main()
{
   int length = 100;
   int width =50;
   int height = 2;
   int area;

   area=findArea(length,width,height);
   std::cout<<"First area: "<<area<<"\n\n";
   area=findArea(length,width);
   std::cout<<"second area: "<<area<<"\n\n";
   area=findArea(length);
   std::cout<<"Third area: "<<area<<"\n\n";
   return 0;
}

int findArea(int length,int width,int height)
{
   return (length * width * height);
}

 

5.7函數重載

c++中,能夠有多個同名函數,只要他們的形參不一樣便可,這稱爲函數重載,又稱函數多態

多個重載版本的返回值能夠相同,也能夠不一樣,然而,不能經過修改返回類型來重載函數,相反,形參類型與形參數量必須不一樣

舉例:

int average(int,int);
long average(long,long);
float average(float,float);//函數定義就不寫了

調用函數average()時,只需傳遞合適的數據,就將調用相應的重載版本。

 

內聯函數:

當定義函數時,c++編譯器只在內存中建立一組指令,每當調用該函數時,都將跳轉到這些指令,而函數返回時,將跳轉到調用代碼的下一行。若是程序調用了函數10次,每次都將跳轉到同一組指令,即只有一個函數指令拷貝,而不是10個。跳轉到函數和返回有必定的開銷,若是函數包含的語句不多,就能夠經過避免跳轉來提升效率。在這種狀況下,經過避免函數調用,程序的運行速度將更快。

聲明c++函數時,若是使用了關鍵字inline,編譯器將不會建立該函數,而將代碼直接複製到調用它的地方,就像您在哪裏輸入了函數的語句同樣。若是該內聯函數被調用和10次,內聯代碼將總共複製10次,細微的速度改善可能因可執行程序的增大而抵消。

要將函數聲明爲內聯的,可在函數原型中使用關鍵字inline。

inline int double(int);

而不用修改函數自己:

int double(int target)
{
   return 2 * target;
}

 

5.8自動肯定返回值類型

c++14新增的功能之一是,使用關鍵字auto讓編譯器自動推斷函數的返回類型

程序清單5.6 AutoCube.cpp

#include <iostream>
auto findArea(int length,int width=20,int height = 12);\

auto findArea(int length,int width,int height)
{
   return (length * width * height);
}

int main()
{
   int length = 100;
   int width =50;
   int height = 2;
   int area;

   area=findArea(length,width,height);
   std::cout<<"First area: "<<area<<"\n\n";
   area=findArea(length,width);
   std::cout<<"second area: "<<area<<"\n\n";
   area=findArea(length);
   std::cout<<"Third area: "<<area<<"\n\n";
   return 0;
}
相關文章
相關標籤/搜索