程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> C++語言基礎-函數規則

C++語言基礎-函數規則

編輯:vc教程

· 函數可以取任意多個參數或不取參數。
· 函數可以返回一個值,但函數不強求返回一個值。
· 如果函數返回void類型,則不能返回數值。
如果要讓返回void類型的函數返回數值,則會發生編譯錯誤。返回void類型的函數不需包含return語句,但也可以包含這個語句。如果沒有return語句,則函數到達末尾的結束大括號時自動返回。
· 如果函數原型表示函數返回數值,則函數體中應包含返回數值的return語句,如果函數不返回數值,則會發生編譯錯誤。
· 函數可以取任意多個參數,但只能返回一個數值。
· 變量可以按數值、指針或引用傳遞給函數(將在稍後介紹)。
語法:函數語句的聲明(原型)格式如下: ret_type function_name(argtype_1 arg_1,argtype_2 arg_2,...,argtype_n arg_n);
函數聲明表示代碼中要包括的函數,應當顯示函數的返回數據類型(ret_type)和函數名(function_name),表示函數所要數據變元的順序(arg_1,arg_2,...,arg_n)和類型(argtype_1,argtype_2,...argtype_n)。
函數語句的定義格式如下:
ret_type function_name(argtype_1 arg_1,argtype_2 arg_2,...,argtype_narg_n);
{ statements;
return ret_type; }
函數定義表示構成函數的代碼塊(statements),應當顯示函數的返回數據類型(ret type)和函數名(function_name),包括函數所要數據變元(arg_1,arg_2,...,arg_n)和類型(argtype_1,argtype_2,...argtype_n)。

main()函數
C++程序必須有main()函數。main()函數是程序的入口點。前面介紹的每個樣本程序都有main()函數。但是,並非所有C++程序都有傳統的main()函數。用C或C++寫成的Windows程序入口點函數稱為WinMain(),而不是傳統的main()函數。說明 C++ Builder GUI應用程序有WinMain(),但隱藏起來了。C++ Builder使用戶無需考慮Windows程序的低級細節,而可以集中考慮程序用戶界面和其它部分的創建。main()函數和其它函數一樣是函數,有相同的構成部分。在32位控制台應用程序中,C++ Builder生成具有下列原型的缺省main()函數:int main(int argc,char** argv);這個main()函數形式取兩個參數並返回一個整型值。前面說過,數值在調用函數時傳遞給函數。但對於main()函數,沒有直接調用,而是在程序運行時自動執行。那麼,main()函數如何取得參數呢?辦法是從命令行取得。現說明如下:假設有個Win32控制台應用程序要在DOS提示下用下列命令行執行:grep WM_KILLFOCUS 杁 -i
這裡要用命令行變元WM_KILLFOCUS、d和i啟動程序grep,我們要演示如何在main()函數中將其變為argc和argv.首先,整型變量argc包含命令行中傳遞的參數個數,至少為1,因為程序名也算作參數。變量argv是個數組,包含字串的指針。這個數組包含命令行中傳遞的每個字串。本例中:
argc包含4
argv[0] 包含C:|cbuilder|bin|grep.exe
argv[1] 包含WM_KILLFOCUS
argv[2] 包含 d
argv[3] 包含 i
下面用一個小程序驗證這個事實。在C++ Builder中生成新的控制台應用程序並輸入清單1.5所示的程序。清單1.5Argstest.cpp
1: #include <iostream.h>
2: #include <conio.h>
3: #pragma hdrstop
4:
5: int main(int argc,char **argv)
6: {
7:cout << "argv = "argc << end1;
8.for (int i=0;i<argc;i++)
9. cout << "Parameter " << i << ": " << argv[i]<< end1;
10. cout << end1 << "Press any key to continue...";
11: getch();
12: return 0;
13: }
將這個項目存為Argstest,然後不是單擊Run按鈕,而是選擇主菜單中的Project|Build All,這樣只建立項目而不執行程序。項目建成後,選擇主菜單中的Run|Parameters,在RunParameters對話框RunParameters字段中輸入下列內容:one two three "four five" six然後單擊Run按鈕,程序即用所指定的命令行參數運行。另一種辦法是用下列命令行在DOS提示下運行程序:argstest one two three "four five" six程序運行時,它會顯示傳入的變元數,然後列出每個變元。運行幾次,每次提供不同命令行變元,注意產生的結果。
大多數程序中main()函數的返回值並不重要,因為通常不使用返回值。事實上,可以不要求main()函數返回數值。main()函數的形式有多種,下列聲明均有效:main();int main();// same as above
int main(void); // same as above
int main(int argc,char** argv);
void main();
void main(int argc, char** argv);
還有更多的形式。如果不想使用命令行變元,則可以用第一種main()函數形式,其不取參數(括號內為空的)並返回一個int(不指定時返回缺省返回值)。換句話說main()函數最基本的形式不取參數並返回一個int。

數組
任何C++固有數據類型都可以放進數組中。數組(array)就是數值的集合。例如,假設要保存一個整型數組,放五個整型值。可以聲明數組如下:int myArray[5];這裡編譯器為數組分配圖1.7所示的內存空間。由於每個int要4個字節存儲,所以整個數組占用20字節的內存空間。
mArray[0]mArray[1]mArray[2]mArray[3]
mArray[4]
baseAddrbasseAddr+4baseAddr+8
baseAddr+12baseAddr+16
聲明數組後,就可以用如下腳標操作符([])填入數值:
myArray[0] = -200;
myArray[1] = -100;
myArray[2] = 0;
myArray[3] = 100;
myArray[4] = 200;
由上可見,C++中的數組是以0為基數的。後面程序中可以用腳標操作符訪問數組的各個元素:
int result=myarray[3]+myArray[4]; // result will be 300
還有一次聲明和填入整個數組內容的簡捷方法如下:
int myArray[5] = {-200, -100,0,100,200};
進一步說,如果知道數組的元素個數,並在聲明數組時填充數組,則聲明數組時連數組長度都可以省略。例如:int myArray[] = {-200, -100,0,100,200 };這是可行的,因為編譯器從賦予的數值表可以判斷出數組中元素的個數和分配給數組的內存空間。
數組可以是多維的。為了生成兩維整型數組,可用下列代碼:
int mdArray[3][5];
這樣就分配15個int空間(共60字節)。數組的元素可以和一維數組一樣訪問,只是要提供兩個腳標操作符:int x = mdArray[1][1]+mdArray[2][1];
圖1.8兩維數組在內存中的樣子警告 注意不要重載數組末尾。
C++一個強大的特性是能直接訪問內存。由於這個特性,C++無法阻止你寫入特定內存地址,即使這個地址是程序不讓訪問的。下列代碼是合法的,但會導致程序或Windows崩潰:int array[5];array[5]=10;這是常見的錯誤,因為數組是以0為基數的,最大腳標應是4而不是5。如果重載數組末尾,則無法知道哪個內存被改寫了,使結果難以預料,甚至會導致程序或Windows崩潰。這類問題很難診斷,因為受影響的內存通常要在很久以後才訪問,這時才發生崩潰(讓你莫名其中之妙)。所以寫入數組時一定要小心。
數組規則
·數組是以0為基數。數組中的第一個元素為0,第二個元素為1,第三個元素為2,等等。
·數組長度應為編譯常量。編譯器在編譯時必須知道為數組分配多少內存空間。不能用變量指定數組長度。所以下列代碼不合法,會導致編譯錯誤:
int x = 10;int myArray[x]; // compiler error here·
小心不要重載數組末尾。
· 大數組從堆疊(heap)而不是堆棧(stack)中分配(詳見稍後)。· 從堆疊分配的數組可以用變量指定數組長度。例如:int x = 10;int* myArray = new int[x]; // this is OK

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved