深入學習C++中的函數概念
一個較大的程序不可能完全由一個人從頭至尾地完成,更不可能把所有的內容都放在一個主函數中。為了便于規(guī)劃、組織、編程和調試,一般的做法是把一個大的程序劃分為若干個程序模塊(即程序文件),每一個模塊實現一部分功能。不同的程序模塊可以由不同的人來完成。在程序進行編譯時,以程序模塊為編譯單位,即分別對每一個編譯單位進行編譯。如果發(fā)現錯誤,可以在本程序模塊范圍內查錯并改正。在分別通過編譯后,才進行連接,把各模塊的目標文件以及系統文件連接在一起形成可執(zhí)行文件。
在一個程序文件中可以包含若干個函數。無論把一個程序劃分為多少個程序模塊,只能有一個main函數。程序總是從main函數開始執(zhí)行的。在程序運行過程中,由主函數調用其他函數,其他函數也可以互相調用。在C語言中沒有類和對象,在程序模塊中直接定義函數??梢哉J為,一個C程序是由若干個函數組成的,C語言被認為是面向函數的語言。C++面向過程的程序設計沿用了C語言使用函數的方法。在C++面向對象的程序設計中,主函數以外的函數大多是被封裝在類中的。主函數或其他函數可以通過類對象調用類中的函數。無論是C還是C++,程序中的各項操作基本上都是由函數來實現的,程序編寫者要根據需要編寫一個個函數,每個函數用來實現某一功能。因此,讀者必須掌握函數的概念以及學會設計和使用函數。
“函數”這個名詞是從英文function翻譯過來的,其實function的原意是“功能”。顧名思義,一個函數就是一個功能。
在實際應用的程序中,主函數寫得很簡單,它的作用就是調用各個函數,程序各部分的功能全部都是由各函數實現的。主函數相當于總調度,調動各函數依次實現各項功能。
開發(fā)商和軟件開發(fā)人員將一些常用的功能模塊編寫成函數,放在函數庫中供公共選用。程序開發(fā)人員要善于利用庫函數,以減少重復編寫程序段的工作量。
【例】在主函數中調用其他函數。
#include <iostream> using namespace std; void printstar(void) //定義printstar函數 { cout<<″****************************** ″<<endl; //輸出30個“*” } void print_message(void) //定義print_message函數 { cout<<″Welcome to C++!″<<endl; //輸出一行文字 } int main(void) { printstar( ); //調用printstar 函數 print_message( ); //調用print_message函數 printstar( ); //調用printstar 函數 return 0; }
運行情況如下:
****************************** Welcome to C++! ******************************
從用戶使用的角度看,函數有兩種:
系統函數,即庫函數。這是由編譯系統提供的,用戶不必自己定義這些函數,可以直接使用它們。
用戶自己定義的函數。用以解決用戶的專門需要。
從函數的形式看,函數分兩類:
無參函數。調用函數時不必給出參數。
有參函數。在調用函數時,要給出參數。在主調函數和被調用函數之間有數據傳遞。
函數的定義和調用
定義無參函數的一般形式為:
類型標識符 函數名([void])
{ 聲明部分 語句 }
用類型標識符指定函數的類型,即函數帶回來的值的類型。
定義有參函數的一般形式為:
類型標識符 函數名(形式參數表列) { 聲明部分 語句 }
例如:
int max(int x,int y) //函數首部,函數值為整型,有兩個整型形參 { int z; //函數體中的聲明部分 z=x>y?x:y; //將x和y中的大者的值賦給整型變量z return (z);//將z的值作為函數值返回調用點 }
注意:C++要求在定義函數時必須指定函數的類型。