C++面向?qū)ο蟪绦蛟O(shè)計課件第三章 C++程序的結(jié)構(gòu)_第1頁
C++面向?qū)ο蟪绦蛟O(shè)計課件第三章 C++程序的結(jié)構(gòu)_第2頁
C++面向?qū)ο蟪绦蛟O(shè)計課件第三章 C++程序的結(jié)構(gòu)_第3頁
C++面向?qū)ο蟪绦蛟O(shè)計課件第三章 C++程序的結(jié)構(gòu)_第4頁
C++面向?qū)ο蟪绦蛟O(shè)計課件第三章 C++程序的結(jié)構(gòu)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計第三章

C++程序的結(jié)構(gòu)3.1作用域和可見性3.2生存期3.3變量的存儲類型3.4編譯預(yù)處理和多文件結(jié)構(gòu)項目設(shè)計2預(yù)處理及多文件結(jié)構(gòu)18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.1作用域和可見性3.1.1作用域3.1.2可見性18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.1.1作用域作用域是標識符在程序中有效的范圍塊作用域當標識符的聲明出現(xiàn)在由一對大括號所括起來的一段程序(塊)內(nèi)時,該標識符的作用域從聲明點開始,到塊結(jié)束的大括號處為止,該作用域的范圍具有局部性。例如,如下代碼:

voidfun(inta)//a的作用域起始處{ intb=1;//b的作用域起始處

18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.1.1作用域函數(shù)原型作用域函數(shù)原型作用域指的是在聲明函數(shù)原型所指定的參數(shù)標識符的作用范圍。if(a>b) { intc;//c的作用域起始處

c=a-b; cout<<c; ... }//c的作用域終止處}//a和b的作用域終止處18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.1.1作用域這個作用范圍是在函數(shù)原型聲明中的左、右括號之間。函數(shù)作用域在C++語言中,只有g(shù)oto語句中的標號標識符具有函數(shù)作用域。由于goto語句的濫用導(dǎo)致程序流程無規(guī)則、可讀性差。因此現(xiàn)代程序設(shè)計方法不主張使用goto語句。文件作用域文件作用域是在所有函數(shù)定義之外聲明的,其作用域從聲明之處開始,直到文件結(jié)束。18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.1.2可見性可見性是從對標識符的引用的角度來談的概念。如果標識符在某處可見,則就可以在該處引用此標識符。程序運行到某一點能夠引用到的標識符就是該處可見的標識符。作用域指的是標識符有效的范圍,而可見性是分析在某一位置標識符的有效性。18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.1.2可見性作用域可見性的一般規(guī)則是:標識符應(yīng)聲明在前,引用在后。在同一作用域中,不能聲明同名的標識符。在沒有互相包含關(guān)系的不同的作用域中聲明的同名標識符互不影響。對于兩個嵌套的作用域,如果在內(nèi)層作用域內(nèi)聲明了與外層作用域中同名的標識符,則外層作用域的標識符在內(nèi)層不可見。18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.1.2可見性作用域與可見性實例:#include<iostream>usingnamespacestd;inti; //變量i具有文件作用域voidmain(){ i=5; //文件作用域的i賦初值

{ //子塊1 inti;//變量i具有塊作用域

i=7; cout<<"i="<<i<<endl;//輸出7 } cout<<"i="<<i<<endl;//輸出5}18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.2生存期3.2.1靜態(tài)生存期3.2.2動態(tài)生存期18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.2.1靜態(tài)生存期靜態(tài)生存期與程序的運行期相同,只要程序一開始運行,這種生命期的變量就存在,當程序結(jié)束時,其生命期就結(jié)束。具有靜態(tài)生命期的變量在定義時就分配固定的存儲單元,并一直保持不變,直至整個程序結(jié)束。如果要在函數(shù)內(nèi)部的塊作用域中聲明具有靜態(tài)生存期的變量,則要使用關(guān)鍵字static,例如下列語句聲明的變量i便是具有靜態(tài)生存期的變量,也稱為靜態(tài)變量:staticinti;靜態(tài)生命期的變量,若無顯式初始化,則自動初始化為0。18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.2.2動態(tài)生存期在塊作用域中聲明的變量具有動態(tài)生存期,也可稱為局部生存期變量。這種變量的生存期開始于程序執(zhí)行經(jīng)過其聲明點時,而結(jié)束于其作用域結(jié)束處。具有動態(tài)生存期的變量是在程序執(zhí)行過程中,使用它的時候才分配存儲單元,使用完畢就立即釋放。18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.2.2動態(tài)生存期變量的動態(tài)生存期與可見性例子#include<iostream>usingnamespacestd;inti=1; //i具有文件作用域和靜態(tài)生存期voidmain(void){//a具有塊作用域和靜態(tài)生存期,局部可見。staticinta;

intb=-10; //b,c具有塊作用域和動態(tài)生存期。

intc=0;voidother(void);cout<<"---MAIN---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;

18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.2.2動態(tài)生存期

c=c+8;other();cout<<"---MAIN---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;i=i+10;other();}voidother(void){staticinta=2;staticintb;//a,b具有塊作用域和靜態(tài)生存期,局部可見

//只在第一次進入函數(shù)時被初始化。

18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.2.2動態(tài)生存期intc=10;//C具有塊作用域和動態(tài)生存期

//每次進入函數(shù)時都初始化。

a=a+2;i=i+32;c=c+5;cout<<"---OTHER---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;b=a;}18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.3變量的存儲類型3.3.1局部變量3.3.2全局變量3.3.3外部變量18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.3.1局部變量具有塊作用域的變量稱為局部變量。一般說來,用自動存儲類型(auto)聲明的變量都是限制在某個程序范圍內(nèi)使用的,即為局部變量。使用關(guān)鍵字register聲明寄存器類型的變量的目的是將所聲明的變量放入寄存器內(nèi),從而加快程序的運行速度。靜態(tài)類型(static)變量也是一種局部變量。它和自動存儲類型變量的最大不同之處在于:靜態(tài)存儲類型變量在內(nèi)存中是以固定地址存放的,而不是以堆棧方式存放的。18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.3.1局部變量在C++語言中,聲明局部變量的時候加上關(guān)鍵字static就構(gòu)成了靜態(tài)局部變量。局部變量實例參見教材[例3-3]18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.3.2全局變量具有文件作用域的變量稱為全局變量。在程序中聲明的全局變量總是靜態(tài)存儲類型,若在全局變量前加上static,使該變量只在這個源程序文件內(nèi)使用,稱為全局靜態(tài)存儲變量或靜態(tài)存儲全局變量。全局變量實例參見教材[例3-4]18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.3.3外部變量使用關(guān)鍵字extern聲明的變量稱為外部變量。一般是指定義在本程序外部的變量。extern定義符的作用是將全局變量的作用域延伸到其它源程序文件。在C++中,只有在兩種情況下要使用外部變量。第一種情況是在同一個源程序文件中,若定義的變量使用在前,聲明在后,這時在使用前要聲明為外部變量。(參見教材[例3-5])第二種情況,當由多個源文件組成一個完整的程序時,在一個源程序文件中完全定義的變量要被其他若干個源文件引用時,引用的文件中要使用extern聲明外部變量。(參見教材[例3-6])18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.4編譯預(yù)處理和多文件結(jié)構(gòu)3.4.1編譯預(yù)處理命令3.4.2多文件組織結(jié)構(gòu)18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.4.1編譯預(yù)處理命令預(yù)處理程序又稱預(yù)處理器,它包含在編譯器中。編譯器在對源程序進行編譯之前,首先要由預(yù)處理程序?qū)Τ绦蛭谋具M行預(yù)處理,把源代碼轉(zhuǎn)化成包含機器語言指令的目標文件。宏定義指令#define和#undef在程序中可用#define來定義一個符號常量,例如:#definePI3.1415926#define還可以定義帶參數(shù)的宏,例如:#difineMIN(x,y)((x)<(y)?(x):(y))18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.4.1編譯預(yù)處理命令#undef的作用是刪除由#define定義的宏,使之不再起作用。文件包含指令#include所謂“文件包含”是指將另一個源文件嵌入到當前源文件中該點處。文件包含指令有兩種格式:#include<文件名>這種格式用于嵌入C++提供的頭文件。這些頭文件一般位于C++系統(tǒng)目錄的include子目錄下。#include"文件名"預(yù)處理器遇到這種格式的包含指令后,首先在當前文件所在目錄中進行搜索,如果找不到,再按標準方式搜索。這種方式適合于規(guī)定用戶自己建立的頭文件。18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.4.1編譯預(yù)處理命令條件編譯指令一般情況下,源程序中所有的語句都參加編譯,但有時也希望根據(jù)一定的條件去編譯源文件的不同部分,這就是“條件編譯”。C++提供的條件編譯語句有下列幾種常用的形式:

#if形式#if<表達式>//當表達式值為真(非零)時編譯程序段1<程序段1>[#else//當表達式值為假(零)時編譯程序段2<程序段2>]#endif18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.4.1編譯預(yù)處理命令#ifdef形式或#ifndef形式#ifdef(或#ifndef)<標識符><程序段1>[#else<程序段2>]#endif#if-#elif形式#if<表達式1>//當表達式1值為真(非零)時編譯程序段1<程序段1>[#elif<表達式2>//當表達式1值為假、表達式2值為真時編譯程序段2<程序段2>…[#elif<表達式n><程序段n>]//當表達式1、…表達式n-1值均為假,表達式n值為真時編譯程序段n[#else<程序段n+1>]//其他情況下編譯程序段n-1#endif

18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.4.1編譯預(yù)處理命令編譯預(yù)處理命令實例參見教材[例3-7]18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.4.2多文件組織結(jié)構(gòu)在實際的程序設(shè)計中,一個程序通常由多個頭文件和源文件組成,每個源文件是一個可編譯的程序單位,頭文件起著源文件之間接口的作用。從下面的程序開發(fā)示意圖來看看多文件的組織結(jié)構(gòu):18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.4.2多文件組織結(jié)構(gòu)18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計3.4.2多文件組織結(jié)構(gòu)圖中,源文件中含有包含頭文件的預(yù)編譯語句,經(jīng)過預(yù)編譯后,產(chǎn)生翻譯單元,然后編譯,進行語法檢查,產(chǎn)生目標文件(.obj)。若干個目標文件經(jīng)過連接,產(chǎn)生可執(zhí)行文件(.exe)。多文件組織結(jié)構(gòu)實例參見[例3-8]

18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計項目設(shè)計2預(yù)處理及多文件結(jié)構(gòu)設(shè)計題目預(yù)處理及多文件結(jié)構(gòu)設(shè)計概要要求掌握多文件C++程序的編碼方法和預(yù)處理的使用。系統(tǒng)分析書寫頭文件時應(yīng)該遵循的幾點規(guī)則:為了防止頭文件被重復(fù)引用,應(yīng)當用ifndef/define/endif結(jié)構(gòu)產(chǎn)生預(yù)處理塊。18十二月2023C++面向?qū)ο蟪绦蛟O(shè)計項目設(shè)計2預(yù)處理及多文件結(jié)構(gòu)用#include<filename.h>格式來引用標準庫的頭文件(編譯器將從標準庫目錄開始搜索)。用#includee”filename.h”格式來引用非標準庫的頭文件(編

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論