C程序設計學習筆記_第1頁
C程序設計學習筆記_第2頁
C程序設計學習筆記_第3頁
C程序設計學習筆記_第4頁
C程序設計學習筆記_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++程序設計一,數(shù)據(jù)類型1.保留字32+29個2.基本數(shù)據(jù)類型:wchar_t,bool3.非基本數(shù)據(jù)類型:classC++是強類型語言:要求在使用數(shù)據(jù)之前必須對數(shù)據(jù)的類型進行聲明標識符的拼寫方法:a) 下劃線連接法b) 駱駝表示法:第一個單詞首字母小寫,其后每個單詞的首字母大寫c) 匈牙利標記法:以類型簡稱為前綴,后跟駱駝表示法同義詞:typedef實數(shù)默認為double型枚舉類型:a) 形式:enum類型名{枚舉常量列表};b) 枚舉常量為整型c) 枚舉變量只能取枚舉常量值,不能將整數(shù)值賦給枚舉變量常量:a) 形式:const類型常量名=初始化值;b) 常量定義時必須初始化c) 常量名不能放在賦值語句的左邊d) 初始化值可以是一個常量表達式,但表達式中不能含有函數(shù)I/O流控制a) 書寫格式:輸入cin>>變量輸出cout<<表達式b) 控制符:定義在<iomanip.h>中,可直接插入流中c) 控制浮點數(shù)值顯示:setprecision(n),默認為6位二,表達式左值:能出現(xiàn)在賦值表達式左邊的表達式,具有存放數(shù)據(jù)的空間,且存放是允許的賦值表達式具有值,是左值,其值為賦值符號左邊的表達式的值算術類型隱式轉換原則:總是朝表達數(shù)據(jù)能力更強的方向,并且總是逐個運算符進行強制類型轉換:類型名(表達式)或(類型名)表達式自增自減,操作數(shù)必須是左值a) 前增/減,是左值b) 后增/減,不是左值C++中,表達式(無參函數(shù)除外)都產(chǎn)生值任何被轉換的變量都不是左值當條件運算符后的兩個表達式的值類型相同,且均為左值時,該條件表達式可做左值C中條件表達式不可做左值不同的編譯器的求值順序可能不同,從而造成:a) 交換律不再適用b) 使括號失去作用c) 副作用三,函數(shù)1.遞歸的條件:a) 必須有完成函數(shù)任務的語句b) —個確定是否能避免遞歸調(diào)用的測試c) 一個遞歸調(diào)用語句d) 應先測試,后遞歸調(diào)用2.內(nèi)聯(lián)函數(shù)a) 目的:解決程序的運行效率b) 形式:inline函數(shù)聲明c) 必須先聲明,后調(diào)用d) 內(nèi)聯(lián)函數(shù)中不能包含復雜的結構控制語句,不能是遞歸調(diào)用函數(shù)e) 其處理方式與宏定義類似3.重載函數(shù)a) 重載:在不同類型上作不同運算而又用同樣的名字的函數(shù)b) 重載函數(shù)至少在參數(shù)個數(shù)、參數(shù)類型、參數(shù)順序上有所不同c) C++允許int至到long、double的轉換d) 內(nèi)部實現(xiàn):采用名字粉碎方法來改變函數(shù)名4.默認參數(shù)的函數(shù)a) 默認參數(shù)在函數(shù)聲明中提供b) 當既有聲明,又有定義時,定義中不允許默認參數(shù)c) 默認參數(shù)在形參中應從右向左逐漸定義,調(diào)用時只能從右向左順序匹配默認d) 默認參數(shù)可將一系列簡單的重載函數(shù)合并成一個,當同時使用默認參數(shù)函數(shù)和重載函數(shù)時,注意不要引起二義性e) 默認值可以是:全局變量、全局常量、函數(shù)5.外部存儲類型a) 構成一個程序的多個源文件之間,通過聲明數(shù)據(jù)或函數(shù)為外部的(extern)進行溝通b) 默認的函數(shù)聲明或定義總是externc) 帶extern的變量說明是變量聲明,不是變量定義6.靜態(tài)存儲類型a) 靜態(tài)全局變量對組成該程序的其他源文件是無效的b) 靜態(tài)函數(shù)只在所屬源文件中可見c) 文件作用域下聲明的inline函數(shù)默認為static存儲類型d) 文件作用域下聲明的const常量默認為static存儲類型7.作用域a) 作用域:標識符在程序中有效的范圍,作用域開始于標識符的聲明處b) 局部作用域:起始于聲明處1.{}塊范圍2.語句范圍,在if/switch/for的條件表達式中定義的標識符c) 函數(shù)作用域:標號是唯一有函數(shù)作用域的標識符,不受聲明位置限制d) 函數(shù)原型作用域:函數(shù)形參,局限于括號內(nèi)e) 文件作用域:在所有函數(shù)定義之外說明的,從說明點開始,一直延伸到源文件結束8.可見性a) 標識符的可見范圍不超過作用域b) 如果被隱藏的是全局變量,可用符號::來引用給變量9.生命期a)與存儲區(qū)域密切相關靜態(tài)生命期:程序運行期1.具有文件作用域的變量2.無顯示初始化時,自動初始化為03.函數(shù)具有靜態(tài)生命期局部生命期:函數(shù)調(diào)用期,變量駐留在棧區(qū),不自動初始化動態(tài)生命期:變量駐留在堆中,開始于new,結束于delete四,預編譯1.頭文件:源文件之間的接口,一般包含:類型聲明、函數(shù)聲明、內(nèi)聯(lián)函數(shù)定義、常量定義、變量聲明、枚舉、包含指令、宏定義、注釋不宜包含:一般函數(shù)定義、變量定義、常量數(shù)組定義五,數(shù)組1.數(shù)組定義下標識數(shù)組元素到數(shù)組開始的偏移量C++允許堆內(nèi)存分配來建立數(shù)組局部作用域的數(shù)組,其內(nèi)容不確定全局或靜態(tài)作用域的數(shù)組,其內(nèi)容初始全為0局部數(shù)組其大小受到棧空間的限制,對大數(shù)組一般定義為全局或靜態(tài)類型2.訪問數(shù)組數(shù)組不能彼此直接賦值必須按元素逐個賦值3.初始化C++規(guī)定:初始化數(shù)組的值的個數(shù)不能多于數(shù)組元素個數(shù),不能通過跳過逗號的方式來省略字符數(shù)組的初始化方式:chararray[10]={“hello”};chararray[10]=”hello”;chararray[10]={‘h','e','l','l','o','\0'};編譯時必須知道數(shù)組的大小,可省略數(shù)組的大小,由編譯器統(tǒng)計初始值的元素個數(shù)省略數(shù)組長度時,可用sizeof()來獲得數(shù)組的大小省略數(shù)組大小只能在有初始化的數(shù)組定義中六,指針在指針定義中,一個*只能表示一個指針*放在可執(zhí)行語句中的指針前,稱為間接引用操作符,放在指針定義中,稱為指針定義符指針值不是整型數(shù),將整型地址賦給整型變量時要用強制類型轉換指針在使用前要初始化訪問堆C語言方式,<alloc.h>void*malloc(size_tsize);需要顯式類型轉換voidfree(void*);C++方式new/delete不需要顯式類型轉換指向常量的指針a.在指針定義語句的類型前加const,形式為:constint*pi;該指針變量可賦給常量、變量的地址C.該指針變量的取值操作(*),不能用作左值,以防止對常量的賦值指針常量在指針定義語句的指針變量名前加const,形式為:int*constpi;該指針本身是常量,不能對其賦值,且定義時必須初始化該指針變量的取值操作(*),能用作左值d初始化時,不能初始化為一個常量的地址指向常量的指針常量形式為:constint*constcpc;cpc和*cpc都是常量,都不能用作左值指針函數(shù)返回指針的函數(shù)可以返回堆地址、全局變量的地址、靜態(tài)變量的地址不能返回局部變量的地址Void指針類型僅僅是一個指針不能進行指針運算,不能進行間接引用取值c?將其賦給其它類型指針時,必須有類型轉換11.字符串C++中有兩類字符串字符數(shù)組:用雙引號標識,用來給數(shù)組初始化的字符串常量:用雙引號標識,不是用來給數(shù)組初始化的字符串常量在代碼中被轉換為指向字符的地址(char*),與字符數(shù)組名同類型字符串常量通常存放在內(nèi)存的data區(qū)中的const區(qū)字符數(shù)組則根據(jù)其數(shù)據(jù)存儲的特點存放在data區(qū)中的全局或靜態(tài)區(qū),或棧區(qū)兩個同樣字符組成的字符串常量的地址是不相等的,字符串的比較要采用庫函數(shù)字符串常量、字符數(shù)組名、字符指針均屬于同一種數(shù)據(jù)類型輸出字符指針就是輸出字符串,輸出字符指針的間接引用就是輸出單個字符對于字符串常量賦給字符指針的情形,一般指針不再重新賦值兩個字符串常量的比較是地址的比較,兩個數(shù)組名的比較也是地址的比較J?字符串的比較應該是逐個字符的比較,通常使用strcmp()K.字符數(shù)組的賦值采用strcpy(),字符數(shù)組名是指針常量(char*const)標準C++庫vstring>中提供了新的字符串類型:string,支持泛型運算12.指針數(shù)組指針數(shù)組名是二級指針傳遞數(shù)組給函數(shù)就是傳遞指針給函數(shù),傳遞指針數(shù)組給函數(shù)就是傳遞二級指針給函數(shù)NULL是空指針值,不指向任何地方,是一個不確定值(因操作系統(tǒng)而定)任何類型的指針都可以賦予NULL值13.命令行參數(shù)main函數(shù)的原型:intmain(intargc,char*argv[],char*env[])參數(shù)的取名是任意的,可改成其他名稱命令行參數(shù)中含有空格時,可將該參數(shù)用雙引號括起來exit(返回值),用于終止程序,返回到操作系統(tǒng)14.函數(shù)指針不同的參數(shù),不同的返回類型,構成了不同的函數(shù)—個函數(shù)不能賦給一個不一致的函數(shù)指針C.函數(shù)指針和其他數(shù)據(jù)類型的指針之間不能互相賦值,即使顯式轉換也不行通過函數(shù)指針來調(diào)用函數(shù),必須先給函數(shù)指針賦值(設有int(*fp)())1.ANSIC++:fp()2.兼容C:(*fp)()用typedef來簡化函數(shù)指針的定義,如:typedefint(*FUN)(inta,intb);七,引用基本概念引用是一個變量或對象的別名對引用的改動就是對目標對象的改動聲明形式:目標類型&標識符引用不是值,不占用存儲空間,只有聲明,沒有定義引用在聲明時必須初始化,且必須初始化指向一個實際存在的某類型對象&運算符的使用:(int&b=a;中操作符&表示a和b所代表的變量位于同一地址上)引用運算符:只在聲明時使用,放在類型名之后取址運算符:除作為引用符之外的任何情況引用一旦初始化,就綁定在該目標上,再也不分開對引用的賦值,是對其綁定的目標的賦值對引用取地址,是其綁定的目標的地址引用的使用方法可以有指針變量的引用不允許對void進行引用(void只是語法上相當于一個類型,本質(zhì)上不是類型)不能建立對數(shù)組的引用沒有引用的引用,也沒有引用的指針引用不能用類型來初始化不能給引用賦予null值對引用初始化為非左值(常量)時,要聲明為const類型,此時引用的是系統(tǒng)隱含產(chǎn)生的臨時變量(臨時變量是const的)用引用傳遞函數(shù)參數(shù)傳遞引用,就是傳遞引用所綁定的目標的地址(由編譯器內(nèi)部自動實現(xiàn))采用引用參數(shù)的目的:調(diào)用形式和傳值方式形式相同,以隱藏函數(shù)的實現(xiàn)方式函數(shù)內(nèi)部采用傳地址方式,具有與指針相同的效果是編譯系統(tǒng)為避免指針操作帶來的不便所采用的一種技術手段采用引用參數(shù),無法從函數(shù)調(diào)用的表面形式來判斷函數(shù)的傳值方式返回值問題利用引用參數(shù)可以更改其綁定的目標的特點,可以用來使函數(shù)返回多個值函數(shù)返回值時,要生成一個值的副本(臨時變量)。而用引用返回值時,不生成值的副本C++標準規(guī)定:臨時變量(或對象)的生命期在一個完整的語句表達式結束后便宣告結束要以返回值初始化一個引用,應先創(chuàng)建一個變量保存該返回值,再以該變量初始化引用不要返回一個局部作用域范圍內(nèi)的變量(或對象)的引用返回引用的函數(shù),可以使函數(shù)成為左值,從而進行運算保護實參不被修改的辦法是傳遞const指針或引用C++規(guī)定,引用本身總是const的,對引用應用關鍵字const,其作用只是使目標成為const變量堆變量的引用a.首先要測試new分配的堆內(nèi)存是否成功,并保存到一個指針變量中,然后才能用該指針指向的對象來初始化引用b.使用堆引用,應注意:必要時用值傳遞參數(shù)必要時返回值不要返回有可能退出作用域的引用不要引用空目標引用小結引用是指針的揚棄引用的目的主要是用于在函數(shù)參數(shù)傳遞中,解決大對象的傳遞效率和空間都不如意的問題引用的最大特點是表達清晰八,結構概念結構是用戶自定義的新數(shù)據(jù)類型通常情況下,結構聲明在所有函數(shù)之外,位于main()之外聲明一個結構不分配內(nèi)存聲明形式:struct結構名{成員定義列表;};訪問結構成員,結構變量.成員結構的大小固定,可以彼此直接賦值兩個不同結構名的變量是不允許相互賦值的在C中,定義結構變量時,結構類型名前必須有struct,在C++中可省略結構指針結構變量的地址是結構的第一個成員的地址結構指針通過箭頭操作符“->”訪問結構成員結構參數(shù)按值傳遞時,整個結構值都將被復制到形參中去,常用于小結構情況按引用傳遞,僅僅把結構地址傳遞給形參,而函數(shù)的實現(xiàn)和調(diào)用形式都與值傳遞相同,可讀性較好,且效率較高,通常都是采用該方式傳遞結構參數(shù)九,類類與結構在C的結構中不允許含有成員函數(shù)C++的類中,既可以包含數(shù)據(jù)成員,又可以包含成員函數(shù)C++中,結構是用struct聲明的類,允許含有成員函數(shù)C++中的類與結構的唯一區(qū)別是:類定義中默認情況下的成員是私有的,而結構定義中默認情況下的成員是公有的定義成員函數(shù)成員函數(shù)也稱為方法,數(shù)據(jù)成員也稱為屬性作用域區(qū)分符“::”,用于指明一個函數(shù)或數(shù)據(jù)屬于哪一個類,若不跟類名,表示該數(shù)據(jù)是全局數(shù)據(jù),函數(shù)為全局函數(shù)(非成員函數(shù))在類中定義的成員函數(shù)默認為內(nèi)聯(lián)函數(shù)在類定義外部定義成員函數(shù)時,成員函數(shù)名前要加上所屬類名調(diào)用成員函數(shù)調(diào)用方式:點操作調(diào)用、指針調(diào)用、引用調(diào)用成員函數(shù)必須用對象來調(diào)用成員函數(shù)內(nèi)部對其他成員函數(shù)和數(shù)據(jù)成員可直接訪問一個類的所有對象調(diào)用的成員函數(shù)都是同一代碼段成員函數(shù)的形參列表中隱藏了一個參數(shù)this指針,該參數(shù)接收對象的地址成員函數(shù)內(nèi)部對其他成員函數(shù)和數(shù)據(jù)成員的訪問都隱含地被加上前綴this-〉不能在成員函數(shù)內(nèi)部使用某個特定的對象一個類對象所占據(jù)的內(nèi)存空間由它的數(shù)據(jù)成員所占據(jù)的空間總和所決定,類的成員函數(shù)不占據(jù)對象的內(nèi)存空間4.類作用域:類作用域是指類定義和相應的成員函數(shù)定義范圍在類作用域范圍內(nèi),一個類的成員函數(shù)對同一類的數(shù)據(jù)成員有無限制的訪問權一個類的所有成員位于這個類的作用域內(nèi),該類的任何成員都能訪問同一類的任意其他成員5.類的可見性類名允許與其他變量名或函數(shù)名相同非類型名包括:變量名、常量名、函數(shù)名、對象名、枚舉成員名等非數(shù)據(jù)類型名如果一個非類型名與某類型名重名,則可通過給該類型名加前綴進行訪問6.局部類在函數(shù)中定義的類稱為局部類局部類的作用域在定義該類的函數(shù)塊中局部類的成員函數(shù)必須在類定義內(nèi)部定義7.名空間名空間是指某名字在其中必須唯一的作用域C++規(guī)定:一個名字不能同時指兩種類型非類型名不能重名類型名與非類型名不在同一名空間,類型名和非類型名可重名類型名和非類型名重名時,類型名要加前綴十,對象1.類與對象一個類描述一類事物,描述這些事物所應具有的屬性一個對象是類的一個實例,它具有確定的屬性值對象是可以被創(chuàng)建和銷毀的實體,類則是無所不在的抽象概念2.構造函數(shù)構造函數(shù)的任務:為對象分配空間和初始化數(shù)據(jù)成員構造函數(shù)在建立對象時被自動調(diào)用C++規(guī)定:與類同名的成員函數(shù)是構造函數(shù)構造函數(shù)沒有返回類型,函數(shù)體中不允許返回值,但可以有無值返回語句return;構造函數(shù)不能被隨意調(diào)用一個類定義中,類的數(shù)據(jù)成員可以為另一個類的對象,構造函數(shù)會根據(jù)在類中聲明的對象成員的次序依次調(diào)用其構造函數(shù),最后才執(zhí)行它自己的構造函數(shù)構造函數(shù)可以有參數(shù),可以被重載無參構造函數(shù)稱為默認構造函數(shù)顯式調(diào)用構造函數(shù)會創(chuàng)建一個無名對象3.析構函數(shù)析構函數(shù)的任務:做對象銷毀前的清理工作析構函數(shù)沒有返回類型,沒有參數(shù),不允許被隨意調(diào)用析構函數(shù)不允許重載析構函數(shù)在對象生命期結束時由系統(tǒng)自動調(diào)用C++規(guī)定:析構函數(shù)名為在構造函數(shù)名前加“~”析構函數(shù)以調(diào)用構造函數(shù)相反的順序被調(diào)用4.默認構造函數(shù)C++規(guī)定:每個類必須有一個構造函數(shù)如果沒有提供構造函數(shù),C++會提供一個隱含的默認構造函數(shù),該默認構造函數(shù)是無參構造函數(shù),僅負責創(chuàng)建對象,不做初始化工作只要一個類定義了一個構造函數(shù),C++就不再提供隱含的默認構造函數(shù),對于默認構造函數(shù)只能由用戶自己定義在用默認構造函數(shù)創(chuàng)建對象時,對于全局對象或靜態(tài)對象,對象全部初始化為0。否則,對象值是隨機的5.類成員的構造類的數(shù)據(jù)成員是類對象時,構造函數(shù)要采用以下形式來定義:構造函數(shù)(形參):類成員1(參數(shù)),類成員2(參數(shù))類成員的參數(shù)可以是常量、構造函數(shù)的形參或省略類成員的參數(shù)省略時,表示調(diào)用類成員的默認構造函數(shù)來初始化類成員,此時可在冒號后省略掉類成員調(diào)用哪個構造函數(shù)由類成員的參數(shù)匹配來決定常量類型和引用類型的數(shù)據(jù)成員的初始化必須放在冒號后面對于數(shù)據(jù)成員是普通變量類型(非引用和常量類型)的情況,放在冒號后或放在函數(shù)體中初始化都可以C++中,變量的初始化的形式有兩種:形式一:變量名=值;形式二:變量名(值);構造函數(shù)的冒號后面的初始化只能采用形式二6.對象的構造順序創(chuàng)建對象的唯一途徑是調(diào)用構造函數(shù)局部和靜態(tài)對象,以聲明的順序構造文件作用域的靜態(tài)對象在主函數(shù)開始運行前全部構造完畢塊作用域中的靜態(tài)對象在首次進入到定義該靜態(tài)對象的函數(shù)時進行構造靜態(tài)對象只被構造一次所有全局對象都在main()之前被構造由于編譯器不能控制文件的連接順序,所以不能決定不同文件中全局對象之間的構造順序建議不要從一個全局對象訪問另一個全局對象數(shù)據(jù)成員按其在類中聲明的順序構造,不按在冒號后出現(xiàn)的順序構造十一,拷貝構造函數(shù)C++程序的內(nèi)存格局:全局數(shù)據(jù)區(qū)(data):存放全局變量、靜態(tài)數(shù)據(jù)、常量代碼區(qū)(code):存放函數(shù)代碼棧區(qū)(stack):存放為運行函數(shù)而分配的局部變量、參數(shù)、返回數(shù)據(jù)、返回地址等堆區(qū)(heap):自由動態(tài)存儲區(qū)堆C中用malloc()/free()在堆中動態(tài)分配和釋放內(nèi)存C++中,采用new/delete操作堆時,分配和釋放必須匹配使用調(diào)用malloc()/free()時,不會自動調(diào)用構造函數(shù)和析構函數(shù)類對象的建立是分配空間、構造結構和初始化的整體過程,統(tǒng)一由構造函數(shù)完成3.分配堆對象a)new的格式單個隨機堆內(nèi)存:new數(shù)據(jù)類型單個初始化堆內(nèi)存:new數(shù)據(jù)類型(初始值)堆數(shù)組:new數(shù)據(jù)類型[元素個數(shù)]new返回一個具有操作數(shù)之數(shù)據(jù)類型的指針delete的格式單個堆內(nèi)存:delete由new返回的指針堆數(shù)組:delete[]由new返回的數(shù)組指針用new創(chuàng)建堆對象時,會自動調(diào)用構造函數(shù)用delete銷毀堆對象時,會自動調(diào)用析構函數(shù)在堆上分配對象數(shù)組時,只能調(diào)用默認構造函數(shù),因此只有定義了默認構造函數(shù)的類才能在堆上分配對象數(shù)組4.拷貝構造函數(shù)用處:用一個對象初始化一個新構造的對象對象作為實參傳遞給函數(shù)形參(值傳遞)時拷貝構造函數(shù)形式:類名(類引用參數(shù));類定義中如果沒有提供拷貝構造函數(shù),則C++將提供一個隱含的默認拷貝構造函數(shù)默認拷貝構造函數(shù)的工作方法是逐個成員依次拷貝淺拷貝:采用逐個成員依次原樣復制的拷貝方法。默認拷貝構造函數(shù)是淺拷貝深拷貝:非資源成員采用淺拷貝,資源成員重新申請的拷貝方法。需自定義拷貝構造函數(shù)通常在析構函數(shù)中涉及到釋放資源時,必須自定義拷貝構造函數(shù)實現(xiàn)深拷貝5.臨時對象當函數(shù)返回一個對象時,會創(chuàng)建一個臨時對象,用來存放返回的對象臨時對象僅在整個創(chuàng)建他們的外部表達式語句范圍內(nèi)有效,該語句執(zhí)行完后,臨時對象便被析構含有返回對象的函數(shù)的表達式,會先后調(diào)用兩次拷貝構造函數(shù)6.無名對象直接顯式調(diào)用構造函數(shù)會產(chǎn)生一個無名對象無名對象的用處:初始化引用初始化一個新對象作為實參傳遞給函數(shù)7.含有一個參數(shù)的構造函數(shù),可用來從一種類型轉換為另一種類型十二,靜態(tài)成員和友元1.靜態(tài)成員使用原因:有些屬性是類的所有對象所共有的,需要讓該類的所有對象在該類的范圍內(nèi)能共享這些屬性靜態(tài)成員用static聲明靜態(tài)成員包括靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)在對象的內(nèi)存空間中不包含靜態(tài)數(shù)據(jù)成員類聲明中不允許對靜態(tài)數(shù)據(jù)成員進行初始化,只含有靜態(tài)數(shù)據(jù)成員的聲明靜態(tài)數(shù)據(jù)成員和靜態(tài)變量一樣,在主函數(shù)main()執(zhí)行之前已經(jīng)存在為便于類的重用,建議靜態(tài)數(shù)據(jù)成員的初始化應放在類的內(nèi)部實現(xiàn)文件中進行靜態(tài)數(shù)據(jù)成員初始化時要用類名引導靜態(tài)成員與類相聯(lián)系,不與對象相聯(lián)系,訪問靜態(tài)成員時不需要對象,一般要加類名前綴2.靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員和普通數(shù)據(jù)成員一樣,其訪問權限受到存儲控制的影響b)使用場合:1.用來保存流動變化的對象個數(shù)作為一個狀態(tài)標志作為指向鏈表首尾成員的指針3.靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)只認類型,不認對象靜態(tài)成員函數(shù)的定義中,不允許對非靜態(tài)成員的默認訪問c)靜態(tài)成員函數(shù)中沒有this指針4.友元函數(shù)目的:使普通函數(shù)可以訪問一個類的保護或私有數(shù)據(jù)成員,以提高效率b)在類定義中聲明,加關鍵字friend友元函數(shù)是一個普通函數(shù),不是成員函數(shù),但可以訪問友類的全部成員友元函數(shù)的聲明位置可以在類的任何部位,不受存取控制的限制友元函數(shù)的定義通常和類成員函數(shù)定義在一起,不能定義為內(nèi)聯(lián)函數(shù)一個類的成員函數(shù)可以是另一個類的友元整個類可以是另一個類的友元十三,繼承1.派生類的構造派生類可以直接訪問基類的保護成員類與類(包括基類與子類)之間,以接口(成員函數(shù))方式作溝通派生類的構造順序:基類、對象成員、自身2.虛函數(shù)允許子類的成員函數(shù)重載基類的成員函數(shù)滯后聯(lián)編:在運行時,能依據(jù)實際對象的類型確定調(diào)用哪個重載函數(shù)的能力,又稱多態(tài)性C)先期聯(lián)編:編譯時就能確定(按變量的定義類型確定)那個重載函數(shù)被調(diào)用編譯時通常是在先期聯(lián)編狀態(tài)下工作的,只有看到虛函數(shù)時才把它作為遲后聯(lián)編來處理若語言不支持多態(tài),但支持類,則稱其為基于對象的語言,不是面向對象的語言在成員函數(shù)前加virtual,使其成為虛函數(shù),具有多態(tài)性基類中聲明為虛函數(shù)的成員函數(shù),自動傳遞到子類,使子類中的重載函數(shù)自動成為虛函數(shù)(virtual可以省略)若虛函數(shù)在子類和基類中出現(xiàn)的僅僅是名字相同,而參數(shù)類型或返回類型不同,則即使寫上virtual,也不是虛函數(shù)建議一個類中將所有的成員函數(shù)都盡可能設置為虛函數(shù)只有類的成員函數(shù)才能說明為虛函數(shù)靜態(tài)成員函數(shù)不能說明為虛函數(shù)內(nèi)聯(lián)函數(shù)不能是虛函數(shù)虛函數(shù)都是非內(nèi)聯(lián)的,即使定義在類的內(nèi)部構造函數(shù)不能是虛函數(shù)析構函數(shù)通常聲明為虛函數(shù)3.抽象類只能用于繼承,不能用來聲明一個實例對象的類,稱為抽象類一個抽象類至少有一個純虛函數(shù)C)純虛函數(shù):virtual返回類型函數(shù)名(參數(shù))=0;子類若沒有對基類的所有純虛函數(shù)進行重載,則該子類仍為抽象類不能創(chuàng)建一個抽象類的對象,但可以聲明一個抽象類的指針或引用十四,多重繼承1.基類子對象的處理非虛擬繼承的,原樣復制虛擬繼承的,只復制一份2.構造順序按被繼承的聲明順序構造基類子對象(先虛基類,后非虛基類)按類成員的聲明順序構造類成員C)最后調(diào)用類自身的構造函數(shù)派生類的構造函數(shù)必須激活所有基類的構造函數(shù),并把相應的參數(shù)傳遞給它們3.訪問控制公有權限:內(nèi)外,子類都可訪問保護權限:對內(nèi)不對外,子類可訪問C)私有權限:對內(nèi)不對外,子類不可訪問4.繼承的訪問控制:默認的繼承類型是私有繼承對基類的訪問權限由基類的訪問控制和繼承類型綜合決定5.一個私有的或保護的派生類不是子類,不能做基類能做的所有事情6.公有繼承又稱類型繼承,私有繼承又稱實現(xiàn)繼承十五,運算符重載1.概述a)運算符是系統(tǒng)內(nèi)部定義的,具有特定語法規(guī)則b)重載運算符時,要注意該重載運算符的運算順序和優(yōu)先級不能變C)運算符是函數(shù),參數(shù)和返回類型可以重新說明重載形式:返回類型operator運算符(參數(shù)說明)參數(shù)說明部分,不能都是內(nèi)部類型,至少有一個是用戶自定義類型,且通常為引用型不能創(chuàng)造新的運算符“.”,“::”,“.*”,“.->”,“?:”不能重載“=”,“()”,“[]”,“->”必須以成員函數(shù)的形式重載2.參數(shù)和返回類型參數(shù)個數(shù)作為非成員函數(shù)時(通常為友元)單目運算符,有一個參數(shù)雙目運算符,有兩個參數(shù)作為成員函數(shù)時(隱含了this作為第一個參數(shù))單目運算符,無參數(shù)雙目運算符,有一個參數(shù)返回類型單目運算符,引用返回雙目運算符,值返回3.重載的個數(shù)a)參數(shù)全都是用戶自定義類型時,只需重載一次。將該運算符放在操作對象的前或后時,都是調(diào)用該重載函數(shù)b)參數(shù)中含有基本數(shù)據(jù)類型時(雙目運算),有兩種方法:分別定義前后兩個重載運算符函數(shù),其中一個定義為調(diào)用另一個的內(nèi)聯(lián)函數(shù)先定義含有該基本數(shù)據(jù)類型參數(shù)的構造函數(shù),然后定義全是類類型參數(shù)的重載運算符函數(shù)4.重載增量運算符(++)前增量,參數(shù)與返回的是同一個對象,采用引用返回后增量,返回的是存放實參對象值的臨時對象,采用值返回C)C++約定:在增量運算符的定義中,放上一個int形參,就是后增量運算符后增量運算符定義中的int形參,只是起到區(qū)分前后增量的標志作用,在定義頭中可以省略形參名5.轉換運算符聲明形式:operator類型名()作用:將對象轉換成類型名規(guī)定的類型C)強制轉換只能對基本數(shù)據(jù)類型進行操作轉換運算符重載函數(shù)與類型轉換構造函數(shù)是互逆函數(shù)要避免轉換構造函數(shù)和轉換運算符重載函數(shù)的同向二義性通常定義為成員函數(shù)6.表達式中運算符的匹配順序尋找作為成員函數(shù)的重載運算符尋找作為非成員函數(shù)的重載運算符C)尋找系統(tǒng)定義的運算符尋找操作數(shù)的類型轉換重載運算符尋找操作數(shù)的類型的系統(tǒng)內(nèi)部定義7.賦值運算符C/C++規(guī)定:只要是用戶定義的類型,都應能進行賦值運算。數(shù)組是集合,不是類型對任何類,C++系統(tǒng)提供默認的賦值運算符重載函數(shù)拷貝構造函數(shù)是對還未生成的對象進行初始化,賦值運算是對已存在對象進行拷貝復制操作通常定義為成員函數(shù),采用引用返回通常是在淺拷貝不合適時,才重載通常函數(shù)體包括兩部分:首先取消對象以占用的資源(相當于析構函數(shù))然后分配新資源,并賦值(相當于拷貝構造函數(shù))若將賦值運算符說明為非公有的,則可將賦值操作限定在類作用域范圍內(nèi),防止應用程序中使用賦值操作十六,I/O流1.標準設備對應關系a)標準輸入cinstdin鍵盤b)標準輸出coutstdout屏幕c)標準錯誤cerrstderr屏幕d)打印輸出clogstdprn打印機2.標準I/O流原理頭文件:iostream.h實現(xiàn):cin,cout,cerr,clog均是系統(tǒng)全局對象ostreamcout(stdout);

istreamcin(stdin);對應每個基本數(shù)據(jù)類型都有友元<<,>>運算符重載函數(shù)寫到cerr對象上的信息不能重定向,只能顯示到屏幕上3.文件流類頭文件:fstream.h,對應設備是文件類層次:ofstream/ifstream->fstream4.串流類a)頭文件:strstrea.h,對應設備是字符串緩沖區(qū)b)ostrstream/istrstream->strstream5.流控制符7.a(chǎn))7.i. 十進制flags(10)decii. 十六進制flags(16)hexiii. 八進制flags(8)octiv. 填充字符flags(c)setfill(c)v. 有效位數(shù)precision(n)setprecision(n)vi. 域寬度width(n)setw(n)使用I/O成員函數(shù)a)讀取輸入行cin::getline()b)讀取一個字符cin::get()c)輸出一個字符cout::put()使用控制符,定義在viomanip.h>中對應關系6.重載插入運算符(<<)形式:ostream&operator<<(ostream&輸出對象,用戶類&用戶類對象)不能作為類成員函數(shù)8.繼承基類的<<運算先定義一個抽象基類在抽象基類中聲明一個純虛函數(shù)(用于顯示類成員信息),形式為virtualvoiddisplay(ostream&out)=0;派生子類中,具體實現(xiàn)display()定義重載插入運算符函數(shù),形式為:ostream&operator<<(ostream&oo,基類&類對象);重載插入運算符函數(shù)中調(diào)用:類對象?displ町()十七,模板1.概述作用:可使程序對任何其他數(shù)據(jù)類型進行同樣方式的處理C++程序由類和函數(shù)組成模板可分為類模板、函數(shù)模板函數(shù)模板的聲明形式:template<類型形式參數(shù)表>返回類型函數(shù)名(形式參數(shù)表){函數(shù)定義體;};類型形式參數(shù)表中,若為類類型,必須加前綴class函數(shù)模板只是對函數(shù)的描述,不是實際的函數(shù)。在函數(shù)調(diào)用時,系統(tǒng)會根據(jù)實參類型按模板生成一個重載函數(shù),該函數(shù)稱為模板函數(shù)類模板的聲明形式:template<類型形式參數(shù)表>class類模板名{類聲明體;};類模板中成員函數(shù)的定義形式:template<類型形式參數(shù)表>返回類型類模板名<類型名>::成員函數(shù)名(形式參數(shù)表){函數(shù)定義體;}類模板是模板的定義,定義中使用通

溫馨提示

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

評論

0/150

提交評論