版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
面向?qū)ο缶幊碳夹g(shù)與方法(C++)
第1章面向?qū)ο缶幊碳夹g(shù)概述第1章面向?qū)ο缶幊碳夹g(shù)概述第1章
面向?qū)ο缶幊碳夹g(shù)概述
1.1兩種編程方法舉例
1.1.1面向過程編程方法
1.1.2面向?qū)ο缶幊谭椒?/p>
1.2面向?qū)ο缶幊痰幕咎卣?/p>
1.2.1抽象
1.2.2封裝
1.2.3繼承
1.2.4多態(tài)
1.3程序的編譯、連接與運行
1.4C++標(biāo)準(zhǔn)庫簡介
1.5小結(jié)
第1章面向?qū)ο缶幊碳夹g(shù)概述1.1兩種編程方法舉例
1.2面向?qū)ο缶幊痰幕咎卣?/p>
1.3程序的編譯、連接與運行
1.4C++標(biāo)準(zhǔn)庫簡介
1.5小結(jié)
第1章面向?qū)ο缶幊碳夹g(shù)概述1.1兩種編程方法舉例程序運行后,屏幕上顯示:
Pleaseinputradius:如果我們從鍵盤輸入:
3
屏幕上將顯示:
area=28.2743第1章面向?qū)ο缶幊碳夹g(shù)概述面向過程,就是站在機器的角度,分析出解決問題所需要的步驟或過程。面向過程的程序結(jié)構(gòu)為“程序=算法+數(shù)據(jù)。這類程序的缺點是:代碼重用性不好、不易擴展、難以維護。C++語言支持面向過程編程,但是比C語言有很多改進:如對類型要求更加嚴(yán)格,輸入和輸出更加方便,增加了新的運算符,允許函數(shù)重載(overloading)和運算符重載,增加了引用(reference)類型,提出了內(nèi)嵌(inline)概念,提供常類型關(guān)鍵字const等。總之,在支持面向過程編程方面,C++比C更安全、功能更強、使用更方便。第1章面向?qū)ο缶幊碳夹g(shù)概述第1章面向?qū)ο缶幊碳夹g(shù)概述與我們認(rèn)識客觀世界的思維方式一樣,面向?qū)ο缶幊碳夹g(shù)將程序設(shè)計為對象之間通過消息進行通信的相互協(xié)作。程序中的對象,是指具有唯一地址的、占據(jù)計算機一塊內(nèi)存區(qū)域的實體,和現(xiàn)實世界中的對象一樣,由屬性和行為構(gòu)成,也就是數(shù)據(jù)結(jié)構(gòu)和算法的封裝體。抽象數(shù)據(jù)類型,簡稱為類(class),是對同類對象共同特征的描述。面向?qū)ο缶幊碳夹g(shù)提供代碼重用機制,可以提高程序員的編程效率,適用于解決復(fù)雜問題和開發(fā)大型軟件。程序具有代碼重用性好、易擴展、便于維護的優(yōu)點。第1章面向?qū)ο缶幊碳夹g(shù)概述1.1兩種編程方法舉例
1.2面向?qū)ο缶幊痰幕咎卣?/p>
1.3程序的編譯、連接與運行
1.4C++標(biāo)準(zhǔn)庫簡介
1.5小結(jié)
第1章面向?qū)ο缶幊碳夹g(shù)概述1.2面向?qū)ο缶幊痰幕咎卣鳎撼橄螅庋b,繼承,多態(tài)抽象(abstract):數(shù)據(jù)抽象和行為抽象。其中,數(shù)據(jù)抽象描述某類對象共有的本質(zhì)特征或?qū)傩?;行為抽象描述某類對象共有的行為特征。?章面向?qū)ο缶幊碳夹g(shù)概述1.2面向?qū)ο缶幊痰幕咎卣鳎撼橄螅庋b,繼承,多態(tài)封裝(encapsulation):把抽象出來的同類對象的屬性和行為用一對花括號封裝起來,就形成了一個新的數(shù)據(jù)類型,或簡稱為新的類。類的公有成員聲明部分就是類的對外接口。第1章面向?qū)ο缶幊碳夹g(shù)概述1.2面向?qū)ο缶幊痰幕咎卣鳎撼橄?,封裝,繼承,多態(tài)繼承(inheritance):就像子女能夠繼承父母的某些特征一樣,我們在原有類型的基礎(chǔ)上可以派生出新的類型。繼承能很好地表達相關(guān)數(shù)據(jù)類型之間的邏輯關(guān)系,并提供一種代碼重用方式,利于提高軟件開發(fā)效率。第1章面向?qū)ο缶幊碳夹g(shù)概述1.2面向?qū)ο缶幊痰幕咎卣鳎撼橄螅庋b,繼承,多態(tài)多態(tài)性(polymorphism):指具有不同功能的函數(shù)可以用同一個函數(shù)名,這樣就可以用一個函數(shù)名調(diào)用不同實現(xiàn)內(nèi)容的函數(shù)。編譯時的多態(tài),早綁定(earlybinding),靜態(tài)綁定(staticbinding)運行時的多態(tài),晚綁定(latebinding),動態(tài)綁定(dynamicbinding)在面向?qū)ο蟪绦蛟O(shè)計中,強調(diào)的是動態(tài)的多態(tài)性,通過虛(virtual)函數(shù)機制來實現(xiàn),主要是為了讓處理基類對象的程序代碼能夠完全無阻礙地處理派生類對象。第1章面向?qū)ο缶幊碳夹g(shù)概述1.1兩種編程方法舉例
1.2面向?qū)ο缶幊痰幕咎卣?/p>
1.3程序的編譯、連接與運行
1.4C++標(biāo)準(zhǔn)庫簡介
1.5小結(jié)
第1章面向?qū)ο缶幊碳夹g(shù)概述1.3程序的編譯、連接與運行要得到一個用C++設(shè)計的可執(zhí)行文件,通常需經(jīng)過編輯、編譯、連接幾個步驟。用編輯器編輯一個C++源程序,如ex1-1.cpp;用編譯器對源程序進行編譯,形成目標(biāo)文件ex1-1.obj;通過連接器將目標(biāo)文件變成可執(zhí)行文件。多文件應(yīng)用程序會產(chǎn)生多個目標(biāo)文件,連接時要將多個目標(biāo)文件及需要的庫文件連在一起,最后生成一個后綴名為.exe的可執(zhí)行文件第1章面向?qū)ο缶幊碳夹g(shù)概述以VisualStudio2019開發(fā)環(huán)境為例介紹程序的編譯、連接與運行(演示):打開VisualStudio2019,選擇【創(chuàng)建新項目】選項,彈出創(chuàng)建新項目對話框創(chuàng)建一個新項目(Project)新建一個C++源程序文件編輯C++源程序文件內(nèi)容,可以是例1-1中的代碼。編譯、連接與執(zhí)行退出VisualStudio2019。第1章面向?qū)ο缶幊碳夹g(shù)概述1.1兩種編程方法舉例
1.2面向?qū)ο缶幊痰幕咎卣?/p>
1.3程序的編譯、連接與運行
1.4C++標(biāo)準(zhǔn)庫簡介
1.5小結(jié)
第1章面向?qū)ο缶幊碳夹g(shù)概述1.4C++標(biāo)準(zhǔn)庫簡介C++標(biāo)準(zhǔn)庫定義了一些可供直接使用的函數(shù)、類、對象等。這些定義分別放在不同的頭文件中,我們使用時只要包含相應(yīng)的頭文件即可。以前的C頭文件和C++頭文件名都是以“.h”做后綴的,如<stdio.h>和<iostream.h>。新的C++標(biāo)準(zhǔn)頭文件名不帶后綴。標(biāo)準(zhǔn)頭文件中定義的標(biāo)識符(如類名、函數(shù)名、對象名)都?xì)w屬于名字空間std,使用時要加前綴“std::”進行限制,或者使用using聲明或using指令。第1章面向?qū)ο缶幊碳夹g(shù)概述第1章面向?qū)ο缶幊碳夹g(shù)概述1.1兩種編程方法舉例
1.2面向?qū)ο缶幊痰幕咎卣?/p>
1.3程序的編譯、連接與運行
1.4C++標(biāo)準(zhǔn)庫簡介
1.5小結(jié)
第1章面向?qū)ο缶幊碳夹g(shù)概述1.5小結(jié)面向?qū)ο缶幊碳夹g(shù)的基本特征是抽象、封裝、繼承和多態(tài)。抽象包括數(shù)據(jù)抽象和行為抽象兩方面,把抽象出來的同類對象的屬性和行為封裝起來就形成一個新類型,通過繼承和多態(tài)機制可以繼續(xù)擴展數(shù)據(jù)類型。利用面向?qū)ο笏枷刖帉懙某绦?,代碼重用性好、容易擴展、便于后期維護,適用于解決復(fù)雜問題和開發(fā)大型軟件。C++是一個功能強大的計算機編程語言,支持面向?qū)ο蟮木幊碳夹g(shù)。THANKS面向?qū)ο缶幊碳夹g(shù)與方法(C++)
第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)第2章
C++編程基礎(chǔ)
2.1C++的詞法規(guī)則
2.1.1字符集
2.1.2單詞
2.2C++的數(shù)據(jù)類型
2.2.1基本數(shù)據(jù)類型
2.2.2常量與變量
2.2.3自定義數(shù)據(jù)類型
2.2.4擴展數(shù)據(jù)類型
2.2.5類型轉(zhuǎn)換
2.2.6typedef與typeid 2.3表達式與語句
2.3.1表達式
2.3.2語句
2.4預(yù)處理命令
2.4.1宏定義命令
2.4.2文件包含命令
2.4.3條件編譯命令
2.5名字空間
2.5.1名字空間聲明
2.5.2使用名字空間
2.5.3標(biāo)準(zhǔn)名字空間std 2.6小結(jié)第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則
2.2C++的數(shù)據(jù)類型
2.3表達式與語句
2.4預(yù)處理命令
2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則—字符集、單詞2.1.1字符集
大小寫的英文字母:A~Z,a~z
數(shù)字字符:0~9
特殊字符:基本ASCII碼是美國標(biāo)準(zhǔn)信息交換碼,把128個字符與7位二進制數(shù)碼對應(yīng)。C++把字符和它的碼值同等看待,字符對應(yīng)的數(shù)值就是該字符的ASCII碼。參見例2-1。運行結(jié)果:
ch=Aa=65第2章C++編程基礎(chǔ)2.1.2單詞
關(guān)鍵字:預(yù)定義的單詞,表達特定的含義,不允許重定義標(biāo)識符:是程序員聲明的單詞,例如函數(shù)名、類名、對象名等。要求:1)以字母或者下劃線開始;2)由字母、數(shù)字或者下劃線組成。區(qū)分大/小寫,且不能使用預(yù)定義的關(guān)鍵字。運算符:如+、-、*、/等。是預(yù)定義的函數(shù)的名字。分隔符:用于分割各個單詞或者程序正文。如:空格、制表、換行、逗號、冒號、分號、圓括號、花括號、注釋符等。文字:在程序中直接表示常量值,包括數(shù)字、字符、字符串和布爾文字。第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則
2.2C++的數(shù)據(jù)類型
2.3表達式與語句
2.4預(yù)處理命令
2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型基本數(shù)據(jù)類型,或稱為內(nèi)置數(shù)據(jù)類型,包括:布爾型(bool)、字符型(char)、整型(int)、浮點型(float,double)、空類型(void)??捎胹igned、unsigned修飾字符型和整型,long可用來修飾整型和雙精度浮點型,short可以修飾整型。用戶自定義數(shù)據(jù)類型:在基本數(shù)據(jù)類型或者已定義的數(shù)據(jù)類型基礎(chǔ)上,用戶根據(jù)自己的需要,構(gòu)造出的新類型。如:枚舉、聯(lián)合、結(jié)構(gòu)、類等。將數(shù)據(jù)與操作數(shù)據(jù)的算法/函數(shù)封裝在一起所建立的類型,被稱作抽象數(shù)據(jù)類型,即類類型。擴展數(shù)據(jù)類型:在已定義的數(shù)據(jù)類型基礎(chǔ)上,結(jié)合某些修飾符(如[]、*、&、())或者關(guān)鍵字(如const),可以得到擴展數(shù)據(jù)類型,如數(shù)組、指針、引用等。第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型
2.2.1基本數(shù)據(jù)類型
2.2.2常量與變量 2.2.3自定義數(shù)據(jù)類型 2.2.4擴展數(shù)據(jù)類型 2.2.5類型轉(zhuǎn)換 2.2.6typedef與typeid第2章C++編程基礎(chǔ)2.2.1基本數(shù)據(jù)類型 布爾型(bool),或邏輯型,占用1個字節(jié),其值只能是真(true)或假(false)兩種情況,一般用“1”表示true,用“0”表示false字符型(char),表示單個ASCII字符或者相應(yīng)的整數(shù)值,占用1個字節(jié),在內(nèi)存中以ASCII碼值的形式存儲。整型(int),修飾符short、long、signed、unsigned浮點型(float,double),即實數(shù),單精度、雙精度和長雙精度空類型(void),表示函數(shù)無返回值、或指針?biāo)笇ο蟮念愋筒幻鞔_第2章C++編程基礎(chǔ)基本數(shù)據(jù)類型所占用的內(nèi)存情況參見表2-3。第2章C++編程基礎(chǔ)可以通過運算符sizeof,測試在自己的機器環(huán)境下某種數(shù)據(jù)類型或?qū)ο笏加玫膬?nèi)存大小。第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型2.2.1基本數(shù)據(jù)類型
2.2.2常量與變量
2.2.3自定義數(shù)據(jù)類型 2.2.4擴展數(shù)據(jù)類型 2.2.5類型轉(zhuǎn)換 2.2.6typedef與typeid第2章C++編程基礎(chǔ)2.2.2常量與變量 1.文字常量:在程序運行過程中,其值不可改變。包括:文字、宏定義的符號常量、const常量等。變量:在程序運行過程中,其值可以改變。布爾文字,true,false整型文字,例如,-1000L表示長整數(shù),1000UL表示無符號長整數(shù),U和L不分前后。八進制表示0767L,十六進制表示0x76fL等。浮點型文字,12.5,.65F,2.5E-3,1e+5F,.28E12L字符文字,(1)‘A’,‘4’;(2)用八進制或十六進制的ASCII碼值表示:如‘A’又可以表示為‘\101’,或者‘\x41’;(3)如‘\n’表示換行符,參見表2-4。字符串文字,‘’a‘’,‘‘book’’,以字符‘\0’結(jié)尾。因此,字符'a'占一個字節(jié),而字符串''a''占兩個字節(jié)。第2章C++編程基礎(chǔ)2.2.2常量與變量 2.變量與對象變量(或?qū)ο螅┮话憔哂忻Q(通過new創(chuàng)建的對象沒有名稱)、類型、數(shù)值、地址這四個要素。定義變量時,系統(tǒng)會在內(nèi)存中為該變量分配一塊連續(xù)區(qū)域,變量的地址就是該區(qū)域的首地址。C語言習(xí)慣使用“變量”這個術(shù)語。C++中的對象,強調(diào)的是分配好的、具體的一塊內(nèi)存區(qū)域,并且具有唯一的地址。每個對象都與一個特定的數(shù)據(jù)類型相關(guān)聯(lián),這個類型決定了相關(guān)內(nèi)存的大小、布局、能夠存儲在該區(qū)域的值的范圍以及可以對該區(qū)域進行哪些操作等。數(shù)據(jù)類型不僅包括基本數(shù)據(jù)類型,更重要的是抽象數(shù)據(jù)類型。第2章C++編程基礎(chǔ)2.變量與對象--對象的聲明和定義標(biāo)識符(如對象名、類名、函數(shù)名等)在使用之前要先進行聲明或定義。聲明是告訴編譯器“這個標(biāo)識符在某處進行了定義”。定義是說“在這里創(chuàng)建對象、函數(shù)等”,并分配相應(yīng)的存儲空間。多數(shù)情況下對象聲明也就是定義(對全局對象進行extern聲明時例外)。
floatf1,f2,f3,f4;floatf=2.5;或者floatf(2.5);類對象通過調(diào)用構(gòu)造函數(shù)進行初始化。2.2.2常量與變量 第2章C++編程基礎(chǔ)2.變量與對象--標(biāo)識符的作用域和可見性①作用域指標(biāo)識符在程序正文中的有效范圍,例如程序塊域、函數(shù)域、類域、名字空間域、文件域等??梢娦杂懻摰氖菢?biāo)識符能否被使用。在具有包含關(guān)系的局部作用域中,同名的內(nèi)層對象將屏蔽外層對象,這時外層對象的標(biāo)識符是不可見的。在同一作用域中不能對同一個標(biāo)識符多次定義。2.2.2常量與變量 第2章C++編程基礎(chǔ)2.變量與對象--標(biāo)識符的作用域和可見性②在函數(shù)、類等之外定義的對象,默認(rèn)情況下的作用范圍具有全局性,即在整個程序運行期間起作用,所以稱之為全局對象。在局部作用域內(nèi),同名的局部對象將屏蔽全局對象。如果想在局部作用域內(nèi)使用全局對象,則應(yīng)利用作用域運算符“::”。參見例2-4。如果一個程序包含多個編譯單元,那么在一個編譯單元中定義的全局對象,不僅在該編譯單元可用,在其他編譯單元也可以使用,但要先進行extern聲明。參見例2-5。對于包含多個編譯單元的程序,如果想使全局對象只在定義它的編譯單元中起作用,則可以在定義時聲明它為static。參見例2-6。2.2.2常量與變量 第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)2.變量與對象—對象的生存期程序中的對象,一般在需要時被創(chuàng)建,不需要時則從內(nèi)存中刪除。在創(chuàng)建和刪除之間所經(jīng)歷的時間稱為對象的生存期。一般,局部對象的生存期與它的作用域同在,全局對象的生存期與程序的整個執(zhí)行過程同在。如果想使一個對象在整個程序執(zhí)行過程中都存在,同時又不希望像全局對象那樣存在安全隱患,這時可聲明static局部對象。聲明靜態(tài)局部對象時,一般要進行初始化。參見例2-7。2.2.2常量與變量 第2章C++編程基礎(chǔ)運行結(jié)果:
4,
5第2章C++編程基礎(chǔ)關(guān)于作用域與生存期的總結(jié):一般局部對象的作用域從對象的定義點開始,到它所在的程序塊結(jié)束為止;生存期與作用域同在。靜態(tài)局部對象的作用域與一般局部對象相同;生存期與整個程序同在。一般全局對象在程序的任意地方都可以使用;生存期與整個程序同在。靜態(tài)全局對象具有文件作用域;生存期與整個程序同在。用new建立的堆對象,其作用域和生存期由用戶確定。第2章C++編程基礎(chǔ)2.變量與對象—對象的存儲定義對象時,auto、register、static、extern是影響對象存儲類型的幾個關(guān)鍵字。存儲區(qū)域類型:(1)靜態(tài)存儲區(qū),全局對象、靜態(tài)對象和函數(shù)一般存儲于該區(qū)域,存儲區(qū)在程序開始執(zhí)行之前分配,在程序的整個運行期間都存在。(2)棧區(qū)(stack),程序執(zhí)行期間進行內(nèi)存分配。一般局部變量存于棧區(qū)。(3)堆區(qū)(heap),也稱為動態(tài)存儲區(qū)。程序運行時用new申請內(nèi)存,由程序員負(fù)責(zé)何時用delete釋放內(nèi)存。不同存儲類型的對象,被分配在不同的內(nèi)存區(qū)域參見例2-8。2.2.2常量與變量 第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)3.常量在C++標(biāo)準(zhǔn)化之前,當(dāng)需要用符號表示常量時,常用#define宏命令來定義,例如:
#definePI3.14159標(biāo)準(zhǔn)C++中用const定義常量,與定義變量的語法類似,只是在前面多了一個關(guān)鍵字const。
constdoublepi=3.14159;常量必須進行初始化,而且常量的值不能改變。全局const量,默認(rèn)具有文件作用域,這一點與一般全局對象不同。如果想使一個const在整個程序可用,那么定義時就要帶extern聲明。2.2.2常量與變量 第2章C++編程基礎(chǔ)4.
volatilevolatile的語法與const類似。關(guān)鍵字const告訴編譯器“不要改變我”,而關(guān)鍵字volatile則告訴編譯器“我可能會改變”。當(dāng)編譯器不進行優(yōu)化時,volatile不起作用;但當(dāng)優(yōu)化代碼時,用該關(guān)鍵字則可以防止出現(xiàn)錯誤。2.2.2常量與變量 第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型2.2.1基本數(shù)據(jù)類型 2.2.2常量與變量
2.2.3自定義數(shù)據(jù)類型
2.2.4擴展數(shù)據(jù)類型 2.2.5類型轉(zhuǎn)換 2.2.6typedef與typeid第2章C++編程基礎(chǔ)2.2.3自定義數(shù)據(jù)類型 在基本數(shù)據(jù)類型基礎(chǔ)上,用戶可以根據(jù)需要構(gòu)造出新的數(shù)據(jù)類型,如枚舉、聯(lián)合、結(jié)構(gòu)、類等,這些都可以稱為自定義數(shù)據(jù)類型。一旦定義了一種新的數(shù)據(jù)類型,我們就可以像使用int一樣使用這種新類型。第2章C++編程基礎(chǔ)1.枚舉枚舉類型是若干個有名字的整型常量的集合,如:
enumShape{CIRCLE=-10,SQUARE=0,RECTANGLE=10};花括號內(nèi)的標(biāo)識符是枚舉常量,之間用逗號分隔;枚舉常量的類型為Shape,具有整數(shù)值,可用來初始化或更新Shape類型的對象:
Shapesh=SQUARE;//對象sh初值為SQUAREsh=RECTANGLE;//sh值改為RECTANGLE枚舉常量的值,最前邊的一個默認(rèn)為為0,其后的值依次加1;枚舉常量的值也可顯式定義,未顯式定義的則在前一個值的基礎(chǔ)上加1,如下面BLACK值為0,GREEN值為1,RED值為5,YELLOW值為6:
enumColor{BLACK,GREEN,BLUE=4,RED,YELLOW}2.2.3自定義數(shù)據(jù)類型 第2章C++編程基礎(chǔ)2.聯(lián)合聯(lián)合類型對象的每個成員都存儲在同一位置,最大存儲空間的需要量由需要存儲空間最大的成員決定。2.2.3自定義數(shù)據(jù)類型
sizeof(A.a)=4 sizeof(A.b)=8 sizeof(A)=8union
UnionX
{ inta; doubleb;};UnionXA;//A為對象第2章C++編程基礎(chǔ)3.結(jié)構(gòu)結(jié)構(gòu)類型由其他類型的數(shù)據(jù)成員組成,如可以把學(xué)生的學(xué)號、姓名、年齡、成績等放在一起,定義一種結(jié)構(gòu)類型。2.2.3自定義數(shù)據(jù)類型
sizeof(A.a)=4 sizeof(A.b)=8 sizeof(A)=12struct
StructX{ inta; doubleb;};StructXA;//A為對象第2章C++編程基礎(chǔ)3.類在上面的結(jié)構(gòu)類型中,我們把不同類型的數(shù)據(jù)封裝在一起。那么對于使用這些數(shù)據(jù)的算法(一般通過函數(shù)實現(xiàn)),我們是否也能封裝到一起?通過關(guān)鍵字class,可以定義一種新的數(shù)據(jù)類型,即類,例如:2.2.3自定義數(shù)據(jù)類型第2章C++編程基礎(chǔ)struct與classstruct類型中也可以封裝成員函數(shù)。struct類型與class類型的區(qū)別是:默認(rèn)情況下class中的成員具有private訪問屬性,而struct中的成員具有public訪問屬性。可以把枚舉enum、聯(lián)合union和結(jié)構(gòu)struct看作是類class的特殊情況。第2章C++編程基礎(chǔ)4.類模板為了減少程序員的重復(fù)勞動,對于功能相同而成員類型不同的類,允許聲明一個通用的類模板。通過類模板可以生成不同的類。第8章介紹類模板的定義與使用。C++標(biāo)準(zhǔn)庫為我們定義了很多可供直接使用的類(模板),如string、pair、complex、valarray、流類、容器類、迭代器等,使用時只要包含相應(yīng)的頭文件即可。2.2.3自定義數(shù)據(jù)類型第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型2.2.1基本數(shù)據(jù)類型 2.2.2常量與變量 2.2.3自定義數(shù)據(jù)類型
2.2.4擴展數(shù)據(jù)類型
2.2.5類型轉(zhuǎn)換 2.2.6typedef與typeid第2章C++編程基礎(chǔ)2.2.4擴展數(shù)據(jù)類型在基本數(shù)據(jù)類型或者自定義數(shù)據(jù)類型基礎(chǔ)上,結(jié)合運用修飾符(如[]、*、&、())或者關(guān)鍵字(如const),可以得到擴展數(shù)據(jù)類型,如數(shù)組、指針、引用等。1.數(shù)組數(shù)組是數(shù)目固定、類型相同的若干個對象的有序集合,這些對象稱為數(shù)組的元素。數(shù)組定義形式:
類型數(shù)組名[維1][維2]…={{初值表},{初值表}…};inta[5]={2,1,3,5,6};intb[2][3]={{1,0,2},{3,6,5}};ClassXobj[2][3];第2章C++編程基礎(chǔ)數(shù)組元素的各維下標(biāo)都從0開始;數(shù)組名對應(yīng)數(shù)組的起始地址,是常量;而數(shù)組元素一般是變量;各元素在內(nèi)存中按下標(biāo)的升序連續(xù)存放,如:
inta[3];//a[0],a[1],a[2];元素個數(shù):sizeof(a)/sizeof(a[0])intb[2][2];//b[0][0],b[0][1],b[1][0],b[1][1]b[0]表示含2個元素b[0][0]、b[0][1]的一維數(shù)組,b[1]表示含2個元素b[1][0]、b[1][1]的一維數(shù)組使用數(shù)組時,不能對數(shù)組名進行直接拷貝和比較。如果想把一個數(shù)組拷貝到另一個中去,可以采用拷貝每個元素的方法。見例2-11。C++沒有提供對數(shù)組元素下標(biāo)進行范圍檢查的手段。采用標(biāo)準(zhǔn)庫中的容器vector,可以生成類似數(shù)組的對象,且能夠進行拷貝、自動調(diào)整大小等。參見例2-12。運行結(jié)果:
0.5第2章C++編程基礎(chǔ)2.2.4擴展數(shù)據(jù)類型2.指針指針是指能夠存放對象地址的對象。一個類型為T*的指針能夠保存T類型對象的地址。指針本身也是一個對象,占據(jù)一定的內(nèi)存空間,具有自己的名字、值和地址。不同的是,指針的值是所指對象的地址,因此我們常說某指針“指向”某個對象。
例如:
inta=102;
int*
pa=&a;可以通過指針修改它所指向的對象的值。如:*pa=100;//通過pa修改a的值也可以定義指向類對象的指針,例如:
ClassXobj; ClassX*p=&obj;雖然在聲明指針時可以不進行初始化,但這樣的指針是懸空的,使用時容易出現(xiàn)錯誤。因此應(yīng)該養(yǎng)成定義時進行初始化的習(xí)慣。第2章C++編程基礎(chǔ)指針與數(shù)組在C++程序中,數(shù)組名對應(yīng)數(shù)組的起始地址,數(shù)組名和指針名經(jīng)常可以互換使用。參見例2-13。但是,數(shù)組和指針是不同的。數(shù)組名所指內(nèi)存區(qū)的地址和容量在數(shù)組生命期內(nèi)是不變的??捎胹izeof(數(shù)組名)算出數(shù)組所占的字節(jié)數(shù)。而指針一般是變量,可以指向類型匹配的任意對象(即不同的內(nèi)存區(qū))。我們無法知道指針?biāo)竷?nèi)存區(qū)的大小,如用sizeof(指針名),得到的是指針本身所占的字節(jié)數(shù),而不是所指內(nèi)存的字節(jié)數(shù)。也可以定義元素為指針的數(shù)組,稱為指針數(shù)組:
doublef1=1.8,f2=2.8; double*p[2]={&f1,&f2};
第2章C++編程基礎(chǔ)指向常量的指針與常量型指針①定義指針時,如用關(guān)鍵字const修飾所指對象的數(shù)據(jù)類型,這時的指針就稱為指向常量的指針。指向常量的指針可以保存變量或者常量的地址,并且限制指針的訪問方式為“只讀”,即不能通過指針修改所指對象的值。 intv1=3; //變量v1 constintmax=100; //常量max,初始化! constint*p1=&v1;//指向常量的指針
*p1=5; //錯誤! p1=&max; //將常量max的地址賦給p1 *p1=10; //錯誤!第2章C++編程基礎(chǔ)指向常量的指針與常量型指針②定義指針時,如果在指針名前加關(guān)鍵字const修飾,則該指針是常量型指針。常量型指針必須進行初始化,然后指針的值不再改變,即指針的指向不變。但如果常量型指針?biāo)傅氖亲兞浚瑒t可以通過該指針修改所指變量的值。intv1=10,v2=20; //兩變量constintmax=100; //常量maxint*constpv1=&v1; //常量型指針指向v1pv1=&v2; //錯誤!指向不能再改變*pv1=v2; //正確!int*constpv2=&max;//錯誤!第2章C++編程基礎(chǔ)指向常量的指針與常量型指針③定義指針時,如果對數(shù)據(jù)類型和指針名都用了關(guān)鍵字const修飾,則這樣的指針稱為指向常量的常量型指針。這意味著定義之后,指針的值和所指對象的值都不能改變。 intv1=10,v2=20; //兩個變量 constintmax=100; //常量max constint*constpv1=&v1; constint*constpv2=&max; pv1=&v2; //錯誤!
*pv1=v2; //錯誤!第2章C++編程基礎(chǔ)2.2.4擴展數(shù)據(jù)類型3.引用引用可以理解為對象的別名,其聲明形式如下:
數(shù)據(jù)類型&引用名=被引用的對象名; intm=0;
int&n=m;//n是int型變量m的引用 n=n+5;//結(jié)果m=5 ClassXobj;
ClassX&newname=obj; 聲明引用時必須進行初始化,初值一般必須是對象名;const引用也可用常量或表達式的值初始化。引用一旦被初始化,就不能再指代其他對象。不過一個對象可以有多個引用。
第2章C++編程基礎(chǔ)2.2.4擴展數(shù)據(jù)類型引用和指針的區(qū)別指針用來保存對象的地址,引用相當(dāng)于對象的別名;聲明指針時要分配內(nèi)存(引用型除外),而聲明引用時不分配內(nèi)存;聲明引用時必須初始化,聲明指針時可以不初始化;指針可作數(shù)組元素,引用不能作數(shù)組元素;可以有指向void型的指針,而沒有void型引用;可以聲明指針的引用,而沒有指向引用的指針。
第2章C++編程基礎(chǔ)2.2.4擴展數(shù)據(jù)類型引用和指針的區(qū)別 intm1=0,m2=5; int*p1=&m1; //p1指向m1
int*&p2=p1; //p2是指針p1的引用,也指向m1 *p2=m2; //將m2的值5賦給p2所指向的對象即m1 int&n1=m1; //n1是m1的引用 int&*n2=n1; //錯誤!
第2章C++編程基礎(chǔ)2.2.4擴展數(shù)據(jù)類型4.字符串字符串是若干有效字符的序列。字符串常量由雙引號括起來,如"x+y=10"。字符串可以放在一個字符數(shù)組中,結(jié)束位置用符號‘\0’表示。定義字符數(shù)組時,可以逐個字符初始化,也可以用一個字符串常量初始化。例如: charstr1[]={'x','+','y','=','1','0','\0'}; charstr2[]="x+y=10"; //數(shù)組含7個元素
第2章C++編程基礎(chǔ)可以通過指向字符的指針管理字符串,例如:
charstr1[]={'x','+','y','=','1','0','\0'};char*cp=str1;//cp保存字符串str1的起始地址對字符指針可以用字符串常量初始化,但不能以數(shù)組元素形式初始化,因為cp只存放一個地址值。例如:
char*cp1="x+y=10"; //cp1保存串的起始地址
char*cp2={'x','+','y','=','1','0','\0'};//錯誤!定義字符串時,最好使用標(biāo)準(zhǔn)庫中的類string,該類封裝了字符串的基本特性和各種典型操作,如賦值、連接、比較、查找等。參見例2-14。第2章C++編程基礎(chǔ)運行結(jié)果:x+y=10,size=6第2章C++編程基礎(chǔ)2.2C++數(shù)據(jù)類型2.2.1基本數(shù)據(jù)類型 2.2.2常量與變量 2.2.3自定義數(shù)據(jù)類型 2.2.4擴展數(shù)據(jù)類型
2.2.5類型轉(zhuǎn)換
2.2.6typedef與typeid第2章C++編程基礎(chǔ)2.2.5類型轉(zhuǎn)換1.隱式轉(zhuǎn)換隱式轉(zhuǎn)換由編譯器自動完成,運算規(guī)則是從低類型向高類型提升。從高類型向低類型轉(zhuǎn)換會給出警告。inta=3.541+3;//結(jié)果a的值為6C++可以將某種指針類型(指向非const型)自動轉(zhuǎn)換成void*型,反過來則不行。inta=0;int*p1=&a;void*pv=p1;//OK.隱式轉(zhuǎn)換int*p2=pv;//錯誤!void*不能隱式轉(zhuǎn)換成int*constint*pci=&a;pv=pci;//錯誤!constint*不能隱式轉(zhuǎn)換成void*第2章C++編程基礎(chǔ)2.2.5類型轉(zhuǎn)換2.顯式轉(zhuǎn)換顯式轉(zhuǎn)換一般要通過類型轉(zhuǎn)換運算符強制實現(xiàn)類型轉(zhuǎn)換,因此也稱為強制轉(zhuǎn)換。可以通過強制類型轉(zhuǎn)換運算符實現(xiàn)類型的顯式轉(zhuǎn)換:
inta=1;doubleb=3.1415;a=(int)b; //C風(fēng)格的顯式轉(zhuǎn)換
a=int(b); //早期C++風(fēng)格的顯式轉(zhuǎn)換標(biāo)準(zhǔn)C++顯式轉(zhuǎn)換方式:
static_cast<T>(Expr);const_cast<T>(Expr);dynamic_cast<T>(Expr);reinterpret_cast<T>(Expr);第2章C++編程基礎(chǔ)2.2.5類型轉(zhuǎn)換用戶定義的轉(zhuǎn)換轉(zhuǎn)換構(gòu)造函數(shù)可以將某種類型的對象轉(zhuǎn)換成當(dāng)前類類型。類型轉(zhuǎn)換函數(shù)可以將當(dāng)前類型的對象轉(zhuǎn)換成指定的類型。typedef可以為某種數(shù)據(jù)類型聲明一個新名字。使用運算符typeid可以得到一個對象的數(shù)據(jù)類型。第2章C++編程基礎(chǔ)運行結(jié)果:classClassXclassClassXdouble第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則
2.2C++的數(shù)據(jù)類型
2.3表達式與語句
2.4預(yù)處理命令
2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.3表達式與語句2.3.1表達式:由運算符和操作數(shù)組成,按一定求值規(guī)則我們可以求出表達式的值;其中操作數(shù)可以是常量、變量或另一個表達式。算術(shù)運算符與表達式;關(guān)系運算符與表達式;邏輯運算符與表達式;位運算符與表達式;賦值運算符與表達式;三元條件運算符與表達式;逗號運算符與表達式;動態(tài)內(nèi)存分配與釋放運算符2.3.2語句:程序由語句組成,語句以“;”結(jié)束。
簡單語句,復(fù)合語句,控制語句(選擇語句、循環(huán)語句、跳轉(zhuǎn)語句),判斷表達式的使用第2章C++編程基礎(chǔ)2.3.1表達式根據(jù)功能,運算符可分為算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符、賦值運算符及特殊運算符。根據(jù)所需操作數(shù)的個數(shù),運算符可分為一元運算符、二元運算符和三元運算符。一元運算符只需要一個操作數(shù),二元運算符需要兩個操作數(shù),三元運算符則需要三個操作數(shù),C++只有一個三元運算符即“?:”。一個表達式可以包含多個運算符,運算順序由各運算符的優(yōu)先級和結(jié)合性決定。C++運算符的功能和優(yōu)先級參見表2-5。第2章C++編程基礎(chǔ)2.3.1表達式算術(shù)表達式由算術(shù)運算符和操作數(shù)組成,結(jié)果是算術(shù)值,值的類型與操作數(shù)的類型有關(guān)。基本算術(shù)運算符:二元算術(shù)運算符如+、-、*、/、%(int型);一元算術(shù)運算符如-(取負(fù))、+(取正)等。其中一元運算符優(yōu)先級高于二元運算符。++和--,是兩個一元運算符,操作數(shù)必須是變量,分前綴和后綴,優(yōu)先級較高,結(jié)合性自右向左。1.算術(shù)運算符與表達式第2章C++編程基礎(chǔ)前綴“++”可以理解為“先增1后使用”,而前綴“--”可以理解為“先減1后使用”。后綴“++”可以理解為“先使用后增1”,后綴“--”可以理解為“先使用后減1”。
inta1=1,c1=0;
c1=++a1; //a1=a1+1;c1=a1;inta2=1,c2=0;
c2=a2++; //c2=a2;a2=a2+1;前綴方式與后綴方式的區(qū)別:第2章C++編程基礎(chǔ)2.3.1表達式關(guān)系表達式由關(guān)系運算符和操作數(shù)組成,用來對兩個操作數(shù)進行比較,結(jié)果為bool類型的值。如果關(guān)系為真,則結(jié)果為true;如果關(guān)系為假,則結(jié)果為false。關(guān)系運算符包括:等于(==),不等于(!=),小于(<),小于等于(<=),大于(>),大于等于(>=)。后四種的優(yōu)先級高于前兩種。例如:設(shè)a=1,b=2,則表達式(a>b)的值為false,表達式(a<2)的值為true。2.關(guān)系運算符與表達式第2章C++編程基礎(chǔ)2.3.1表達式邏輯表達式由邏輯運算符和操作數(shù)組成,結(jié)果為bool類型的值。邏輯運算符包括:邏輯或(||)、邏輯與(&&)和邏輯非(!)“邏輯或”表示當(dāng)兩個操作數(shù)只要其中一個為真,結(jié)果就為true;“邏輯與”表示當(dāng)兩個操作數(shù)都為真時,結(jié)果才為true;“邏輯非”表示取操作數(shù)的邏輯相反值。參見表2-6。3.邏輯運算符與表達式第2章C++編程基礎(chǔ)2.3.1表達式位運算表達式由位運算符和操作數(shù)組成,可以對整型數(shù)按二進制位進行操作。位運算符包括:按位或(|),按位異或(^),按位與(&),按位求反(~),左移(<<),右移(>>)?!鞍次划惢颉边\算的規(guī)則是:對應(yīng)位不同為1,相同為0。例如:unsignedinta=8; //二進制為00001000unsignedintc=a^10;//c=00000010unsignedintb=a<<1;//b=000100004.位運算符與表達式第2章C++編程基礎(chǔ)2.3.1表達式賦值表達式由賦值運算符與操作數(shù)組成,作用是將等號右邊表達式的值賦給等號左邊的對象,表達式值的類型與左邊對象的類型一致。是二元運算符,結(jié)合性自右至左,優(yōu)先級僅高于逗號運算符。簡單賦值(=),復(fù)合賦值(+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=)。例如:
a=b=5;//先將5賦給b,再賦給aa+=3; //等價于a=a+35.賦值運算符與表達式第2章C++編程基礎(chǔ)2.3.1表達式C++唯一的一個三元運算符是“?:”,具有簡單的選擇功能,其格式為:
a1?a2:a3其中a1具有bool類型,a2和a3可以是任何類型,表達式的類型取決于a2和a3中類型高的一個。上式的運算過程是,若a1為true則表達式值為a2的值,否則表達式值為a3的值。例如求a和b中較大的值,并將該值賦給c,結(jié)果c的值為5:
inta=3,b=5,c=0;c=(a>b)?a:b;6.三元條件運算符與表達式第2章C++編程基礎(chǔ)2.3.1表達式逗號也是一個運算符,作用是將多個表達式連成一個表達式。計算時從左至右計算每一個表達式的值,逗號表達式的值與最后一個表達式的值相同。例如:
a=2*3,a*5;//表達式相當(dāng)于(a=2*3),a*5上述表達式中,逗號前面賦值表達式的值為6,a*5的值為30,則逗號表達式的值為30。逗號運算符的優(yōu)先級最低,使用較少。7.逗號運算符與表達式第2章C++編程基礎(chǔ)2.3.1表達式new運算符建立動態(tài)對象,并分配內(nèi)存空間;delete運算符刪除動態(tài)對象,即釋放內(nèi)存空間。new和delete必須配對使用。由new創(chuàng)建的堆對象沒有名字,只能通過地址進行訪問,這一點與普通對象不同。例如:
int*p1=newint;int*p2=newint(10); int*p3=newint[10]; deletep1; deletep2; delete[]p3; 8.動態(tài)內(nèi)存分配與釋放運算符第2章C++編程基礎(chǔ)2.3.2語句簡單語句:空語句,定義語句,表達式語句復(fù)合語句:多個簡單語句用一對花括號括住。控制語句:可以改變程序的流程。包括選擇語句(if-else,switch)循環(huán)語句(while,do-while,for)跳轉(zhuǎn)語句(break,continue,goto)第2章C++編程基礎(chǔ)2.3.2語句常用選擇語句包括if-else語句和switch語句。if-else語句的兩種形式(應(yīng)用參見例2-16):1.選擇語句第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)if-else語句嵌套使用可以實現(xiàn)多路分支,但比較繁瑣,而用switch語句比較簡單。語法:switch(表達式){ case常量表達式1:語句1;break; case常量表達式2:語句2;break; …… case常量表達式n:語句n;break; default:語句n+1;}第2章C++編程基礎(chǔ)2.3.2語句C++中可使用三種循環(huán)語句:while循環(huán)、do-while循環(huán)和for循環(huán)。2.循環(huán)語句第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)運行結(jié)果:2550第2章C++編程基礎(chǔ)2.3.2語句跳轉(zhuǎn)語句包括break語句、continue語句和goto語句。由于goto語句存在較大的安全隱患,盡量不用。break語句可用于switch和循環(huán)結(jié)構(gòu)中,作用是退出switch或循環(huán)體。continue語句一般只能用于循環(huán)結(jié)構(gòu)中,作用是結(jié)束本次循環(huán),進入下一次循環(huán)。3.跳轉(zhuǎn)語句運行結(jié)果:10,12,14,16,18,2010第2章C++編程基礎(chǔ)2.3.2語句當(dāng)表達式值為非0,被認(rèn)為是true;只有當(dāng)表達式的值等于0時,才認(rèn)為是false。簡化代碼:如果表達式expr的值為布爾型、整型、指針值等,與0比較時都可以采用下列方式:expr 相當(dāng)于expr!=0 !expr 相當(dāng)于expr==0 if(a-b) 相當(dāng)于if((a-b)!=0)while(p&&!q)相當(dāng)于while(p!=0&&q==0)實數(shù)在計算和存儲時會有微小的誤差,因此一般不能用“==”或“!=”進行判斷。應(yīng)設(shè)法轉(zhuǎn)化為“>=”和“<=”的形式。假設(shè)x為浮點型變量,則它與零值比較的if形式為:if((x>=-ε)&&(x<=ε))//ε為很小的正數(shù)
4.判斷表達式的使用第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則
2.2C++的數(shù)據(jù)類型
2.3表達式與語句
2.4預(yù)處理命令
2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.4預(yù)處理命令使用預(yù)處理命令的目的是為了改善程序的組織和管理。預(yù)處理命令以字符“#”開頭,它不是語句,后面不帶分號。下面介紹常用的預(yù)處理命令: 宏定義命令 文件包含命令 條件編譯命令第2章C++編程基礎(chǔ)2.4預(yù)處理命令2.4.1宏定義命令最簡單的宏定義命令是用一個標(biāo)識符代替另一種符號表示:
#definePI3.14159//定義宏P(guān)I C語言中常用這種方式定義宏常量,或者用帶參數(shù)的宏來描述簡單的函數(shù),例如:
#definef(x)2*x//定義帶參數(shù)的宏f(x)宏定義只是符號的簡單替換,在編譯之前執(zhí)行,不能進行語法檢查,存在安全隱患。在C++中,用const定義常量、用inline定義內(nèi)嵌函數(shù)。#undef與#define配合使用,作用是取消宏定義
#undefPI //取消宏名PI第2章C++編程基礎(chǔ)2.4預(yù)處理命令2.4.2文件包含命令#include命令的作用是,在編譯之前把指定文件的內(nèi)容嵌入到該命令所在的位置。文件包含命令一般放在程序的開頭,例如:
#include<iostream>#include“myhead.h”其中,include為關(guān)鍵字,括號或引號中的文件名是被包含文件的全名,可以給出盤符和目錄路徑。上面第一種形式,一般用于C++系統(tǒng)提供的頭文件,這些文件存放在C++系統(tǒng)目錄下的include子目錄下。第二種形式,一般用于程序員自己建立的頭文件或其他源文件。第2章C++編程基礎(chǔ)2.4預(yù)處理命令2.4.3條件編譯命令條件編譯命令是用來限制某些內(nèi)容要在滿足一定條件時才參與編譯,否則不參與編譯。條件編譯命令的結(jié)構(gòu)與if選擇結(jié)構(gòu)非常相似。三種形式:形式一:若“標(biāo)識符”被定義過,則編譯程序段1;否則編譯程序段2,或者直接執(zhí)行#endif后面的程序。#ifndef
標(biāo)識符程序段1#else
程序段2#endif或者:#ifndef
標(biāo)識符程序段1#endif
形式二:若“標(biāo)識符”未被定義過,則編譯程序段1;否則編譯程序段2,或者直接執(zhí)行#endif后面的程序。
形式三:若常量表達式i(i=1,…,n)的值為真,則編譯程序段i;若所有表達式都為假,則編譯程序段n+1。形式三:
#if
常量表達式1
程序段1#elif
常量表達式2
程序段2 …#elif
常量表達式n
程序段n#else
程序段n+1#endif第2章C++編程基礎(chǔ)第2章C++編程基礎(chǔ)避免重復(fù)包含://head1.h //如果沒有設(shè)置該文件被包含的標(biāo)志HEAD1_H//則設(shè)置該標(biāo)志,并且之后的代碼參與編譯#ifndefHEAD1_H #defineHEAD1_H
intaddint(inta,intb);//函數(shù)聲明doubled=0.8; //全局變量定義#endif//HEAD1_H第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則
2.2C++的數(shù)據(jù)類型
2.3表達式與語句
2.4預(yù)處理命令
2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.5名字空間雖然標(biāo)識符可以具有函數(shù)域、類域,可以通過static使函數(shù)和對象具有文件域,但全局性的對象名、函數(shù)名以及類名還在同一個全局名字空間中。一個大型軟件往往由多人完成,一旦對全局性的名字缺乏控制就會出現(xiàn)名字沖突。名字空間(namespace)是C++的新特性之一??梢园褋碜圆煌幊倘藛T的全局性標(biāo)識符歸屬不同的名字空間,從而解決程序開發(fā)中常見的同名沖突問題。名字空間聲明,使用名字空間,標(biāo)準(zhǔn)名字空間std。第2章C++編程基礎(chǔ)2.5名字空間2.5.1名字空間聲明namespacecalculator{ doubled=0.5; voidPrint(doublex){cout<<x<<endl;} classX{};//此處分號不能少!}//此處可以沒有分號第2章C++編程基礎(chǔ)名字空間的成員可以是對象、函數(shù)、類、其他名字空間等。成員函數(shù)的定義體可以放在花括號的外面:namespacecalculator{ …… voidPrint(doublex);//函數(shù)聲明
classX{};//此處分號不能少!}//此處可以沒有分號voidcalculator::Print(doublex){cout<<x<<endl;}可以為名字空間指定另一個名字。例如:namespacecal=calculator;//cal是calculator的別名只能在全局范圍聲明名字空間。名字空間不是數(shù)據(jù)類型,不能創(chuàng)建名字空間對象。第2章C++編程基礎(chǔ)2.5名字空間2.5.2使用名字空間訪問名字空間的成員時,應(yīng)該指明該成員屬于哪個名字空間,否則編譯器找不到成員的定義代碼。用作用域運算符用using聲明用using指令第2章C++編程基礎(chǔ)2.5.2使用名字空間1.用作用域運算符#include<iostream>usingnamespacestd;namespacecalculator//名字空間定義{ doubled=0.5; voidPrint(doublex){cout<<x<<endl;}}intmain(){
calculator::Print(calculator::d); return0;}第2章C++編程基礎(chǔ)2.5.2使用名字空間2.用using聲明intmain(){ {usingcalculator::d; //using聲明
calculator::Print(d); //正確作用域
} calculator::Print(d);//錯誤!此處不能直接使用dreturn0;}第2章C++編程基礎(chǔ)2.5.2使用名字空間3.用using指令intmain(){ {usingnamespacecalculator;//using指令
Print(d); //正確作用域
} Print(d);//錯誤!此處不能直接使用Print和d calculator::Print(calculator::d);//正確
return0;}第2章C++編程基礎(chǔ)2.5.3標(biāo)準(zhǔn)名字空間stdstd是標(biāo)準(zhǔn)C++預(yù)定義的名字空間,其中包含了對標(biāo)準(zhǔn)庫中對象、函數(shù)、類等所有標(biāo)識符的定義。如使用std的cout,則要#include輸入/輸出頭文件,還要指明std:#include<iostream>intmain(){
std::cout<<“OK!”; return0;}第2章C++編程基礎(chǔ)舉例中多次用using指令“usingnamespacestd;”,使std中的所有標(biāo)識符都可以直接使用。如:#include<iostream>usingnamespacestd;//打開名字空間stdintmain(){cout<<“OK!”;return0;}這樣一條全局性的using指令給我們編寫實現(xiàn)文件帶來了方便。但是,這種方式一般不能用在頭文件中。第2章C++編程基礎(chǔ)2.1C++的詞法規(guī)則
2.2C++的數(shù)據(jù)類型
2.3表達式與語句
2.4預(yù)處理命令
2.5名字空間2.6小結(jié)第2章C++編程基礎(chǔ)2.6小結(jié)程序的主要功能是描述數(shù)據(jù)和處理數(shù)據(jù)。數(shù)據(jù)具有類型:基本數(shù)據(jù)類型、自定義數(shù)據(jù)類型和擴展數(shù)據(jù)類型。類是編寫面向?qū)ο蟪绦虻幕A(chǔ)。運算符表示了系統(tǒng)提供的對基本數(shù)據(jù)的操作。各種運算符具有不同的功能、優(yōu)先級和結(jié)合性。表達式由運算符和操作數(shù)組成。程序主要由語句構(gòu)成。預(yù)處理命令以字符“#”開頭,它不是程序的語句,使用的目的是為了改善程序的組織和管理。名字空間可以解決同名沖突問題。std是標(biāo)準(zhǔn)C++預(yù)定義的名字空間,其中包含了對標(biāo)準(zhǔn)庫中對象、函數(shù)、類等所有標(biāo)識符的定義。THANKS面向?qū)ο缶幊碳夹g(shù)與方法(C++)
第3章函數(shù)第3章函數(shù)第3章
函數(shù)
3.1函數(shù)的定義與聲明
3.2函數(shù)調(diào)用
3.2.1如何調(diào)用函數(shù)
3.2.2參數(shù)傳遞方式
3.2.3函數(shù)信息返回方式3.2.4嵌套調(diào)用與遞歸調(diào)用
3.2.5如何調(diào)用庫函數(shù)
3.3函數(shù)指針
3.4static函數(shù)
3.5inline函數(shù)
3.6函數(shù)重載
3.7帶默認(rèn)形參值的函數(shù)
3.8小結(jié)
第3章函數(shù)3.1函數(shù)的定義與聲明
3.2函數(shù)調(diào)用 3.3函數(shù)指針 3.4static函數(shù) 3.5inline函數(shù) 3.6函數(shù)重載 3.7帶默認(rèn)形參值的函數(shù) 3.8小結(jié)
第3章函數(shù)3.1函數(shù)的定義與聲明函數(shù)定義規(guī)定了函數(shù)的名字、返回類型、參數(shù)列表(包括參數(shù)個數(shù)、類型、順序)以及函數(shù)體部分。doubleadd(doublex,doubley){ return(x+y);}函數(shù)也可以不帶參數(shù),稱為無參函數(shù),這種函數(shù)不依賴外部數(shù)據(jù)而執(zhí)行獨立的操作。voidprintwelcome(){cout<<"WelcometoC++!"<<endl;}第3章函數(shù)如果函數(shù)調(diào)用在函數(shù)定義之前,那么在調(diào)用前必須進行聲明。如果函數(shù)調(diào)用在函數(shù)定義之后,可以不做聲明。下面是對函數(shù)add的聲明,兩個形式參數(shù)的名字“x”和“y”可以省略:
doubleadd(doublex,doubley);需要注意:下面是函數(shù)func的定義,而不是聲明,因為花括號代表函數(shù)體部分,只不過其中不含代碼。
intfunc(inta1,inta2){};第3章函數(shù)3.1函數(shù)的定義與聲明 3.2函數(shù)調(diào)用
3.3函數(shù)指針 3.4static函數(shù) 3.5inline函數(shù) 3.6函數(shù)重載 3.7帶默認(rèn)形參值的函數(shù) 3.8小結(jié)
第3章函數(shù)3.2函數(shù)調(diào)用
3.2.1如何調(diào)用函數(shù)3.2.2參數(shù)傳遞方式 3.2.3函數(shù)信息返回方式3.2.4嵌套調(diào)用與遞歸調(diào)用 3.2.5如何調(diào)用庫函數(shù)第3章函數(shù)3.2函數(shù)調(diào)用3.2.1如何調(diào)用函數(shù) 任何C++應(yīng)用程序都包含且只含一個main函數(shù)。main函數(shù)可以調(diào)用其他函數(shù),其他函數(shù)之間可以互相調(diào)用,但不能調(diào)用main函數(shù)。函數(shù)調(diào)用時,要指定函數(shù)名并提供實際參數(shù)(實參)信息。函數(shù)名對應(yīng)函數(shù)的入口地址,實際參數(shù)提供執(zhí)行任務(wù)所需的信息。實際參數(shù)與形式參數(shù)的個數(shù)、類型、位置必須一致。參見例3-1:在主函數(shù)中調(diào)用add()和printwelcome()。第3章函數(shù)運行結(jié)果:8.5WelcometoC++!第3章函數(shù)3.2函數(shù)調(diào)用3.2.1如何調(diào)用函數(shù)
3.2.2參數(shù)傳遞方式
3.2.3函數(shù)信息返回方式3.2.4嵌套調(diào)用與遞歸調(diào)用 3.2.5如何調(diào)用庫函數(shù)第3章函數(shù)函數(shù)的參數(shù)傳遞與信息返回是函數(shù)與外部通訊的接口。3.2.2參數(shù)傳遞方式 調(diào)用函數(shù)時的三種參數(shù)傳遞方式:第一種是將實參的值復(fù)制給形參,我們稱這種方式為值傳遞。值傳遞方式的函數(shù)被調(diào)用時,系統(tǒng)建立臨時形參對象,即為形參分配臨時存儲空間,并將實參值傳給形參;函數(shù)執(zhí)行完畢,系統(tǒng)刪除臨時形參對象。這時函數(shù)內(nèi)部改變形參的值不會影響外部實參的值。第二種是指針傳遞,即通過指針將實參的地址傳給形參,這時在函數(shù)內(nèi)部可以通過這個地址訪問實參,這意味著改變形參的值將會影響到實參。第三種是引用傳遞,即形參引用實參對象,這時函數(shù)內(nèi)改變形參的值也就是改變實參的值。第3章函數(shù)第3章函數(shù)在引用傳遞方式下,如果被調(diào)函數(shù)只是使用實參的值,而不改變實參,那么函數(shù)定義時可以對形參類型加const約束。如果是將常量或表達式的值傳給形參引用,則形參類型必須用const約束。這時進行參數(shù)傳遞時,將產(chǎn)生一個匿名的臨時對象保存實參的值。被調(diào)函數(shù)運行結(jié)束后臨時對象被刪除。第3章函數(shù)第3章函數(shù)3.2.2參數(shù)傳遞方式 1.值傳遞變量(或?qū)ο螅┮话憔哂忻Q(通過new創(chuàng)建的對象沒有名稱)、類型、數(shù)值、地址這四個要素。定義變量時,系統(tǒng)會在內(nèi)存中為該變量分配一塊連續(xù)區(qū)域,變量的地址就是該區(qū)域的首地址。C語言習(xí)慣使用“變量”這個術(shù)語。C++中的對象,強調(diào)的是分配好的、具體的一塊內(nèi)存區(qū)域,并且具有唯一的地址。每個對象都與一個特定的數(shù)據(jù)類型相關(guān)聯(lián),這個類型決定了相關(guān)內(nèi)存的大小、布局、能夠存儲在該區(qū)域的值的范圍以及可以對該區(qū)域進行哪些操作等。數(shù)據(jù)類型不僅包括基本數(shù)據(jù)類型,更重要的是抽象數(shù)據(jù)類型。第3章函數(shù)3.2函數(shù)調(diào)用3.2.1如何調(diào)用函數(shù)3.2.2參數(shù)傳遞方式
3.2.3函數(shù)信息返回方式3.2.4嵌套調(diào)用與遞歸調(diào)用 3.2.5如何調(diào)用庫函數(shù)第3章函數(shù)3.2函數(shù)調(diào)用3.2.3函數(shù)信息返回方式 函數(shù)的運行結(jié)果可以通過語句“return(表達式);”,表達式類型應(yīng)與函數(shù)原型規(guī)定的返回類型匹配;如果規(guī)定的返回類型是void,則return語句不帶表達式,或者不用return語句。
同樣函數(shù)信息返回方式也有三種情況:值返回指針返回引用返回第3章函數(shù)3.2.3函數(shù)信息返回方式 如果函數(shù)返回一個值,當(dāng)執(zhí)行return語句時,先計算表達式的值,然后把該值賦給系統(tǒng)生成的匿名臨時對象,通過該對象把數(shù)值帶回函數(shù)的調(diào)用點。參見例3-6。如果函數(shù)的返回類型為指針,則直接將對象的地址返回調(diào)用處,這樣對大對象操作可以節(jié)省時空消耗。參見例3-7。注意函數(shù)不能返回局部對象的地址或局部指針。如果函數(shù)返回類型為引用,則比返回指針更直接。參見例3-8。注意函數(shù)返回時不能引用局部對象。函數(shù)返回引用,使得函數(shù)調(diào)用也可以作為左值,即可以位于賦值運算符“=”的左邊。第3章函數(shù)第3章函數(shù)3.2函數(shù)調(diào)用3.2.1如何調(diào)用函數(shù)3.2.2參數(shù)傳遞方式 3.2.3函數(shù)信息返回方式
3.2.4嵌套調(diào)用與遞歸調(diào)用
3.2.5如何調(diào)用庫函數(shù)第3章函數(shù)3.2函數(shù)調(diào)用3.2.4嵌套調(diào)用與遞歸調(diào)用 函數(shù)不能嵌套定義:即一個函數(shù)體內(nèi)不能定義另一個函數(shù)??梢郧短渍{(diào)用函數(shù),即在一個函數(shù)定義體中可以調(diào)用另一個函數(shù)。遞歸調(diào)用指函數(shù)直接或間接地調(diào)用自身。直接遞歸調(diào)用指在函數(shù)內(nèi)調(diào)用自身;間接遞歸調(diào)用指在一個函數(shù)內(nèi)調(diào)用其他函數(shù),而在其他函數(shù)內(nèi)又調(diào)用原函數(shù)。參見例3-9。第3章函數(shù)第3章函數(shù)3.2函數(shù)調(diào)用3.2.1如何調(diào)用函數(shù)3.2.2參數(shù)傳遞方式 3.2.3函數(shù)信息返回方式3.2.4嵌套調(diào)用與遞歸調(diào)用
3.2.5如何調(diào)用庫函數(shù)第3章函數(shù)3.2函數(shù)調(diào)用3.2.5如何調(diào)用庫函數(shù) C++不僅允許調(diào)用自定義函數(shù),還允許調(diào)用庫函數(shù),這些庫可以是C++標(biāo)準(zhǔn)庫、不同商家提供的函數(shù)庫、甚至是我們自己設(shè)計的庫。例如C++標(biāo)準(zhǔn)庫為我們提供了常用的數(shù)學(xué)函數(shù),這些函數(shù)原型都在頭文件<cmath>中進行了說明,使用時用#include將該頭文件嵌入即可。參見例3-10。第3章函數(shù)第3章函數(shù)3.1函數(shù)的定義與聲明 3.2函數(shù)調(diào)用 3.3函數(shù)指針
3.4static函數(shù) 3.5inline函數(shù) 3.6函數(shù)重載 3.7帶默認(rèn)形參值的函數(shù) 3.8小結(jié)
第3章函數(shù)3.3函數(shù)指針函數(shù)名就代表內(nèi)存中函數(shù)的起始地址。也可以用一個指向函數(shù)的指針來存放函數(shù)的起始地址,并通過該指針調(diào)用函數(shù)。這種指針稱為指向函數(shù)的指針,簡稱函數(shù)指針。例如:doubleadd(doublex,doubley){return(x+y);}double(*fp)(doublex,doubley)=add;//定義fp(1.2,2.0);//通過函數(shù)指針調(diào)用函數(shù)fp是一個變量,它可以重新指向其他相匹配的函數(shù);而add相當(dāng)于一個常量,它所代表的函數(shù)入口地址是固定的。函數(shù)(或函數(shù)指針)可以作為另一個函數(shù)的參數(shù),使用時同樣要注意類型匹配問題。第3章函數(shù)第3章函數(shù)3.1函數(shù)的定義與聲明 3.2函數(shù)調(diào)用 3.3函數(shù)指針 3.4static函數(shù)
3.5inline函數(shù) 3.6函數(shù)重載 3.7帶默認(rèn)形參值的函數(shù) 3.8小結(jié)
第3章函數(shù)3.4static函數(shù)對于多文件程序,一般
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026廣東云浮市人民醫(yī)院招聘63人備考題庫及一套答案詳解
- 2026浙江杭州市廣播電視監(jiān)測中心招聘編外工作人員1人備考題庫及答案詳解1套
- 2026年西安第四聯(lián)合職業(yè)中學(xué)教師招聘備考題庫及答案詳解(新)
- 2026安徽某國企整車制造車企管理類人才獵聘備考題庫及答案詳解(考點梳理)
- 2026江蘇南京大學(xué)YJ20260022哲學(xué)學(xué)院博士后招聘1人備考題庫帶答案詳解
- 2026北京林業(yè)大學(xué)附屬小學(xué)招聘2人備考題庫及1套完整答案詳解
- 2026內(nèi)蒙古鄂爾多斯市東勝區(qū)實驗小學(xué)招聘教師備考題庫完整參考答案詳解
- 隆回2025年事業(yè)單位招聘考試真題及答案解析
- 2025年cpa注冊會計師審計試題含解析及答案
- 商場員工考勤管理制度
- 化工行業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化管理體系建設(shè)方案
- TCAMET 《城市軌道交通 車輛表面貼膜》編制說明(征求意見稿)
- 醫(yī)療衛(wèi)生機構(gòu)網(wǎng)絡(luò)安全管理辦法
- 《保健食品標(biāo)識培訓(xùn)》課件
- 2023年非標(biāo)自動化機械設(shè)計工程師年度總結(jié)及來年計劃
- 股骨頸骨折圍手術(shù)期護理
- 蜂窩煤成型機設(shè)計課程設(shè)計
- 民間個人借款擔(dān)保書
- LY/T 1598-2011石膏刨花板
- GB/T 31588.1-2015色漆和清漆耐循環(huán)腐蝕環(huán)境的測定第1部分:濕(鹽霧)/干燥/濕氣
- GB/T 21268-2014非公路用旅游觀光車通用技術(shù)條件
評論
0/150
提交評論