




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第2章 VC程序基礎(chǔ)——
變量與函數(shù)
2.1變量的生存期與作用域
2.2指針與引用
2.3函數(shù)的聲明與調(diào)用
2.4函數(shù)參數(shù)的傳遞
本章從變量的五個(gè)要素著手,圍繞它講了變量的各種生存期和作用域。另外還對(duì)一種特殊的變量——地址變量進(jìn)行了講解。本章主要講了與函數(shù)有關(guān)的定義、實(shí)現(xiàn)以及調(diào)用的三種方式。掌握了變量與函數(shù),就把程序設(shè)計(jì)的基本把握住了,因此本章屬于VC程序設(shè)計(jì)的基礎(chǔ)知識(shí)。
2022/11/181第2章 VC程序基礎(chǔ)——
變量與函數(shù)2.1變量的生存
2.1變量的生存期與作用域
2.1.1變量的五要素
2.1.2VC程序的存儲(chǔ)組織
2.1.3變量作用域及其分類
2.1.4一個(gè)VC多文件應(yīng)用程序的實(shí)現(xiàn)
2.1.5變量生存期及其分類
2.1.6VC中的數(shù)據(jù)類型2022/11/182
2.1變量的生存期與作用域
2022/11/1122.1.1 變量的五要素1.變量的名稱2.變量的數(shù)據(jù)類型3.變量的值4.變量的地址5.變量的存儲(chǔ)類型2022/11/1832.1.1 變量的五要素1.變量的名稱2022/11/1132.1.2 VC程序的存儲(chǔ)組織 一個(gè)VC程序編譯運(yùn)行后,將其對(duì)應(yīng)的目標(biāo)代碼調(diào)到內(nèi)存中。目標(biāo)代碼主要包含操作符和操作數(shù),其中操作符存放在代碼區(qū),程序中處理的數(shù)據(jù)(操作數(shù))分別存放在靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)。
一個(gè)VC程序可以使用的存儲(chǔ)空間分為如下三個(gè)部分:
代碼區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)
2022/11/1842.1.2 VC程序的存儲(chǔ)組織 一個(gè)VC程序編譯運(yùn)行后,
變量的作用域是指在程序中變量的有效區(qū)域,它是變量的活動(dòng)空間?!拌F路警察各管一段”,描述的就是鐵路警察這些變量的作用域?yàn)楦髯缘囊欢?。在VC中,變量的作用域有六種,從其作用范圍的大小由小到大依次為:塊作用域、函數(shù)作用域、類作用域、命名空間作用域、文件作用域、程序作用域。變量的作用域取決于變量的位置與聲明的方式。2.1.3變量作用域及其分 2022/11/185變量的作用域是指在程序中變量的有效區(qū)域,它是變量1.塊作用域
塊指的是由一對(duì)“{”、“}”括起來的程序段。在塊中聲明的變量具有塊作用域,其作用域從聲明處開始,一直到塊結(jié)束的花括號(hào)為止。復(fù)合語句也是一個(gè)塊,例如if語句中定義的變量只能在if語句中使用,for語句中定義的變量,包括括號(hào)表達(dá)式中定義的變量,只能在for語句中使用。下面演示塊作用域的實(shí)例:
2022/11/1861.塊作用域塊指的是由一對(duì)“{”、“}”括起來的程序段。在【例2-1】演示塊作用域的實(shí)例:輸入兩個(gè)數(shù)將由大到小的順序保存,并輸出結(jié)果
#include"iostream.h"#include<iomanip.h>voidmain(){ intx,y; cout<<"請(qǐng)輸入兩個(gè)整數(shù):"<<endl; cin>>x>>y; if(x<=y)//x中保存較大的數(shù),y中保存較小的數(shù) {
intt;//t為臨時(shí)變量,其作用域?yàn)閴K作用域
t=x;//交換x與y的值
x=y; y=t; } cout<<"x="<<setw(6)<<x<<"y="<<setw(6)<<y<<endl;//setw(6)設(shè)置顯示的寬度為6個(gè)字符}2022/11/187【例2-1】演示塊作用域的實(shí)例:輸入兩個(gè)數(shù)將由大到小的順序保2.函數(shù)作用域函數(shù)作用域是在某個(gè)函數(shù)內(nèi)起作用,例如函數(shù)的形式參數(shù)具有函數(shù)作用域,它們起始于函數(shù)體開始的第一個(gè)左花括號(hào)“{”,結(jié)束于標(biāo)志函數(shù)體結(jié)束的最后一個(gè)右花括號(hào)“}”??梢哉f函數(shù)作用域是一種特殊的塊作用域。一個(gè)函數(shù)內(nèi)可以有多個(gè)塊,因此函數(shù)作用域大于塊作用域。2022/11/1882.函數(shù)作用域函數(shù)作用域是在某個(gè)函數(shù)內(nèi)起作用,例如函數(shù)的形式【例2-2】演示函數(shù)作用域的實(shí)例:將一個(gè)整數(shù)的各個(gè)位上的數(shù)字加起來(用函數(shù)完成),并輸出結(jié)果。
#include"iostream.h"#include<iomanip.h>intSumDigits(intx)//x為形式參數(shù),其作用域?yàn)樵摵瘮?shù),在該函數(shù)外不可訪問{
intsum=0;//x為函數(shù)內(nèi)定義的變量,其作用域?yàn)樵摵瘮?shù)
while(x) { sum+=x%10;//求個(gè)位數(shù)字
x/=10;//原數(shù)字縮小10倍 }
returnsum;//sum保存各位數(shù)字之和}voidmain(){ inta; cout<<"請(qǐng)輸入一個(gè)整數(shù):"<<endl; cin>>a; cout<<SumDigits(a)<<"\n";//輸出各位數(shù)字之和}2022/11/189【例2-2】演示函數(shù)作用域的實(shí)例:將一個(gè)整數(shù)的各個(gè)位上的數(shù)字3.類作用域
下一章要講類與對(duì)象,在類中包含成員變量與成員函數(shù)。一個(gè)類中的成員變量在該類的任何成員函數(shù)中都可以訪問,因此類的作用域是整個(gè)類的定義空間。4.命名空間域
一個(gè)工程中的多個(gè)文件中有可能存在相同的變量,為了區(qū)別這些變量,可以將在不同文件中的相同變量防到放到兩個(gè)不同命名空間中,通過命名空間來確定變量作用范圍的作用區(qū)域叫命名空間作用域。該小節(jié)牽涉的東西請(qǐng)查閱相關(guān)資料。2022/11/18103.類作用域 下一章要講類與對(duì)象,在5.文件作用域在函數(shù)(以及下一章要講的類)以外聲明的、并且用“static”修飾的變量,具有文件作用域。其作用域起始于變量的聲明處,終止于文件的結(jié)束處,具有該作用域的變量又稱全局變量。該種類型的變量?jī)H僅在該文件中是全局的,別的文件不能使用。文件作用域又叫單文件作用域。下面是文件作用域的實(shí)例2022/11/18115.文件作用域在函數(shù)(以及下一章要講的類)以外聲明的、并且用【例2-3】文件作用域的實(shí)例。本程序定義了一個(gè)全局變量x,其作用域?yàn)檎麄€(gè)文件。
#include"iostream.h"#include<iomanip.h>staticintx=6903410;voidSwap(intx,inty)//利用加法完成兩個(gè)數(shù)的交換{
x=x+y;//此處的x與y為函數(shù)作用域
y=x-y; x=x-y; cout<<"Swap()函數(shù)中的x為"<<x<<endl; ::x++;//文件作用域的變量x加1} cout<<"調(diào)用Swap后文件作用域的的x為"<<::x<<endl;}voidmain(){ intx; cout<<"請(qǐng)輸入一個(gè)整數(shù):"<<endl; cin>>x; ++x;//main函數(shù)中的x加1
cout<<"main()函數(shù)中的x值為"<<x<<endl; cout<<"文件作用域的的x為"<<::x<<endl; Swap(x,10);2022/11/1812【例2-3】文件作用域的實(shí)例。本程序定義了一個(gè)全局變量x,其6.程序作用域如果一個(gè)變量的存儲(chǔ)類別為外部(extern)類型,則稱該變量為外部變量。外部變量帶有賦值的聲明稱為定義性說明,外部變量不帶有賦值的聲明稱為引用性說明。
externcharchoice=’y’;//定義性聲明 externfloatmoney;//引用性聲明定義性聲明指示編譯器程序?yàn)樵撏獠孔兞糠峙鋬?nèi)存,而引用性聲明僅告訴編譯程序該名字的變量在程序的其它地方已經(jīng)有了定義性聲明。外部變量是全局變量、動(dòng)態(tài)生存期變量,所以其作用域大、壽命長(zhǎng)。2022/11/18136.程序作用域如果一個(gè)變量的存儲(chǔ)類別為外部(extern)2.1.4 一個(gè)VC多文件應(yīng)用
程序的實(shí)現(xiàn)
在大型復(fù)雜的應(yīng)用程序中,一個(gè)任務(wù)常常劃分成多個(gè)模塊,每個(gè)模塊是由不同的人員編寫,當(dāng)然不同的人編制的代碼應(yīng)放在不同的文件中,最后要把這些文件統(tǒng)一起來,放到一個(gè)工程中。此時(shí),在自己的文件中如何訪問別的文件中的變量或函數(shù),又如何控制別人編的文件不能使用自己的變量呢?這就牽涉到如何使用程序作用域的變量。
2022/11/18142.1.4 一個(gè)VC多文件應(yīng)用
程序的實(shí)現(xiàn)在大型復(fù)雜的應(yīng)用【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope
1.建立一個(gè)空的控制臺(tái)工程(1)單擊VC集成開發(fā)環(huán)境菜單File|New,選擇Projects選項(xiàng)。該選項(xiàng)下列出了VC可以開發(fā)的17種應(yīng)用程序的類型。我們選擇基于字符界面的“Win32ConsloeApplications”控制臺(tái)應(yīng)用程序類型。如圖2.1所示。(2)在“ProjectName”編輯框內(nèi)填寫工程的名字“ProgScope”,并在“Location”編輯框內(nèi)填寫工程所在的目錄。我們選擇的是“E:\VCPP”。這樣,當(dāng)最后生成一個(gè)應(yīng)用程序時(shí),就在E:\VCPP的目錄在生成一個(gè)新目錄ProgScope,在“E:\VCPP\ProgScope”目錄下,存放的是與該工程有關(guān)的一系列文件。(3)單擊按鈕“Ok”,進(jìn)入到圖2.2所示的界面中。該界面讓用戶選擇Win32控制臺(tái)應(yīng)用程序的類型。我們選擇第一種“Aemptyproject”。單擊“Finish”按鈕,進(jìn)入到圖2.3所示的界面。(4)圖2.3是對(duì)生成工程總的信息描述,沒多大意義。單擊“OK”按鈕生成ProgScope應(yīng)用程序框架。2022/11/1815【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope
圖2.1選擇應(yīng)用程序類型對(duì)話框2022/11/1816【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope
圖2.2選擇控制臺(tái)工程類型圖2.3生成的控制臺(tái)工程信息2022/11/1817【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope2.在工程中增加C++源文件(1)單擊File|New,選擇Files選項(xiàng)卡,該選項(xiàng)下列出了VC可以使用的文件類型。我們選中C++SourceFile列表項(xiàng),并在右邊的File編輯框中輸入新建單文件C++文件名稱File1。同時(shí)選中“AddtoProject:”復(fù)選框。如圖2.4所示。最后按OK按鈕,返回到MicrosoftVisuallC++的主窗口,在其中輸入如下的程序源代碼:#include"iostream.h"externintFile2_x;//引用性聲明,表示要使用別的文件中的File2_x變量voidmain(){ cout<<"File2.cpp中的變量File2_x="<<File2_x<<endl;}2022/11/1818【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope
(2)用同樣的方法在工程ProgScope中添加另一個(gè)源文件File2.cpp,該文件中的代碼為:
externint
File2_x=222; //定義性聲明變量File2_x,它是一個(gè)程序作用域的變量,別的文件可以訪問它,前面的extern可省略
圖2.4在工程中增加源文件File1.cpp2022/11/1819【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope
3.運(yùn)行該工程按“Ctrl+F5”,VC編譯器編譯、鏈接并運(yùn)行該程序,程序的運(yùn)行結(jié)果為:
File2.cpp中的變量File2_x=222自己嘗試把File2.cpp中的語句“externint
File2_x=222;”
前的extern改為static,看程序還能不能運(yùn)行,并分析原因。2022/11/1820【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro2.1.5 變量生存期及其分類 變量的生存期指程序運(yùn)行過程中變量占用內(nèi)存或寄存器的時(shí)間它由聲明變量時(shí)選擇的存儲(chǔ)類型來決定的。任何一個(gè)類型的變量都有自己的生存期,在生存期內(nèi),變量將保持它的值不變,直到它被更新止。變量生存期的分類靜態(tài)生存期動(dòng)態(tài)生存期2022/11/18212.1.5 變量生存期及其分類 變量的生存期2022/12.1.6* VC中的數(shù)據(jù)類型 衡量一種程序設(shè)計(jì)語言優(yōu)劣的首要標(biāo)準(zhǔn)就是它所提供的數(shù)據(jù)類型,能不能使用戶把客觀世界多種多樣形態(tài)的實(shí)際問題方便而又靈活地抽象為適當(dāng)數(shù)據(jù)類型加以處理。VC提供了豐富的數(shù)據(jù)類型,主要包括基本類型和非基本類型。基本類型主要包括char(字符型)、int(整型)、shor(短整型)、long(長(zhǎng)整型)、bool(邏輯型)、float(單精度實(shí)數(shù))、double(雙精度實(shí)數(shù))等。非基本類型主要包括枚舉型(用enum定義)、數(shù)組型、指針型、空類型(void)、結(jié)構(gòu)體類型(用struct定義)、公用體類型(用union定義)和下一章要講的類類型(用class定義)。2022/11/18222.1.6* VC中的數(shù)據(jù)類型 衡量一種程序設(shè)計(jì)語言優(yōu)劣2.2指針與引用
2.2.1地址與指針的概念
2.2.2指針變量定義與賦值
2.2.3數(shù)組指針與指針數(shù)組
2.2.4動(dòng)態(tài)內(nèi)存分配:new與delete
2.2.5引用2022/11/18232.2指針與引用 2022/11/11232.2.1 地址與指針的概念VC語言擁有在運(yùn)行時(shí)獲得變量地址和操縱地址的能力,這種可用來操縱地址的變量類型就是指針。指針可以用于數(shù)組,用于內(nèi)存訪問,還可作為函數(shù)的參數(shù)。指針就是地址,它也是一種數(shù)據(jù)類型,具有指針類型的變量稱為指針變量。指針變量也是一個(gè)變量,只不過這個(gè)變量是用來放地址的,是用來存放別的變量地址的。2022/11/18242.2.1 地址與指針的概念VC語言擁有在運(yùn)行時(shí)獲得變量地址1.指針變量定義VC中指針變量的定義形式為:
數(shù)據(jù)類型名*指針變量名;注意:指針的類型為它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個(gè)指針的數(shù)據(jù)值都是unsignedlongint型。因此指向的類型不同,指針的類型就不同。2.2.2 指針變量定義與賦值例如:
inta,*pa;
double*p1;
POINT*p2;
CDC*pDC;
int(*p3)[6];int(*p4)();
2022/11/18251.指針變量定義VC中指針變量的定義形式為:注意:指針2.指針變量的賦
一個(gè)指針變量可以有三種狀態(tài):未賦任何值,“懸空”狀態(tài)(最嚴(yán)重的錯(cuò)誤);被賦予NULL值,(指向一個(gè)安全的位置);指向某一個(gè)變量(程序員必須用的操作)。2022/11/18262.指針變量的賦 一個(gè)指針變量可以有三種狀態(tài):2022/12.指針變量的賦值
int*ptr;floata=6.6,b,c[3];float*pa=&a;//聲明指針變量pa,并將浮點(diǎn)數(shù)a的地址賦給它float*pb=NULL;//將指針指向安全的位置float*pc=c;//將數(shù)組C的起始地址賦給指針變量pc下面是對(duì)一些指針變量賦值的例子:2022/11/18272.指針變量的賦值int*ptr;下面是對(duì)一些指針變量賦【例2-6】指針使用實(shí)例。
#include"iostream.h"#include<iomanip.h>voidmain(){ intx,y; int*ptr;//定義指針變量ptr y=20; x=10; ptr=&x;//對(duì)指針變量ptr初始化,使得其指向變量x cout<<"變量x的值為"<<dec<<x<<'\t'<<"ptr所指的變量的值為"<<*ptr<<endl; cout<<"變量x的地址值為"<<hex<<&x<<'\t'<<"ptr的值為"<<ptr<<'\n'; ptr=&y;//對(duì)指針變量ptr重新賦值,使得其指向變量y cout<<"變量y的值為"<<dec<<y<<'\t'<<"ptr所指的變量的值為"<<*ptr<<endl; cout<<"變量y的地址值為"<<hex<<&y<<'\t'<<"ptr的值為"<<ptr<<'\n';}2022/11/1828【例2-6】指針使用實(shí)例。 #include"iostr2.2.3 數(shù)組指針與指針數(shù)組1.?dāng)?shù)組
數(shù)學(xué)上,常用一個(gè)向量(vector)表示一些相關(guān)數(shù)據(jù)組成的序列,在程序設(shè)計(jì)語言中是用數(shù)組來表示的。數(shù)組是由一定數(shù)目的同類元素順序排列而成的結(jié)構(gòu)類型數(shù)據(jù)(可把數(shù)組看成一種數(shù)據(jù)類型,一種復(fù)合數(shù)據(jù)類型)。在計(jì)算機(jī)中,一個(gè)數(shù)組在內(nèi)存中占有一片連續(xù)的存儲(chǔ)區(qū)域,VC的數(shù)組名就是這塊存儲(chǔ)空間的地址。例如:intscore[100];2022/11/18292.2.3 數(shù)組指針與指針數(shù)組1.?dāng)?shù)組 數(shù)學(xué)上,常用一個(gè)2.?dāng)?shù)組指針數(shù)組指針是一個(gè)指針,該指針指向的是數(shù)據(jù)類型是數(shù)組類型,它存放的是數(shù)組的起始地址。其實(shí)數(shù)組中的每一個(gè)元素都是一個(gè)變量,既然是變量,則他們就具有地址。C++規(guī)定,數(shù)組的地址用數(shù)組名來表示,即數(shù)組名表示的是第一個(gè)元素的地址。例如: int(*ArrayPtr)[100];2022/11/18302.?dāng)?shù)組指針數(shù)組指針是一個(gè)指針,該指針指向的是數(shù)據(jù)類型是數(shù)組2.2.4 動(dòng)態(tài)內(nèi)存分配:
new與delete
在VC中,動(dòng)態(tài)內(nèi)存分配技術(shù)可以保證我們?cè)诔绦蜻\(yùn)行的過程中,根據(jù)實(shí)際需要而申請(qǐng)適量的內(nèi)存,在使用結(jié)束后還可以釋放。這些功能的實(shí)現(xiàn)靠new和delete
函數(shù)。
1.new運(yùn)算
運(yùn)算符new的功能是動(dòng)態(tài)分配內(nèi)存,或者稱為動(dòng)態(tài)創(chuàng)建堆對(duì)象。其語法形式為:
new類型名T(初值列表);2022/11/18312.2.4 動(dòng)態(tài)內(nèi)存分配:
new與delete例如:int*pi;//聲明指向整型數(shù)的指針變量pifloat*pf;//聲明指向浮點(diǎn)數(shù)的指針變量pfchar*pc;//聲明指向字符的指針變量pcpi=newint;//動(dòng)態(tài)產(chǎn)生一無名的整型變量,該變量的地址保存在指針變量pi中pf=newfloat(13.5);pc=newchar[3];2022/11/1832例如:2022/11/11322.delete運(yùn)算
運(yùn)算符new的功能是動(dòng)態(tài)分配內(nèi)存,當(dāng)用戶不再需要這些內(nèi)存的時(shí)候,必須將其顯式地釋放,釋放new所分配空間的函數(shù)是delete,其語法形式為:
delete指針變量名;例如:delete*pi;//釋放pi指向的動(dòng)態(tài)int變量delete*pf;//釋放pf指向的動(dòng)態(tài)float變量delete[]pc;//釋放pc指向的動(dòng)態(tài)char數(shù)組2022/11/18332.delete運(yùn)算運(yùn)算符new的【例2-7】
new和delete實(shí)例測(cè)試。
voidmain(){ char*pString1="VC++6.0程序設(shè)計(jì)簡(jiǎn)明教程"; //定義指向字符的指針變量 puts(pString1);//輸出pString1所指向的字符串
int*pi;//定義指針變量pi pi=newint;//在棧區(qū)分配四個(gè)字節(jié)的空間,起始地址給了pi *pi=35;//將35賦給pi所指向的無名變量
printf("%8d\n",*pi);//輸出無名變量的值
deletepi;//釋放pi所指向的無名變量的內(nèi)存空間,在用戶程序有一個(gè)new一定得有一個(gè)delete char*pString2=newchar[40];//定義指向字符的指針變量 strcpy(pString2,pString1); cout<<pString2<<endl; strcat(pString2,"--作者:雷驚劉");
cout<<pString2<<endl; delete[]pString2;//釋放動(dòng)態(tài)字符數(shù)組pString2}2022/11/1834【例2-7】new和delete實(shí)例測(cè)試。 voidm2.2.5 引用引用的概念引用是一個(gè)變量的別名,是一個(gè)目標(biāo)對(duì)象的替代名,它由符號(hào)&來引導(dǎo)。引用類似于一個(gè)人的外號(hào),當(dāng)給某個(gè)人起了一個(gè)外號(hào)時(shí),這個(gè)外號(hào)就是這個(gè)人的引用。因此,對(duì)這個(gè)人的外號(hào)操作,就是對(duì)這個(gè)人的操作,類似地,對(duì)一個(gè)變量的引用操作,就是對(duì)這個(gè)變量操作。2022/11/18352.2.5 引用引用的概念2022/11/1135【例2-8】引用實(shí)例測(cè)試。 voidmain(){ intOne=3; int&OneRef=One;/*定義引用OneRef,同時(shí)對(duì)其進(jìn)行初始化為變量One,此時(shí)OneRef就是One的外號(hào),引用必須在定義時(shí)就進(jìn)行初始化*/
cout<<"One="<<One<<"\t"<<"OneRef="<<OneRef<<endl; //輸出變量One與引用OneRef的值,都為3
One++; //變量One增一,因此其引用OneRef也增一,一個(gè)變量和其引用就是同一個(gè)變量。
cout<<"One="<<One<<"\t"<<"OneRef="<<OneRef<<endl; OneRef=34; //對(duì)引用OneRef賦值,就是對(duì)其引用的變量One賦值
cout<<"One="<<One<<"\t"<<"OneRef="<<OneRef<<endl;}2022/11/1836【例2-8】引用實(shí)例測(cè)試。 voidmain()2022【例2-8】引用實(shí)例測(cè)試。 運(yùn)行結(jié)果為:One=3OneRef=3One=4OneRef=4One=34OneRef=342022/11/1837【例2-8】引用實(shí)例測(cè)試。 運(yùn)行結(jié)果為:2022/11/12.3函數(shù)的聲明與調(diào)用
2.3.1函數(shù)與模塊
2.3.2函數(shù)的聲明
2.3.3函數(shù)的定義
2.3.4函數(shù)的參數(shù)與返回值
2.3.5函數(shù)調(diào)用
2022/11/18382.3函數(shù)的聲明與調(diào)用 2.3.1函數(shù)與模塊2022/2.3.1 函數(shù)與模塊 一個(gè)程序可以分成多個(gè)相互獨(dú)立的程序段,這些程序段被稱為函數(shù)。函數(shù)是一個(gè)完成一定功能的獨(dú)立執(zhí)行代碼。當(dāng)所要執(zhí)行的程序很大時(shí),需要以一種比較容易管理的方式來組織源代碼,通常是將程序劃分為若干模塊。C++語言使用文件作為劃分模塊的主要機(jī)制,這些組成C++程序的文件稱為文件模塊,簡(jiǎn)稱為模塊。
2022/11/18392.3.1 函數(shù)與模塊 一個(gè)程序可以分成多個(gè)相互獨(dú)立的程序2.3.1 函數(shù)與模塊 VC有兩種程序模塊:函數(shù)(function)。其中函數(shù)也有兩類:一類為類似于C語言中的普通函數(shù)(類體外的函數(shù)),另一類為類中的成員函數(shù)。其區(qū)別是前者不屬于某個(gè)類,而后者卻屬于某個(gè)類,即前者的作用域要大于后者。類(class)。包含成員變量和成員函數(shù)。函數(shù)的作用有兩個(gè):一是實(shí)現(xiàn)任務(wù)劃分,將一個(gè)比較復(fù)雜的任務(wù)劃分成若干個(gè)簡(jiǎn)單的任務(wù),每一個(gè)任務(wù)可以由一個(gè)或多個(gè)函數(shù)組成,函數(shù)的使用,便于任務(wù)的分工與處理,便于驗(yàn)證程序的正確性;
二是實(shí)現(xiàn)軟件的源代碼復(fù)用,把一些功能相似的程序段組織成函數(shù),使得函數(shù)的代碼只有一處,而調(diào)用卻可以有多處,但卻不需要編寫雷同的代碼。2022/11/18402.3.1 函數(shù)與模塊 VC有兩種程序模塊:2022/112.3.2 函數(shù)的聲明函數(shù)和變量一樣,在使用之前應(yīng)該先聲明。VC中一種函數(shù)的引用性聲明——函數(shù)原型,它的一般形式為:
<函數(shù)返回值的類型聲明><函數(shù)名>(<參數(shù)表>);2022/11/18412.3.2 函數(shù)的聲明函數(shù)和變量一樣,2.3.2 函數(shù)的聲明在VC中函數(shù)必須要有原型,這是VC區(qū)別于C的一個(gè)方面。函數(shù)原型的作用是告訴編譯器有關(guān)函數(shù)的信息:函數(shù)的名稱、函數(shù)參數(shù)的類型、函數(shù)返回值的類型、函數(shù)參數(shù)的個(gè)數(shù)、函數(shù)參數(shù)的順序。VC編譯器是根據(jù)函數(shù)原型來檢查函數(shù)調(diào)用的正確性。我們?cè)诰帉慍++程序時(shí),都有大量的#include
“….h”的字樣,這實(shí)質(zhì)上是一條編譯預(yù)處理指令。它把系統(tǒng)定義的函數(shù)或自定義的函數(shù)包含進(jìn)來。切記它只是包含了函數(shù)的原型,真正的函數(shù)實(shí)現(xiàn)代碼并沒有包含進(jìn)來。編譯器根據(jù)這些函數(shù)的原型來檢查用戶調(diào)用是否正確。2022/11/18422.3.2 函數(shù)的聲明在VC中函數(shù)必須要有原型,這是VC區(qū)2.3.2 函數(shù)的聲明下面為從math.h中抽取出的一段函數(shù)原型說明,從函數(shù)的名字可以看出其功能。int__cdeclabs(int);double__cdeclacos(double);double__cdeclasin(double);double__cdeclatan(double);double__cdeclcos(double);double__cdeclexp(double);
2022/11/18432.3.2 函數(shù)的聲明下面為從math.h中抽取出的一段函數(shù)2.3.3 函數(shù)的定義函數(shù)的定義包括函數(shù)頭和函數(shù)體兩部分。函數(shù)頭定義函數(shù)的名稱、參數(shù)函數(shù)返回值類型等,函數(shù)體則定義函數(shù)的算法實(shí)現(xiàn)。函數(shù)定義的一般形式是:
函數(shù)類型函數(shù)名(數(shù)據(jù)類型1形參1,數(shù)據(jù)類型2形參2…){ //函數(shù)體}2022/11/18442.3.3 函數(shù)的定義函數(shù)的定義包括函數(shù)頭和函數(shù)體兩部分。2.3.3 函數(shù)的定義函數(shù)名是一個(gè)標(biāo)識(shí)符——以字母、下劃線或數(shù)字組成并且必須以字母和下劃線開頭的字符序列,函數(shù)類型是指函數(shù)的返回值類型,可以是基本數(shù)據(jù)類型或復(fù)合數(shù)據(jù)類型。如果一個(gè)函數(shù)沒有返回值,則可以將它的返回類型指定為void。void也是C++提供的一種基本數(shù)據(jù)類型,表示“空值”,它不能作為操作數(shù)參與任何運(yùn)算。函數(shù)名稱后為形式參數(shù)表,它是用逗號(hào)分隔的參數(shù)說明表列。函數(shù)體是指用“{”和“}”括住的語句序列,分為說明部分和語句部分,在一個(gè)函數(shù)體中,這兩個(gè)部分可以交替出現(xiàn),但對(duì)某具體變量來說,應(yīng)先聲明后使用。2022/11/18452.3.3 函數(shù)的定義函數(shù)名是一個(gè)標(biāo)識(shí)符——以字母、下劃線【例2-9】定義一個(gè)求兩個(gè)數(shù)的較小數(shù)的
函數(shù)min()。intmin(intx,inty)//函數(shù)定義部分{
returnx<y?x:y;}2022/11/1846【例2-9】定義一個(gè)求兩個(gè)數(shù)的較小數(shù)的
函數(shù)min()。i2.3.4函數(shù)的參數(shù)與返回值函數(shù)的參數(shù)和返回值是函數(shù)的兩個(gè)重要方面。函數(shù)的調(diào)用是程序模塊之間的通訊,函數(shù)在調(diào)用時(shí)將數(shù)據(jù)傳遞到被調(diào)用函數(shù)中。函數(shù)的返回值是函數(shù)之間傳遞信息的通道。1.函數(shù)的實(shí)參與形參函數(shù)的參數(shù)分為形式參數(shù)(簡(jiǎn)稱形參)和實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)。調(diào)用函數(shù)的參數(shù)稱為實(shí)參。被調(diào)用函數(shù)的參數(shù)稱為形參。
2022/11/18472.3.4函數(shù)的參數(shù)與返回值函數(shù)的參數(shù)和返回值是函數(shù)2.函數(shù)返回值的實(shí)現(xiàn)
函數(shù)的類型就是函數(shù)返回值的類型,當(dāng)函數(shù)沒有返回值時(shí),其函數(shù)的類型為void,有返回值的函數(shù)必須在其函數(shù)體中出現(xiàn)return語句,其格式為:
return<表達(dá)式>;2022/11/18482.函數(shù)返回值的實(shí)現(xiàn) 函數(shù)的類型就是函數(shù)返回2.函數(shù)返回值的實(shí)現(xiàn)(1)計(jì)算<表達(dá)式>的值。C++中有豐富的算術(shù)、邏輯、逗號(hào)、條件、關(guān)系表達(dá)式等。不管是什么樣的表達(dá)式,只需記住表達(dá)式是一個(gè)值,這個(gè)值是根據(jù)相應(yīng)的表達(dá)式的規(guī)則計(jì)算出來的。(2)將<表達(dá)式>的類型轉(zhuǎn)換為函數(shù)的返回值類型(3)將<表達(dá)式>的值賦給一個(gè)臨時(shí)變量;(4)程序的控制權(quán)發(fā)生轉(zhuǎn)移,由被調(diào)用函數(shù)轉(zhuǎn)移到調(diào)用函數(shù),同時(shí)將臨時(shí)變量傳遞給調(diào)用函數(shù)加以使用;(5)釋放臨時(shí)變量,函數(shù)調(diào)用完成,執(zhí)行調(diào)用函數(shù)的下一條語句。2022/11/18492.函數(shù)返回值的實(shí)現(xiàn)(1)計(jì)算<表達(dá)式>的值。C++中有豐2.3.5 函數(shù)調(diào)用在VC中,除了主函數(shù)外,其他任何函數(shù)都不能單獨(dú)作為程序運(yùn)行。任何函數(shù)功能的體現(xiàn)都必須通過主函數(shù)直接或間接調(diào)用來進(jìn)行。函數(shù)調(diào)用就是使程序的流程發(fā)生改變,轉(zhuǎn)去執(zhí)行指定函數(shù)的函數(shù)體,函數(shù)調(diào)用完成后,再接著執(zhí)行調(diào)用函數(shù)語句的下一條語句。函數(shù)調(diào)用的一般格式為:
函數(shù)名(實(shí)參表);2022/11/18502.3.5 函數(shù)調(diào)用在VC中,除了主函數(shù)外,其他任何函數(shù)都2.3.5 函數(shù)調(diào)用函數(shù)調(diào)用要做的工作是:指定函數(shù)名并提供實(shí)參。函數(shù)名是函數(shù)的地址,實(shí)參提供被調(diào)用函數(shù)執(zhí)行任務(wù)所需要的信息及接受被調(diào)用函數(shù)返回的信息。函數(shù)調(diào)用時(shí),要發(fā)生實(shí)參和形參的結(jié)合,一般實(shí)參和形參在個(gè)數(shù)、類型、位置上一一對(duì)應(yīng)。2022/11/18512.3.5 函數(shù)調(diào)用函數(shù)調(diào)用要做的工作是:指定函數(shù)名并提供【例2-10】調(diào)用前面定義的求兩個(gè)數(shù)中的較小數(shù)的函數(shù)的實(shí)例#include<iostream.h>voidmain(){ intmin(intx,inty);//函數(shù)原型說明部分
cout<<"Pleaseinputtwointeger:"; inta,b; cin>>a>>b; cout<<"Theminiumnumberis:"<<min(a,b)<<endl;}intmin(intx,inty)//函數(shù)定義部分{
returnx<y?x:y;}2022/11/1852【例2-10】調(diào)用前面定義的求兩個(gè)數(shù)中的較小數(shù)的函數(shù)的實(shí)例#【例2-10】調(diào)用前面定義的求兩個(gè)數(shù)中的較小數(shù)的函數(shù)的實(shí)例。
分析:雖然函數(shù)min()的定義出現(xiàn)在對(duì)它的調(diào)用之后,然而,由于使用了函數(shù)原型,程序就可以得到正確的結(jié)果。在函數(shù)原型中,函數(shù)參數(shù)的名字可以省略,但參數(shù)的類型不能省略,上例中函數(shù)原型可以改寫為:
int
min(int,int);
從上述例子可以看出函數(shù)原型與函數(shù)定義的區(qū)別在于:函數(shù)原型沒有函數(shù)體部分,而且是用分號(hào)結(jié)束的,很像變量的聲明。如果需要在函數(shù)定義之前調(diào)用函數(shù),則需要在調(diào)用之前使用函數(shù)原型進(jìn)行聲明。但如果函數(shù)定義在前,函數(shù)調(diào)用在后時(shí),調(diào)用前可以不說明。2022/11/1853【例2-10】調(diào)用前面定義的求兩個(gè)數(shù)中的較小數(shù)的函數(shù)的實(shí)例。2.4 函數(shù)參數(shù)的傳遞
2.4.1參數(shù)的傳遞方式 2.4.2值傳遞
2.4.3地址傳遞
2.4.4引用傳遞
2.4.5缺省參數(shù)
2022/11/18542.4 函數(shù)參數(shù)的傳遞 2022/11/11542.4.1 參數(shù)的傳遞方式參數(shù)是調(diào)用函數(shù)與被調(diào)用函數(shù)之間進(jìn)行通信的橋梁。函數(shù)定義首部的參數(shù)稱為形參,調(diào)用函數(shù)時(shí)使用的參數(shù)稱為實(shí)參。在函數(shù)被調(diào)用時(shí),系統(tǒng)建立與實(shí)參對(duì)應(yīng)的形參存儲(chǔ)空間,函數(shù)執(zhí)行完畢,系統(tǒng)收回分配給形參的臨時(shí)存儲(chǔ)空間,這個(gè)過程稱為參數(shù)傳遞或參數(shù)的虛實(shí)結(jié)合,函數(shù)通過形參與實(shí)參來進(jìn)行通信。C++有3種參數(shù)傳遞機(jī)制:值傳遞、地址傳遞、引用傳遞。2022/11/18552.4.1 參數(shù)的傳遞方式參數(shù)是調(diào)用函數(shù)與被調(diào)用函數(shù)之間2.4.2 值傳遞
值傳遞又稱拷貝傳遞方式,顧名思義,拷貝傳遞方式就是將實(shí)際參數(shù)拷貝一份,傳給對(duì)應(yīng)的形參。由于形參得到的是拷貝的那一份,它和實(shí)參那份是不同的,即對(duì)應(yīng)形參和實(shí)參變量在內(nèi)存的位置不同,它們是不同的變量,唯一共同點(diǎn)是它們的值是一樣的。因此在函數(shù)體內(nèi)對(duì)形參的修改,只是在這個(gè)臨時(shí)建立變量上的修改,與實(shí)參無關(guān)。當(dāng)函數(shù)調(diào)用結(jié)束后,形參被釋放,生命期也就結(jié)束了,因此在調(diào)用函數(shù)中是無法修改實(shí)參的。
2022/11/18562.4.2 值傳遞值傳遞又稱拷貝傳遞方式,顧名【例2-11】值傳遞測(cè)試。
#include"iostream.h"voidSwapByValue(intx,inty);//值傳遞的交換函數(shù)原型說明intmain(intargc,char*argv[]){ inta=6,b=8; cout<<"未調(diào)用函數(shù)前a="<<a<<"\t"<<"b="<<b<<endl; SwapByValue(a,b); cout<<"值傳遞后a="<<a<<"\t"<<"b="<<b<<endl; return0;}voidSwapByValue(intx,inty){ x=x+y; y=x-y; x=x-y; //以上三行代碼實(shí)現(xiàn)x與y的互換
cout<<"在值傳遞函數(shù)中x="<<x<<"\t"<<"y="<<y<<endl;}
2022/11/1857【例2-11】值傳遞測(cè)試。#include"iostre【例2-11】值傳遞測(cè)試。
程序的運(yùn)行結(jié)果是:未調(diào)用函數(shù)前a=6b=8在值傳遞函數(shù)中x=8y=6值傳遞后a=6b=8程序分析:main()函數(shù)調(diào)用SwapByValue函數(shù)時(shí),系統(tǒng)在棧區(qū)開辟空間給變量x與y,把實(shí)際參數(shù)a與b的值賦給x與y,此時(shí)x與y是6與8,當(dāng)執(zhí)行了交換函數(shù)的前三條語句后,x變成了8,y變成了6,最后一條輸出語句的運(yùn)行結(jié)果說明了這一點(diǎn)。SwapByValue函數(shù)交換的只是x與y,與a和b沒有關(guān)系,main()函數(shù)輸出a與b的值見證了這一點(diǎn)。2022/11/1858【例2-11】值傳遞測(cè)試。程序的運(yùn)行結(jié)果是:程序分析:2.4.3 地址傳遞 指針傳遞是通過函數(shù)定義中的形參被說明為指針類型來加以實(shí)現(xiàn)的。由于形參被說明為指針類型,根據(jù)實(shí)參向形參傳遞的三個(gè)一致“參數(shù)的類型一致、個(gè)數(shù)一致、順序一致”規(guī)則,形參對(duì)應(yīng)的實(shí)參應(yīng)為地址表達(dá)式,即某個(gè)變量的地址。調(diào)用函數(shù)時(shí),實(shí)參把變量的地址賦給了形參這個(gè)指針變量。在被調(diào)用函數(shù)中往往通過指針變量間接訪問實(shí)參所指的變量,這種把變量地址傳給形參指針變量的方式稱為地址傳遞或地址調(diào)用。2022/11/18592.4.3 地址傳遞 指針傳遞是通過函數(shù)定義中的形參被說明【例2-12】地址傳遞測(cè)試。voidSwapByRefer(int&x,int&y);//引用傳遞的交換函數(shù)的原型說明intmain(intargc,char*argv[]){ inta=6,b=8; cout<<"未調(diào)用函數(shù)前a="<<a<<"\t"<<"b="<<b<<endl; SwapByRefer(a,b); cout<<"引用傳遞后a="<<a<<"\t"<<"b="<<b<<endl; return0;}voidSwapByRefer(int&x,int&y){ x=x+y; y=x-y; x=x-y; //以上三行代碼實(shí)現(xiàn)x引用與y引用的互換
cout<<"在引用傳遞函數(shù)中x="<<x<<"\t"<<"y="<<y<<endl;}2022/11/1860【例2-12】地址傳遞測(cè)試。voidSwapByRefe【例2-12】地址傳遞測(cè)試。程序的運(yùn)行結(jié)果是:未調(diào)用函數(shù)前a=6b=8在引用傳遞函數(shù)中x=8y=6引用傳遞后a=8b=6程序分析:
main()函數(shù)調(diào)用SwapByRefer函數(shù)時(shí),由于引用并不是變量,系統(tǒng)不需要在在棧區(qū)為相應(yīng)的形參數(shù)x與y開辟新的存儲(chǔ)空間,形參與實(shí)參的結(jié)合說明,形參x是實(shí)參a的引用,形參y是實(shí)參b的引用。交換函數(shù)的前三條語句的作用是,交換引用x與引用y的值,即交換變量a與變量b的值,因此執(zhí)行完這三條語句后,變量a與變量b的值發(fā)生互換。最后一條輸出語句要求輸出引用x與引用y,即輸出原先b的值8與原先a的值6。SwapByRefer函數(shù)是把引用x與引用y交換,即a與b交換,main()函數(shù)輸出a與b語句的運(yùn)行結(jié)果見證了這一點(diǎn)。
2022/11/1861【例2-12】地址傳遞測(cè)試。程序的運(yùn)行結(jié)果是:程序分析2.4.4 引用傳遞 引用的實(shí)質(zhì)是給變量其了一個(gè)別名,這樣,當(dāng)形參和實(shí)參結(jié)合時(shí),對(duì)應(yīng)的形參就是相應(yīng)實(shí)參的別名。在調(diào)用函數(shù)內(nèi)對(duì)形參的修改就是對(duì)實(shí)參的修改,在調(diào)用函數(shù)外對(duì)實(shí)參的修改,當(dāng)進(jìn)入被調(diào)用函數(shù)內(nèi)時(shí),相應(yīng)的形參就是已經(jīng)修改了的實(shí)參。因此引用傳遞的理解比較簡(jiǎn)單,形參和實(shí)參在操作的結(jié)果是同步的,形參的值就是實(shí)參的值。當(dāng)C++函數(shù)的形式參數(shù)被定義為引用類型,稱為引用參數(shù)。引用參數(shù)對(duì)應(yīng)的實(shí)際參數(shù)為一個(gè)變量或?qū)ο?。函?shù)被調(diào)用時(shí),形參不需要開辟新的存儲(chǔ)空間,形參名作為引用綁定到實(shí)參上,即形參變?yōu)閷?shí)參的別名。2022/11/18622.4.4 引用傳遞 引用的實(shí)質(zhì)是給變量其了一個(gè)別名【例2-13】引用傳遞測(cè)試。
voidSwapByRefer(int&x,int&y);//引用傳遞的交換函數(shù)的原型說明intmain(intargc,char*argv[]){ inta=6,b=8; cout<<"未調(diào)用函數(shù)前a="<<a<<"\t"<<"b="<<b<<endl; SwapByRefer(a,b); cout<<"引用傳遞后a="<<a<<"\t"<<"b="<<b<<endl; return0;}voidSwapByRefer(int&x,int&y){ x=x+y; y=x-y; x=x-y; //以上三行代碼實(shí)現(xiàn)x引用與y引用的互換
cout<<"在引用傳遞函數(shù)中x="<<x<<"\t"<<"y="<<y<<endl;}
2022/11/1863【例2-13】引用傳遞測(cè)試。voidSwapByRefe【例2-13】引用傳遞測(cè)試。程序的運(yùn)行結(jié)果是:未調(diào)用函數(shù)前a=6b=8在引用傳遞函數(shù)中x=8y=6引用傳遞后a=8b=62022/11/1864【例2-13】引用傳遞測(cè)試。程序的運(yùn)行結(jié)果是:2022/12.4.5*
缺省參數(shù)
缺省參數(shù)(又稱默認(rèn)參數(shù))指的是,在VC中可以設(shè)置函數(shù)形參的默認(rèn)值,下面例子中就有一個(gè)帶有缺省參數(shù)的函數(shù):
GetVolume(intlength,intwidth=2,intheight=4);
其中width的默認(rèn)值為2,height的默認(rèn)值為4。缺省參數(shù)是在函數(shù)聲明時(shí)就已經(jīng)給定的一個(gè)值,若在調(diào)用函數(shù)時(shí),沒有傳遞給該形參的值——實(shí)參的話,那么編譯器就自動(dòng)插上這個(gè)值。2022/11/18652.4.5* 缺省參數(shù) 缺省參數(shù)(又稱默認(rèn)參數(shù))指【例2-14】帶有缺省參數(shù)的求體積函數(shù)測(cè)試。
intGetVolume(intlength,intwidth=2,intheight=4);//求體積的函數(shù)原型,它有兩個(gè)缺省參數(shù)intmain(intargc,char*argv[]){ intlength=10,width=20,height=30; cout<<"傳遞3個(gè)實(shí)參的體積為"<<GetVolume(length,width,height)<<endl; cout<<"傳遞2個(gè)實(shí)參的體積為"<<GetVolume(length,width)<<endl; cout<<"傳遞1個(gè)實(shí)參的體積為"<<GetVolume(length)<<endl; return0;}intGetVolume(intlength,intwidth,intheight){ cout<<length<<"\t"<<width<<"\t"<<height<<endl; //輸出長(zhǎng)、寬、高
returnlength*width*height;//輸出體積}2022/11/1866【例2-14】帶有缺省參數(shù)的求體積函數(shù)測(cè)試。intGet【例2-14】帶有缺省參數(shù)的求體積函數(shù)測(cè)試。
程序運(yùn)行結(jié)果為:102030傳遞3個(gè)實(shí)參的體積為600010204傳遞2個(gè)實(shí)參的體積為8001024傳遞1個(gè)實(shí)參的體積為802022/11/1867【例2-14】帶有缺省參數(shù)的求體積函數(shù)測(cè)試。程序運(yùn)行結(jié)果為使用缺省參數(shù)的注意事項(xiàng):
(1)如果一個(gè)函數(shù)有多個(gè)缺省參數(shù),則在形式參數(shù)的分布中,缺省參數(shù)應(yīng)從右向左排列,在函數(shù)調(diào)用時(shí),只能從左匹配;(2)缺省參數(shù)的值可以是全局變量、全局常量,甚至是函數(shù),但不可以是局部變量;(3)如果函數(shù)有原型聲明時(shí),則缺省參數(shù)的說明只能在函數(shù)的原型聲明中,而不能出現(xiàn)在函數(shù)的定義說明中;(4)如果函數(shù)只有定義說明而沒有原型聲明時(shí),則缺省參數(shù)的說明可以出現(xiàn)在函數(shù)的定義中。
2022/11/1868使用缺省參數(shù)的注意事項(xiàng): (1)如果一個(gè)函數(shù)有多第2章 VC程序基礎(chǔ)——
變量與函數(shù)
2.1變量的生存期與作用域
2.2指針與引用
2.3函數(shù)的聲明與調(diào)用
2.4函數(shù)參數(shù)的傳遞
本章從變量的五個(gè)要素著手,圍繞它講了變量的各種生存期和作用域。另外還對(duì)一種特殊的變量——地址變量進(jìn)行了講解。本章主要講了與函數(shù)有關(guān)的定義、實(shí)現(xiàn)以及調(diào)用的三種方式。掌握了變量與函數(shù),就把程序設(shè)計(jì)的基本把握住了,因此本章屬于VC程序設(shè)計(jì)的基礎(chǔ)知識(shí)。
2022/11/1869第2章 VC程序基礎(chǔ)——
變量與函數(shù)2.1變量的生存
2.1變量的生存期與作用域
2.1.1變量的五要素
2.1.2VC程序的存儲(chǔ)組織
2.1.3變量作用域及其分類
2.1.4一個(gè)VC多文件應(yīng)用程序的實(shí)現(xiàn)
2.1.5變量生存期及其分類
2.1.6VC中的數(shù)據(jù)類型2022/11/1870
2.1變量的生存期與作用域
2022/11/1122.1.1 變量的五要素1.變量的名稱2.變量的數(shù)據(jù)類型3.變量的值4.變量的地址5.變量的存儲(chǔ)類型2022/11/18712.1.1 變量的五要素1.變量的名稱2022/11/1132.1.2 VC程序的存儲(chǔ)組織 一個(gè)VC程序編譯運(yùn)行后,將其對(duì)應(yīng)的目標(biāo)代碼調(diào)到內(nèi)存中。目標(biāo)代碼主要包含操作符和操作數(shù),其中操作符存放在代碼區(qū),程序中處理的數(shù)據(jù)(操作數(shù))分別存放在靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)。
一個(gè)VC程序可以使用的存儲(chǔ)空間分為如下三個(gè)部分:
代碼區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)
2022/11/18722.1.2 VC程序的存儲(chǔ)組織 一個(gè)VC程序編譯運(yùn)行后,
變量的作用域是指在程序中變量的有效區(qū)域,它是變量的活動(dòng)空間。“鐵路警察各管一段”,描述的就是鐵路警察這些變量的作用域?yàn)楦髯缘囊欢巍T赩C中,變量的作用域有六種,從其作用范圍的大小由小到大依次為:塊作用域、函數(shù)作用域、類作用域、命名空間作用域、文件作用域、程序作用域。變量的作用域取決于變量的位置與聲明的方式。2.1.3變量作用域及其分 2022/11/1873變量的作用域是指在程序中變量的有效區(qū)域,它是變量1.塊作用域
塊指的是由一對(duì)“{”、“}”括起來的程序段。在塊中聲明的變量具有塊作用域,其作用域從聲明處開始,一直到塊結(jié)束的花括號(hào)為止。復(fù)合語句也是一個(gè)塊,例如if語句中定義的變量只能在if語句中使用,for語句中定義的變量,包括括號(hào)表達(dá)式中定義的變量,只能在for語句中使用。下面演示塊作用域的實(shí)例:
2022/11/18741.塊作用域塊指的是由一對(duì)“{”、“}”括起來的程序段。在【例2-1】演示塊作用域的實(shí)例:輸入兩個(gè)數(shù)將由大到小的順序保存,并輸出結(jié)果
#include"iostream.h"#include<iomanip.h>voidmain(){ intx,y; cout<<"請(qǐng)輸入兩個(gè)整數(shù):"<<endl; cin>>x>>y; if(x<=y)//x中保存較大的數(shù),y中保存較小的數(shù) {
intt;//t為臨時(shí)變量,其作用域?yàn)閴K作用域
t=x;//交換x與y的值
x=y; y=t; } cout<<"x="<<setw(6)<<x<<"y="<<setw(6)<<y<<endl;//setw(6)設(shè)置顯示的寬度為6個(gè)字符}2022/11/1875【例2-1】演示塊作用域的實(shí)例:輸入兩個(gè)數(shù)將由大到小的順序保2.函數(shù)作用域函數(shù)作用域是在某個(gè)函數(shù)內(nèi)起作用,例如函數(shù)的形式參數(shù)具有函數(shù)作用域,它們起始于函數(shù)體開始的第一個(gè)左花括號(hào)“{”,結(jié)束于標(biāo)志函數(shù)體結(jié)束的最后一個(gè)右花括號(hào)“}”??梢哉f函數(shù)作用域是一種特殊的塊作用域。一個(gè)函數(shù)內(nèi)可以有多個(gè)塊,因此函數(shù)作用域大于塊作用域。2022/11/18762.函數(shù)作用域函數(shù)作用域是在某個(gè)函數(shù)內(nèi)起作用,例如函數(shù)的形式【例2-2】演示函數(shù)作用域的實(shí)例:將一個(gè)整數(shù)的各個(gè)位上的數(shù)字加起來(用函數(shù)完成),并輸出結(jié)果。
#include"iostream.h"#include<iomanip.h>intSumDigits(intx)//x為形式參數(shù),其作用域?yàn)樵摵瘮?shù),在該函數(shù)外不可訪問{
intsum=0;//x為函數(shù)內(nèi)定義的變量,其作用域?yàn)樵摵瘮?shù)
while(x) { sum+=x%10;//求個(gè)位數(shù)字
x/=10;//原數(shù)字縮小10倍 }
returnsum;//sum保存各位數(shù)字之和}voidmain(){ inta; cout<<"請(qǐng)輸入一個(gè)整數(shù):"<<endl; cin>>a; cout<<SumDigits(a)<<"\n";//輸出各位數(shù)字之和}2022/11/1877【例2-2】演示函數(shù)作用域的實(shí)例:將一個(gè)整數(shù)的各個(gè)位上的數(shù)字3.類作用域
下一章要講類與對(duì)象,在類中包含成員變量與成員函數(shù)。一個(gè)類中的成員變量在該類的任何成員函數(shù)中都可以訪問,因此類的作用域是整個(gè)類的定義空間。4.命名空間域
一個(gè)工程中的多個(gè)文件中有可能存在相同的變量,為了區(qū)別這些變量,可以將在不同文件中的相同變量防到放到兩個(gè)不同命名空間中,通過命名空間來確定變量作用范圍的作用區(qū)域叫命名空間作用域。該小節(jié)牽涉的東西請(qǐng)查閱相關(guān)資料。2022/11/18783.類作用域 下一章要講類與對(duì)象,在5.文件作用域在函數(shù)(以及下一章要講的類)以外聲明的、并且用“static”修飾的變量,具有文件作用域。其作用域起始于變量的聲明處,終止于文件的結(jié)束處,具有該作用域的變量又稱全局變量。該種類型的變量?jī)H僅在該文件中是全局的,別的文件不能使用。文件作用域又叫單文件作用域。下面是文件作用域的實(shí)例2022/11/18795.文件作用域在函數(shù)(以及下一章要講的類)以外聲明的、并且用【例2-3】文件作用域的實(shí)例。本程序定義了一個(gè)全局變量x,其作用域?yàn)檎麄€(gè)文件。
#include"iostream.h"#include<iomanip.h>staticintx=6903410;voidSwap(intx,inty)//利用加法完成兩個(gè)數(shù)的交換{
x=x+y;//此處的x與y為函數(shù)作用域
y=x-y; x=x-y; cout<<"Swap()函數(shù)中的x為"<<x<<endl; ::x++;//文件作用域的變量x加1} cout<<"調(diào)用Swap后文件作用域的的x為"<<::x<<endl;}voidmain(){ intx; cout<<"請(qǐng)輸入一個(gè)整數(shù):"<<endl; cin>>x; ++x;//main函數(shù)中的x加1
cout<<"main()函數(shù)中的x值為"<<x<<endl; cout<<"文件作用域的的x為"<<::x<<endl; Swap(x,10);2022/11/1880【例2-3】文件作用域的實(shí)例。本程序定義了一個(gè)全局變量x,其6.程序作用域如果一個(gè)變量的存儲(chǔ)類別為外部(extern)類型,則稱該變量為外部變量。外部變量帶有賦值的聲明稱為定義性說明,外部變量不帶有賦值的聲明稱為引用性說明。
externcharchoice=’y’;//定義性聲明 externfloatmoney;//引用性聲明定義性聲明指示編譯器程序?yàn)樵撏獠孔兞糠峙鋬?nèi)存,而引用性聲明僅告訴編譯程序該名字的變量在程序的其它地方已經(jīng)有了定義性聲明。外部變量是全局變量、動(dòng)態(tài)生存期變量,所以其作用域大、壽命長(zhǎng)。2022/11/18816.程序作用域如果一個(gè)變量的存儲(chǔ)類別為外部(extern)2.1.4 一個(gè)VC多文件應(yīng)用
程序的實(shí)現(xiàn)
在大型復(fù)雜的應(yīng)用程序中,一個(gè)任務(wù)常常劃分成多個(gè)模塊,每個(gè)模塊是由不同的人員編寫,當(dāng)然不同的人編制的代碼應(yīng)放在不同的文件中,最后要把這些文件統(tǒng)一起來,放到一個(gè)工程中。此時(shí),在自己的文件中如何訪問別的文件中的變量或函數(shù),又如何控制別人編的文件不能使用自己的變量呢?這就牽涉到如何使用程序作用域的變量。
2022/11/18822.1.4 一個(gè)VC多文件應(yīng)用
程序的實(shí)現(xiàn)在大型復(fù)雜的應(yīng)用【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope
1.建立一個(gè)空的控制臺(tái)工程(1)單擊VC集成開發(fā)環(huán)境菜單File|New,選擇Projects選項(xiàng)。該選項(xiàng)下列出了VC可以開發(fā)的17種應(yīng)用程序的類型。我們選擇基于字符界面的“Win32ConsloeApplications”控制臺(tái)應(yīng)用程序類型。如圖2.1所示。(2)在“ProjectName”編輯框內(nèi)填寫工程的名字“ProgScope”,并在“Location”編輯框內(nèi)填寫工程所在的目錄。我們選擇的是“E:\VCPP”。這樣,當(dāng)最后生成一個(gè)應(yīng)用程序時(shí),就在E:\VCPP的目錄在生成一個(gè)新目錄ProgScope,在“E:\VCPP\ProgScope”目錄下,存放的是與該工程有關(guān)的一系列文件。(3)單擊按鈕“Ok”,進(jìn)入到圖2.2所示的界面中。該界面讓用戶選擇Win32控制臺(tái)應(yīng)用程序的類型。我們選擇第一種“Aemptyproject”。單擊“Finish”按鈕,進(jìn)入到圖2.3所示的界面。(4)圖2.3是對(duì)生成工程總的信息描述,沒多大意義。單擊“OK”按鈕生成ProgScope應(yīng)用程序框架。2022/11/1883【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope
圖2.1選擇應(yīng)用程序類型對(duì)話框2022/11/1884【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope
圖2.2選擇控制臺(tái)工程類型圖2.3生成的控制臺(tái)工程信息2022/11/1885【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope2.在工程中增加C++源文件(1)單擊File|New,選擇Files選項(xiàng)卡,該選項(xiàng)下列出了VC可以使用的文件類型。我們選中C++SourceFile列表項(xiàng),并在右邊的File編輯框中輸入新建單文件C++文件名稱File1。同時(shí)選中“AddtoProject:”復(fù)選框。如圖2.4所示。最后按OK按鈕,返回到MicrosoftVisuallC++的主窗口,在其中輸入如下的程序源代碼:#include"iostream.h"externintFile2_x;//引用性聲明,表示要使用別的文件中的File2_x變量voidmain(){ cout<<"File2.cpp中的變量File2_x="<<File2_x<<endl;}2022/11/1886【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope
(2)用同樣的方法在工程ProgScope中添加另一個(gè)源文件File2.cpp,該文件中的代碼為:
externint
File2_x=222; //定義性聲明變量File2_x,它是一個(gè)程序作用域的變量,別的文件可以訪問它,前面的extern可省略
圖2.4在工程中增加源文件File1.cpp2022/11/1887【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為ProgScope
3.運(yùn)行該工程按“Ctrl+F5”,VC編譯器編譯、鏈接并運(yùn)行該程序,程序的運(yùn)行結(jié)果為:
File2.cpp中的變量File2_x=222自己嘗試把File2.cpp中的語句“externint
File2_x=222;”
前的extern改為static,看程序還能不能運(yùn)行,并分析原因。2022/11/1888【例2-4】建立一個(gè)包含多個(gè)文件的程序。該工程的名字為Pro2.1.5 變量生存期及其分類 變量的生存期指程序運(yùn)行過程中變量占用內(nèi)存或寄存器的時(shí)間它由聲明變量時(shí)選擇的存儲(chǔ)類型來決定的。任何一個(gè)類型的變量都有自己的生存期,在生存期內(nèi),變量將保持它的值不變,直到它被更新止。變量生存期的分類靜態(tài)生存期動(dòng)態(tài)生存期2022/11/18892.1.5 變量生存期及其分類 變量的生存期2022/12.1.6* VC中的數(shù)據(jù)類型 衡量一種程序設(shè)計(jì)語言優(yōu)劣的首要標(biāo)準(zhǔn)就是它所提供的數(shù)據(jù)類型,能不能使用戶把客觀世界多種多樣形態(tài)的實(shí)際問題方便而又靈活地抽象為適當(dāng)數(shù)據(jù)類型加以處理。VC提供了豐富的數(shù)據(jù)類型,主要包括基本類型和非基本類型?;绢愋椭饕╟har(字符型)、int(整型)、shor(短整型)、long(長(zhǎng)整型)、bool(邏輯型)、float(單精度實(shí)數(shù))、double(雙精度實(shí)數(shù))等。非基本類型主要包括枚舉型(用enum定義)、數(shù)組型、指針型、空類型(void)、結(jié)構(gòu)體類型(用struct定義)、公用體類型(用union定義)和下一章要講的類類型(用class定義)。2022/11/18902.1.6* VC中的數(shù)據(jù)類型 衡量一種程序設(shè)計(jì)語言優(yōu)劣2.2指針與引用
2.2.1地址與指針的概念
2.2.2指針變量定義與賦值
2.2.3數(shù)組指針與指針數(shù)組
2.2.4動(dòng)態(tài)內(nèi)存分配:new與delete
2.2.5引用2022/11/18912.2指針與引用 2022/11/11232.2.1 地址與指針的概念VC語言擁有在運(yùn)行時(shí)獲得變量地址和操縱地址的能力,這種可用來操縱地址的變量類型就是指針。指針可以用于數(shù)組,用于內(nèi)存訪問,還可作為函數(shù)的參數(shù)。指針就是地址,它也是一種數(shù)據(jù)類型,具有指針類型的變量稱為指針變量。指針變量也是一個(gè)變量,只不過這個(gè)變量是用來放地址的,是用來存放別的變量地址的。2022/11/18922.2.1 地址與指針的概念VC語言擁有在運(yùn)行時(shí)獲得變量地址1.指針變量定義VC中指針變量的定義形式為:
數(shù)據(jù)類型名*指針變量名;注意:指針的類型為它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個(gè)指針的數(shù)據(jù)值都是unsignedlongint型。因此指向的類型不同,指針的類型就不同。2.2.2 指針變量定義與賦值例如:
inta,*pa;
double*p1;
POINT*p2;
CDC*pDC;
int(*p3)[6];int(*p4)();
2022/11/18931.指針變量定義VC中指針變量的定義形式為:注意:指針2.指針變量的賦
一個(gè)指針變量可以有三種狀態(tài):未賦任何值,“懸空”狀態(tài)(最嚴(yán)重的錯(cuò)誤);被賦予NULL值,(指向一個(gè)安全的位置);指向某一個(gè)變量(程序員必須用的操作)。2022/11/18942.指針變量的賦 一個(gè)指針變量可以有三種狀態(tài):2022/12.指針變量的賦值
int*ptr;floata=6.6,b,c[3];float*pa=&a;//聲明指針變量pa,并將浮點(diǎn)數(shù)a的地址賦給它float*pb=NULL;//將指針指向安全的位置float*pc=c;//將數(shù)組C的起始地址賦給指針變量pc下面是對(duì)一些指針變量賦值的例子:2022/11/18952.指針變量的賦值int*ptr;下面是對(duì)一些指針變量賦【例2-6】指針使用實(shí)例。
#include"iostream.h"#include<iomanip.h>voidmain(){ intx,y; int*ptr;//定義指針變量ptr y=20; x=10; ptr=&x;//對(duì)指針變量ptr初始化,使得其指向變量x cout<<"變量x的值為"<<dec<<x<<'\t'<<"ptr所指的變量的值為"<<*ptr<<endl; cout<<"變量x的地址值為"<<hex<<&x<<'\t'<<"ptr的值為"<<ptr<<'\n'; ptr=&y;//對(duì)指針變量ptr重新賦值,使得其指向變量y cout<<"變量y的值為"<<dec<<y<<'\t'<<"ptr所指的變量的值為"<<*ptr<<endl; cout<<"變量y的地址值為"<<hex<<&y<<'\t'<<"ptr的值為"<<ptr<<'\n';}2022/11/1896【例2-6】指針使用實(shí)例。 #include"iostr2.2.3 數(shù)組指針與指針數(shù)組1.?dāng)?shù)組
數(shù)學(xué)上,常用一個(gè)向量(vector)表示一些相關(guān)數(shù)據(jù)組成的序列,在程序設(shè)計(jì)語言中是用數(shù)組來表示的。數(shù)組是由一定數(shù)目的同類元素順序排列而成的結(jié)構(gòu)類型數(shù)據(jù)(可把數(shù)組看成一種數(shù)據(jù)類型,一種復(fù)合數(shù)據(jù)類型)。在計(jì)算機(jī)中,一個(gè)數(shù)組在內(nèi)存中占有一片連續(xù)的存儲(chǔ)區(qū)域,VC的數(shù)組名就是這塊存儲(chǔ)空間的地址。例如:intscore[100];2022/11/18972.2.3 數(shù)組指針與指針數(shù)組1.?dāng)?shù)組 數(shù)學(xué)上,常用一個(gè)2.?dāng)?shù)組指針數(shù)組指針是一個(gè)指針,該指針指向的是數(shù)據(jù)類型是數(shù)組類型,它存放的是數(shù)組的起始地址。其實(shí)數(shù)組中的每一個(gè)元素都是一個(gè)變量,既然是變量,則他們就具有地址。C++規(guī)定,數(shù)組的地址用數(shù)組名來表示,即數(shù)組名表示的是第一個(gè)元素的地址。例如: int(*ArrayPtr)[100];2022/11/18982.?dāng)?shù)組指針數(shù)組指針是一個(gè)指針,該指針指向的是數(shù)據(jù)類型是數(shù)組2.2.4 動(dòng)態(tài)內(nèi)存分配:
new與delete
在VC中,動(dòng)態(tài)內(nèi)存分配技術(shù)可以保證我們?cè)诔绦蜻\(yùn)行的過程中,根據(jù)實(shí)際需要而申請(qǐng)適量的內(nèi)存,在使用結(jié)束后還可以釋放。這些功能的實(shí)現(xiàn)靠new和delete
函數(shù)。
1.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動(dòng)合同違約責(zé)任及典型案例分析
- 家庭用工合同模板參考范本
- 篇二:購房合同范本規(guī)范
- 室內(nèi)防水改造合同范本
- 定制旅行服務(wù)協(xié)議合同
- 房地產(chǎn)開發(fā)施工合同樣本
- 金融市場(chǎng)中銀行承兌質(zhì)押合同的法律效力
- 兼職市場(chǎng)拓展合同樣本
- 發(fā)射設(shè)備在極端環(huán)境下的穩(wěn)定性檢測(cè)考核試卷
- 塑膠跑道材料的生產(chǎn)工藝與質(zhì)量控制考核試卷
- 2024年12月廣東廣州市港務(wù)局直屬事業(yè)單位引進(jìn)緊缺專業(yè)人才8人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 七下綜合世界真奇妙-共享“地球村”
- DBJ50-T-100-2022 建筑邊坡工程施工質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
- 2025年寧夏工商職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫含答案解析
- DB11-T 1004-2023 房屋建筑使用安全檢查評(píng)定技術(shù)規(guī)程
- 《藝術(shù)與傳播》課件
- 烹飪安全知識(shí)培訓(xùn)課件
- 2025年湖北宜昌枝江金潤(rùn)源集團(tuán)招聘17人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2023CSCO兒童及青少年白血病診療指南
- 初中物理競(jìng)賽及自主招生專題講義:第8講 電路 (共5節(jié))含解析
- 2024解析:第八章牛頓第一定律、二力平衡-基礎(chǔ)練(解析版)
評(píng)論
0/150
提交評(píng)論