c播客第五部分cprimer章節(jié)版_第1頁
c播客第五部分cprimer章節(jié)版_第2頁
c播客第五部分cprimer章節(jié)版_第3頁
c播客第五部分cprimer章節(jié)版_第4頁
c播客第五部分cprimer章節(jié)版_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、目錄第二章 開始學(xué)習 c+1第三章 數(shù)據(jù)處理1簡單變量1const 限定符2浮點數(shù)2c+算術(shù)操作符2第四章 復(fù)合類型2數(shù)組(array)2字符串3string 類簡介4結(jié)構(gòu)(struct)簡介4共用體(union)5枚舉類型(enum)54.7 指針和空間54.8 指針、數(shù)組和指針算術(shù)6第五章 循環(huán)和關(guān)系表達式75.3while 循環(huán)7循環(huán)文本輸入8嵌套循環(huán)和二維數(shù)組8第六章 分支語句和邏輯操作符8第七章 函數(shù)c+的程序模塊97.3 函數(shù)與數(shù)組97.9 函數(shù)指針9第八章 函數(shù)探幽98.1 內(nèi)聯(lián)函數(shù)98.2變量10默認參數(shù)12函數(shù)重載12函數(shù)模板128.6 總結(jié)13第九章 內(nèi)存模型和名稱空間13

2、9.1 單獨編譯139.2持續(xù)性、作用域和性13布局 new 操作符15名稱空間15第十章 對象和類1610.1 過程性編程和面象編程16抽象和類16類的構(gòu)造函數(shù)和析構(gòu)函數(shù)17this 指針18對象數(shù)組1810.7 類作用域1910.9 總結(jié)19第十一章 使用類1911.1 操作符重載1911.6 類的自動轉(zhuǎn)換和強制類型轉(zhuǎn)換(未看)20第十二章 類的動態(tài)分配內(nèi)存2012.3 總結(jié)23第十三章 類繼承23公有派生23有關(guān)派生類構(gòu)造函數(shù)的要點23繼承is-a 關(guān)系24多態(tài)公有繼承24控制:protected25抽象基類25繼承和動態(tài)內(nèi)存分配25類設(shè)計回顧26第十四章 C+中的代碼重用28包含對象成

3、員的類28私有繼承28多重繼承(MI)30類模板3114.5 總結(jié)32第十五章15.1、異常和其他32. 3215.2 嵌套類3315.3 異常3315.4 RTTI34第章 string 類和標準模板庫3416.1 string 類34STL36通用編程技術(shù)36c+源代碼風格 1 每行一條語句 2 每個函數(shù)的兩個花括號各占一行 3 函數(shù)中的語句都對于花括號進行縮進 4 與函數(shù)名稱相關(guān)的圓括號周圍沒有空白(空行將語句與程序的其他部分分開,或在變量前,c+的做法是盡可能在首次使用變量前)。第二章 開始學(xué)習 c+變量名的約定:類型_名稱 或者是類型()名稱(akjl)c 語言輸入輸出是 prf,s

4、canf,他們都包含在頭文件 stdio.h 中操作符重載:通過重載,同一個操作符將有不同的含義。&操作符表示地址操作符又表示 and 按位操作符c+程序應(yīng)當為程序中使用的每個函數(shù)提供原型,而庫函數(shù)在頭文件中有,而在庫文件中有他的定義。標準 c 庫中提供了 140 多個預(yù)定義函數(shù),而 main()函數(shù)不是關(guān)鍵字,由于它不是語法的組成頭文件 stdlib.h 中 rand()函數(shù)不接受任何參數(shù),并返回一個隨機整數(shù),其函數(shù)如下:rand(void);第三章 數(shù)據(jù)處理3.1 簡單變量內(nèi)置 c+類型有基本類型和復(fù)合類型 sizeof 操作符能夠打印類型或變量長度的頭文件 climits 包含了整型限制

5、信息字節(jié)數(shù),如:sizeof();sizeof a;/a為變量c+的變量的初始化有兩種,第一種 c 語言的:a=15;第二種是 c+的:是不確定的a(15);如果不初始化那么變量的值C+添加了兩種類型:long long 和 unsigned long long 兩種類型都至少是 64 位的couthex;/告訴編譯器以 16 進制的方式輸出coutbianliangoct;/輸出完以后切換到 8 進制的方式輸出coutbianliangdec/輸出完以后切換回 10 進制cout1982ul;c+打印常量時候,常量后面加 l 或 l 表示 1982 被存為 long 型,若是 ul 或 ul

6、 表示存為 unsignedlong 型,若是 u 或 u 表示存為 unsigned,若無后綴表示存為。char ch=a;cout.ph);/成員變量 put()可以打印 char 型變量,也可以寫成 cout.put(n);c+轉(zhuǎn)義序列符 (括號里的為 ascii 符號)coutendln”n”;/三種方式等效且都表示換行通用字符名:通用字符名以u 或u 開頭,u 后面在跟 8 個進制位,而u 后面跟 16 個進制位,這些位表換行符(nl 或lf)n退格(bs)b回車(cr)r反斜杠()單引號()水平制表符 (ht)t垂直制表符(vt)v(bel)a問號(?)?雙引號(“)”schar_

7、maxsigned char 最大值char_bitchar 的位數(shù)ing_min最小值uchar_maxunsignedchar最大值schar_minsigned char 最小值shrt_maxshort 最大值long_maxlong 最大值unit_maxunsigned最大值char_maxchar 的最大值shrt_minshort 最小值long_minlong 最小值ulong_maxunsignedlong最大值char_minchar 的最小值_max最大值ushrt_maxunsigned short最大值示的是 iso10646 編碼(iso10646 是一種正在制定

8、中的國際標準,位大量的字符提供字符編碼,他與 unicode 合作,確保標準同步,unicode 可以表示 96000 多種符號和 49 個手寫符號,而 ascii 碼就是 unicode 的一個子集)cout”ni gu00e2teau.n”;打印如下 ni gteau/ 的 iso10646 編碼是 00e2特殊類型:wcha_t寬字符類型bool 類型,任何數(shù)字值或指針指都可以被隱式的轉(zhuǎn)換為 bool 值。任何非零值都被轉(zhuǎn)換為 true,零被轉(zhuǎn)換為 false;反之a(chǎn)a=true;long bb=false;也成立。3.2 const 限定符const long months=true;

9、/const 限定符用于定義常量const 限定符定義常量時常量名一般全用大寫,便于與變量區(qū)分;要直接初始化,否則將無法初始化3.3 浮點數(shù)浮點數(shù)的書寫有兩種方式:常用的標注-942635;-1.54e-45.6545e8 。浮點類型要添加頭文件 float.h,浮點型的類型有 float(32 位,其精度低,系統(tǒng)至少有 6 位有效數(shù)位或更低),double(64 位,精度至少在 13 位有效位),long double(80,96,128 位)。浮點常量默認為 double 類型若希望常量位 float,要用 f 或 f 后綴,對于long double 類型。使用 l 或 l(盡量用 l,

10、l 像 1) cout2.2l3.12f8.123;/8.123 為 double 默認型c+標準在默認輸出時會刪除小數(shù)點后末尾的零,如將 23.450000 顯示成 23.45。 cout.setf(ios_base:fixed,ios_base:flatfield);/可以覆蓋默認設(shè)置,讓打印末尾的 0 顯示出來3.4 c+算術(shù)操作符求模操作符要求兩個數(shù)必須為整數(shù)潛在的數(shù)值轉(zhuǎn)換問題大浮點型小浮點型:精度降低可能超出目標類型的取值范圍,結(jié)果是不確定的。浮點型整型:小數(shù)丟失,原先的值可能超出目標類型的取值范圍,結(jié)果不確定。大整型小整形:容易超出范圍,通右邊字節(jié)強制類型轉(zhuǎn)換:不會修改變量本身,而

11、是創(chuàng)建一個新的指定類型的值。其格式有兩種:(long) bianliang;/c 語言強制類型轉(zhuǎn)換的方式long (bianliang);/c+風格,其想法是讓強制轉(zhuǎn)換類型就像是函數(shù)調(diào)用第四章復(fù)合類型復(fù)合類型:在 c 語言中叫派生類型,而 c+中類使用了“派生”這個詞,所以叫復(fù)合類型4.1 數(shù)組(array)數(shù)組的三要素是:每個元素的類型,數(shù)組名,元素數(shù), 如 short mouths12數(shù)組的下標總是從 0 開始到元素數(shù)減 1 結(jié)束;如果下標超界,編譯器不會報錯,但可能破壞數(shù)據(jù)或代碼也可能異常終止。所以必須確保有效下標。long kk10=10,12,6856,12; /oklong jj1

12、0;/okjj10=1,2,3;/not allowedlong cc = jj;/not allowed/數(shù)組初始化,有逗號隔開,大括號里元素可以少于元素總數(shù),數(shù)組的這種初始化只能用與定義數(shù)組的時候。也不能把一個數(shù)組賦給另一個數(shù)組coutsizeof kk;/輸出 kk 這個數(shù)組的字節(jié)數(shù),有 40 個字節(jié)coutsizeof kk1;/輸出 kk 這個數(shù)組的第二個元素的位元組數(shù)他有 4 個字節(jié)long longlongkk15=0;/將沒個元素都初始化為 0 的方法,為被定義的元素自動初始化為 0。kk=0,523,54,3,4;/編譯器計算出內(nèi)的元素個數(shù),這里為 5 個long_kk=si

13、zeof kk/sizeof(short);/不知道數(shù)組的個數(shù)是多少,這樣就知道了4.2字符串c+處理字符串的方式有兩種 1:來自 c 語言,常被稱為 c-風格字符串;另一種基于 string 類庫定義兩個 char 型數(shù)組:char dog5=a,b,c,d,c;/定義 了一個 char 型數(shù)組,的不是一個字符串char cat5=a,b,c,d,0;/的是一個字符串,到空字符結(jié)束。/在確定的字符串所需的最短數(shù)組時,別忘了將結(jié)尾的空字符計算在內(nèi)另一種初始化字符串的方法:char kk=”nihao!”;/編譯器會在字符串最后加上”0”字符;字符串拼接字符串常量:下面的語句是等效的。引號,字符

14、單引號cout” cout”cout”可以將字符串分開”寫,但雙引號緊靠著,中間無符號”;/不建議采用這種方法也可以將字符串直接寫在一對雙引號內(nèi)”;也可以將字符串分開寫,”并像這樣放在兩行里,第一行末尾沒有分號”;/這中方法是解決一行內(nèi)字符串太多,分行寫strlen()函數(shù)是標準函數(shù)庫 cstring 的函數(shù) 用來確定字符串的長度。char kk15=”nihao!”;/strlen 只計算可見字符,不把空字符計操作數(shù)在內(nèi)coutstrlen(kk)” sizeof(kk);/sizeof 是確定數(shù)組的長度kk3=0;coutkk”打印如下:6/當 cout 讀到0時變停止”kk5;/后面的字

15、符忽略(未被清空),/0有截取字符的功能15 nih!一行字符串的輸入:istream 中的類(如 cin)提供面向行的類成員函數(shù):getline()和 get().getline()將丟去換行符,而 get()將換行符保留在輸入序列中。getline()有兩個參數(shù),第一個是數(shù)組名第二個是字符數(shù)-1(如若是 20,最多度 19 個)在指定數(shù)目的字符或遇到換行符時停止。不保存換行符,最后用空字符代替。get()有幾個變體。其中一個與 getline 相似他們接受參數(shù)相同,解釋參數(shù)也相同。該函數(shù)并不是用空字符代替換行符,而是,并將換行符保留在輸入列中,這樣 get()將無法跨行,因為下個 get(

16、)一開始就讀到了換行符,并有把他保存在輸入隊伍中.cin.get(kk,20);cin.get();/get()另一個變體 cin.get()可cin.get(mm,20);一個字符,即使是換行符,這樣就可以保留在輸入列中可以將兩個類成員函數(shù)合并:cin.get(array,200).get();/第一個 get()返回一個 cin 對象,該對象隨后被用 來調(diào)用第二個 get()函數(shù)。同樣:cin.get(array,200). cin.get(array,200);也是可以的等效于調(diào)用兩次 getline()。而 cin.get().get()則不行,以為第一個 get()不返回對象.混合輸

17、入字符串和數(shù)字:a; char kk100;cina;/如果就這樣將跳過下一行,有一個回車;取消回車的方法:(cina).get();/加括號cin.getline(kk,100);/如果就這樣,c+程序長使用指針(不是數(shù)組)來處理字符串無法輸入字符串就跳到下一行,因為上一行有回車4.3 string 類簡介string 類包含在頭文件 string 里,且位于名稱空間 std 中。string 對象的方式與使用字符數(shù)組相同:可以使用 c-風格字符串來初始化 string 對象;可以使用 cin 來將鍵盤輸入到 string 對象中;可以使用 cout 來顯示 string對象;可以用數(shù)組的表

18、示法其中的字符理論上,char 數(shù)組是一個字符串的單元,string 類變量是一個表示字符串實體string str1=”kjlsamdl”,str2,str3;/string 對象可以看做是一個變量,可以連續(xù)定義str2=str1;/ str2+=str1;/str2+=“nikan”;可以將以個string 對象賦給另一個 string 對象可一將 string 對象相加,+=是將以個字符串附加到另一個 string 對象的末尾/也可以將一個string 對象的末尾加上一個字符串string 類是 c+新增的 string成處理輸入的字符串,c 語言中的字符串可使用頭文件 cstring

19、提供的函數(shù)來完char c120=”jjjj”,c220;/數(shù)組也可以連續(xù)定義,要注意不要超出數(shù)組的大小。strcpy(c2,c1);/strcpy()能將 c1 中的字符串賦值到 c2 中,出數(shù)組的大小,會破壞數(shù)據(jù);發(fā)生錯誤。strcat(c2,”kkkk”) ;/strcat()函數(shù)能將字符串”kkkk”附加到 c2 字符串的末尾處coutc1tc2tstrlen(c1);/strlen()也是 cstring 提供的函數(shù),能數(shù)組中字符串的大小打印結(jié)果:jjjjjjkkkk 4string str=“123”;/如果沒有初始化,str 為 0 個字節(jié),他能夠隨著輸入字符串的大小自動調(diào)節(jié)ge

20、tline(cin,str);/string 對象的引入比 istream 晚很多,所以 getline 并不是 string 類方法,只能創(chuàng)建一個string 類的函數(shù)。因此只能這樣調(diào)用。kk=str.size();/size()是 string 對象的方法,他能夠讀出 str 內(nèi)的字符串個數(shù)為 3(不帶0空字符)4.4 結(jié)構(gòu)(struct)簡介結(jié)構(gòu)可以多種類型的數(shù)據(jù)。定義結(jié)構(gòu)描述:1 它描述并標記了能夠在結(jié)構(gòu)中的各種數(shù)據(jù)類型;2 按描述創(chuàng)建變量每個列表項都是一條語句,每一個語句都是一個結(jié)員struct inflatable goose;/定義結(jié)構(gòu)變量 這種風格是 c 語言中的inflata

21、nle vincent;/c+可以省略 struct 關(guān)鍵字goose.price 就相當于一個 double 類型的變量,可以像常規(guī)使用 double 變量那樣來使用它們,類成員函數(shù)就是從結(jié)員這里衍生來的,結(jié)構(gòu)也是 c+oop(類)堡壘的基石struct inflatable/ inflatable 是后的分號結(jié)束結(jié)構(gòu)成為新的類型的名稱;name、aa、bb 是結(jié)員;最char name20;。當然可以不加結(jié)構(gòu)名稱 inflatable 而建立以float doubkk= /aa;b;個結(jié)構(gòu)變量 kk,用 kk 來調(diào)用其結(jié)構(gòu)的成員,但因為沒有結(jié)構(gòu)名稱,所以不能定義其他的結(jié)構(gòu)變量,這樣后續(xù)程序

22、將不能使用該結(jié)構(gòu)可以在定義結(jié)構(gòu)時直接定義結(jié)構(gòu)變量,也可以直接對其初始化?!發(fā)eilei”,12.3,6.8;/初始化結(jié)構(gòu)變量之間必須用逗號。/要用逗號。c+不提倡使用外部變量,但提倡使用外部結(jié)構(gòu),還提倡外部符號常量/最后一個成員變量值后面不用加逗號,大括號的后面一定要加分號。inflatable inflatable結(jié)構(gòu)數(shù)組:inflatablemm=“l(fā)eilei”,12.3,6.8;/可以直接對結(jié)構(gòu)變量進行初始化,成員間用逗號,末尾用分號ll;ll=mm;/可以將結(jié)構(gòu)賦給另一個同類型的結(jié)構(gòu)kk2=/結(jié)構(gòu)數(shù)組是一個數(shù)組,而不是一個變量,這樣數(shù)組中的每個值都是一個結(jié)構(gòu)變量/每個結(jié)構(gòu)數(shù)組變量初始

23、化,用擴起來,每組變量用逗號, 可放一行也可分開“shuzu0”,0.5,13.546,“shuzu1”,513.1,56.133;/結(jié)構(gòu)數(shù)組變量之間也用逗號進行分隔,也可以放在一行內(nèi)結(jié)構(gòu)中的位字段4.5 共用體(union)是一種數(shù)據(jù)格式,它能夠不同的數(shù)據(jù)類型,但只能同時其中的一種類型。結(jié)構(gòu)能夠同時各種類型,而共用體只能一種類型,因此共用體的長度為其最大成員的長度。公用體的用途之一是當數(shù)據(jù)項使用兩種或種格式(但不會同時使用)時,可以節(jié)省空間union mingchenglong long_aa;boub直接定義變量ouble_aa;bianliang;/語法與結(jié)構(gòu)一樣,但每次只調(diào)用一個成員,

24、可coutbianliang.long_aa;/輸出成員變量的值共用體:沒有名稱,其成員將成為位于相同地址處的變量。顯然每次只有一個成員是當前的成員struct inflatablechar name20;double hehe;unionlong long_aa;double double_aa;inflatable jiegou_bianliang;coutjiegou_bianliang.long_aa;/調(diào)用共用體成員被視為結(jié)構(gòu)的成員,可直接4.6 枚舉類型(enum)提供了另一種創(chuàng)建符號常量的方式,這種方式可以代替 const。也可以定義新的類型enum kka,b,c,d,e;/k

25、k 被稱為枚舉,a.b.c 等被稱為枚舉量,第一個枚舉量為 0,往后依次類推 kk band = d;/枚舉變量只能等于枚舉量,不能等于其他非 kk 枚舉的枚舉量band = kk(12);/可以通過枚舉來給枚舉變量賦值,通過這種方法給枚舉變量賦值的范圍為:上限:比這個枚舉量的最大值大的最小的 2 的冪的值減一,如:上式中最大枚舉量是 4,比 4 大的 2 的冪為 23=8,那上限是 23-1=7;下限:如果不小于零則下限是 0;如果小于零,則為小于最小枚舉量的最大 2 的冪加一,如最-6,則最小范圍為-(23)+1=-7選擇用多少空間來枚舉由編譯器決定,對于范圍小的枚舉使用一個字節(jié)或更小的空

26、間;enum kk=a,b=0,c=100,d,f;/枚舉量可以相同(a 和 b 的枚舉量都為 0),當 c=100,則 d=101,f=1024.7 指針和空間c+基本原理:面象編程與傳統(tǒng)的過程性編程的區(qū)別在于,oop 強調(diào)的是在運行階段而不是編譯階段進行決策。指針用于*m 表示值的地址,指針名表示的是地址。*操作符被稱為間接值或解除在該處的值。操作符,如 m 表示的是一個地址,* p_kare=&kk;/被初始化的是指針本身,確定指針指向的變量,而不是確定它指向的變量的值。操作符*兩邊的空格是可選的。c 程序員使用這種格式:*ptr;而 c+使用這種格式:* ptr;在 c+中,*是一種復(fù)

27、合類型,是指向的指針。* p1,p2;/這樣將創(chuàng)建一個指針 p1 和一個常規(guī)變量 p2。對于每一個指針變量名,都需要使用一個*。*a;*a=23;/未初始化的指針的。應(yīng)養(yǎng)成在定義指針時將指針初始化為一個確定的、適合的地址的。* pt=0 xb8000000;/錯誤。c+不允許將一個整型賦給指針,指針類型與整型是不一樣的。* pt=(*)0 xb8000000;/可以通過強制類型轉(zhuǎn)換將整型轉(zhuǎn)換為適當?shù)牡刂奉愋汀橐粋€數(shù)據(jù)對象(可以是結(jié)構(gòu),也可以是基本類型)獲得并指定分配內(nèi)存的通用格式如下:typename poer_name=new*typename;ps=new;/定義一塊新的內(nèi)存區(qū)域pn=p

28、s;/不要創(chuàng)建兩個指針指向同一個內(nèi)存塊的指針,因為這將增加錯誤刪除同一內(nèi)存塊兩次的可能。delete ps;/刪除指針指向內(nèi)存塊而不是指針的值,ps 的內(nèi)存,但不會刪除指針 ps 本身??蓪⑵渲赶蛄硪粋€新內(nèi)存塊delete 的使用一定要配對使用,否則將發(fā)生內(nèi)存泄露,被分配的內(nèi)存將無法再使用了,如果泄露嚴重,程序?qū)⒂捎诓粩鄬ふ覂?nèi)存而終止不能已的內(nèi)存塊,否則結(jié)果將不確定,這意味著什么情況都可能發(fā)生不能變量所獲取的內(nèi)存,不過,對空指針使用 delete 是安全的。在編譯時給數(shù)組分配內(nèi)存被稱為靜態(tài)聯(lián)編,意味著數(shù)組是在編譯時加到程序中的,這種叫做靜態(tài)數(shù)組;可以在程序運行時選擇數(shù)組的長度被稱為動態(tài)聯(lián)編,意

29、味著數(shù)組是在程序運行時創(chuàng)建的,這種叫做動態(tài)數(shù)組。為數(shù)組分配內(nèi)存的通用格式如下:type_name = new type_name num_elements;如:long* p_kk = new long 100;一個 new數(shù)組要用 delete zhizhenming;動態(tài)數(shù)組的使用* a = new值的地址。2;a0=0;a1=1;/初始化??梢詫⑺闯蒩2數(shù)組來處理,a的地址為數(shù)組第一個a+=1;/此時 a0=1; a-=1;/此時 a0=0delete a;/將指針的值切換為數(shù)組的第一個值的地址,給 delete提供正確的地址,便于。4.8 指針、數(shù)組和指針算術(shù)指針和數(shù)組基本等價的原因

30、在于指針算術(shù)和 c+內(nèi)部處理數(shù)組的方式規(guī)范一下:*p 不是指向類型的指針,而是完全等同于一個類型的變量;p 才是指針。將指針變量加一,就是增加的值等于指向的類型占用的字節(jié)數(shù)。如:long* a;a+;/a 指針變量保存的地址加 4*(poname+j)=ponamej或者 arraynamej=*(arrayname+j)/數(shù)組表示法與指針表示法之間區(qū)別區(qū)別:可以修改指針值,而數(shù)組名是常量;sizeof 操作符對數(shù)組得到的是數(shù)組長度,而對指針得到的是指針的長度,即使指針指向的是一個數(shù)組。指針和字符串:數(shù)組和指針的特殊關(guān)系可以擴展到 c-風格字符串。char flower10=”nihao”;/

31、常規(guī)定義一個 char 型數(shù)組來字符串coutflower”haizaima?n”;/flower 打印時并不是打印第一個字符,而是打印從該地址起往后的字符串,直到遇到0/后面”haizaima?n”字符串打印,cout 只知道第一個字符的地址,打印直到遇到0結(jié)束在 cout 和多數(shù) c+表達式中,char 數(shù)組名、指向 char 的指針以及應(yīng)用引號的字符串常量都被解釋為字符串第一個字符的地址。const char* pp=”nihao”;/ ”nihao”表示是其第一個字符的地址,所以 pp 所保存的地址為字符串第一個字符的地址。形式與 char 型數(shù)組一樣,但 char 型數(shù)組的數(shù)組名可以

32、重新定義數(shù)組的字符串,但是常量字符串 const 不能被重新定義。coutflowerendl(*)flower;/第一個打印的是字符數(shù)組中的字符串,第二個打印的是第一個字符的地址。char 型數(shù)組在初始化后重新定義時,初始化的字符串將被清空而重新定義警告:在將字符串讀入程序時,應(yīng)使用已分配的內(nèi)存地址,該地址可以是數(shù)組名也可以是 new 初始化過的指針。如果給 cout 提供一個指針,他將打印地址。但如果指針類型為 char 則 cout 將顯示指向的字符串。如果要顯示字符串的地址,則要用強制轉(zhuǎn)換符轉(zhuǎn)換成另一種指針類型,對其進行轉(zhuǎn)換 cout(*)pendl;strcpy()可以將一個字符串數(shù)

33、組給另一個字符串數(shù)組:atrcpy(shuzu1,”zif”);/也以將字符串給數(shù)組但當數(shù)組的空間不足時,會超出數(shù)組內(nèi)存,超出部分將覆蓋數(shù)組后面的其他內(nèi)存;這樣講會影響程序運行,因此我們用 strncpy 這個函數(shù)來它不能添加空字符0如:strncpy(shuzu,”nai znlls”,5);/它將字符串的前五個字符付給了數(shù)組,但所以要設(shè)置 shuzu5=0;/要添加語句,確保字符數(shù)組的最后為空字符,要不然它的不是字符串了使用 new 創(chuàng)建動態(tài)結(jié)構(gòu):在運行時創(chuàng)建數(shù)組優(yōu)于在于編譯時創(chuàng)建數(shù)組,對于結(jié)構(gòu)也是如此。struct inflatable char name20;float volume

34、;double price;;/創(chuàng)建結(jié)構(gòu)模板 ,定義其中的結(jié)員。inflatable *ps = new inflotable;/定義一個指針指向在堆中創(chuàng)建的結(jié)構(gòu);ps 表示指向結(jié)構(gòu)的指針,*ps 是表示結(jié)構(gòu)變量cin.get(*ps).name,20);/由于創(chuàng)建的結(jié)構(gòu)變量沒有名稱,而只有指向他的指針,所以可以用*ps 表示結(jié)構(gòu)名稱。coutname來結(jié)員。記住:結(jié)構(gòu)變量名來成員時用句點符(.),當用指向結(jié)構(gòu)變量名的指針來成員時要用-操作符第五章 循環(huán)和關(guān)系表達式第五章的主要內(nèi)容:for 循環(huán) 表達式和語句 遞增和遞減操作符:+和- 組合賦值操作符 復(fù)合語句(語句塊)逗號操作符 關(guān)系操作符

35、while 循環(huán) typedef 工具 get()字符輸入方法 文件尾條件 嵌套循環(huán)和二維數(shù)組 for 循環(huán):其中的判斷表達式都能轉(zhuǎn)換成 bool 型,如判斷表達式為 i,若 i=1 為真,若 i=0 為假,而所有的表達式也都可以轉(zhuǎn)化成 bool 類型的 true 或者 false 類型;c+表達式都是值與操作符的組合,每個 c+表達式都有值。maid=(cooks=4)+3;/在 c+中可以這樣做,但是不提倡這樣做,這樣只是為了讓 x=y=z=0;這樣的語句存在long a=100;cout1;/a1 這個表達式為真成數(shù)值 1,他將顯示一個數(shù)字 1。要成為表達式就必須能確定其值。cout.s

36、etf(ios.base:boolalpha); /將輸出結(jié)果轉(zhuǎn)化成 bool 類型,同時用 true 和 false 表示,而不是 1 和 0coutaword;kk=word.size();a+/表示先使用當前的,使用完后就加一。+a/表示先加一后,在使用其值。組合賦值操作符:有+=-=*=/=%=復(fù)合語句(也叫語句塊):單獨的一對大括號就是一個語句塊,在一個語句塊內(nèi)定義的變量到語句塊外面就逗號操作符:逗號操作符的優(yōu)先級是最低的。如:i=20,j=i*2;/兩個語句是有先后順序,翻過來是不行的了for(long i=0,j=10;ij;i+,j-)/逗號操作符一般用于 for 循環(huán)語句中。

37、這個循環(huán)可以將字符串中的字符反過來。關(guān)系表達式:=!=;/for 第二個關(guān)系表達式如果為賦值表達式則其表達式的值是 truec-風格字符串的比較:要用到 cstring 類庫中 strcmp()可以比較兩個字符串的大小,是否相等。如果兩個字符串相同則該函數(shù)返回的值為零;如果第一個字符串按字母順序排在第二個字符串之前,則返回一個負數(shù);如果第一個字符串按字母順序排在第二個字符之后,則返回一個正數(shù)。char aa20;if(aa=”nihao”)/錯誤,這是比較兩個字符串地址。正確的比較是:if(strcmp(aa,“nihao”)=0)string 類字符串的比較:string 類的比較字符串方法

38、是比較簡單的。string str1;str1 = “nihao”;/這里比較的是兩個字符串,并非比較的是內(nèi)存地址。5.3while 循環(huán)while(1);/分號是一個結(jié)束語句,while 是沒有循環(huán)體,是一個死循環(huán),編譯時什么也不動用 wh循環(huán)來計時:在 ctime 頭文件中 clock()可以解決計時問題。ctime 提供了以個符號常量 clocks_per_sec,該常量等于每秒鐘包含的系統(tǒng)時間數(shù)。將系統(tǒng)時間除以這個值將得到秒數(shù),將秒數(shù)除以這個變量可以得到以系統(tǒng)時間為的時間。clock_t 是 clock()函數(shù)返回類型的別名,可以將變量為 clock_t 類型,他表示long、unsi

39、gnde或系統(tǒng)其他類型類型別名:c 風格的預(yù)處理命令#define 和 c+的 typedef 都可以來創(chuàng)建類型別名。#define ch char*;/在編譯時所有的 ch 都被替換成 char*,這樣 ch kk;中的 kk 就是以個 char 型指針。這里用char*代替 ch,但是如果定義 ch a,b;則會被更復(fù)雜的情況。成 char *a,b;但是 typedef 就不會出現(xiàn)這個問題,它能解決typedef char* ch;/也可以這樣,有時只能這樣,這是 c+風格 這里用 char*來代替 chdo wh環(huán)一次。循環(huán):這種循環(huán)不如前兩種,但他有他的特別用法,如讓用戶輸入一 個數(shù)

40、后在做判斷,這個循環(huán)至少循5.5 循環(huán)文本輸入cinch;/ 使用原始的輸入能將鍵盤輸入的下一個字符輸入到變量中,但他能將空格、換行符和制表符忽略。cin.get(ch);/定已達到 eof下一個字符,不管該字符是什么,并將其在 ch 中。其通過返回轉(zhuǎn)換為 false 的 bool 值確ch=cin.get();/成員函數(shù)調(diào)用 cin.get()返回下一個輸入字符,包括空格、換行符合制表符通過返回 eof 值來已達到 eofeof 檢測文件尾:eof 是在文件 iostream 中定義的5.6 嵌套循環(huán)和二維數(shù)組long kk23= /可以將其看成包含 2 個元素的數(shù)組,而每個元素有包含了 3

41、 個 long 型整數(shù)的數(shù)組。13,12,11,/初始化時每一行內(nèi)用逗號,每一行之間用逗號,同一維數(shù)組一樣要將其在最后加分號。15,16,18;/可以把他們寫在一行內(nèi),但作為一種風格,分行寫成表格的形式,清晰也便于查找,結(jié)尾用分號 char* kk2=“nihao”,/定義并初始化指針數(shù)組。初始化和普通數(shù)組一樣,只不過這里的值是字符串”haizai ba !”;/第一個字符串的地址,而調(diào)用 kk0時就等于調(diào)用了第一個字符串第六章 分支語句和邏輯操作符if 語句:條件操作符合錯誤防范,if(3=kk)/6.2 邏輯表達式這樣做如果=寫成=,編譯器就會報錯。而 if(kk=3)將恒成立or 操作符

42、|:i+ 6/如果 i=10,則在比較 i6 時,i 會變成 11,運算順序從左向右。and 操作符&:if(1kk5)/這個判斷永遠為 1,等價于 if(1kk)5)/110;/如果 x=0,第一個條件為假,后面的就不在判斷了,避免了除零C 語言中邏輯操作符的另一種表示方式:就是用 not、or、and 來代替! | &。在 c 語言中要加上頭文件 iso646.h,它們不是 c 語言的保留字,在 c+中不能使用,它們都是 C+的保留字。字符函數(shù)庫 cctype該函數(shù)庫中的函數(shù)能夠判斷,輸入的字符是大寫,小寫,數(shù)字,空格,符號等,比用邏輯操作符判斷起來簡單多了。?:操作符:它是 c+唯一一個

43、需要兩個操作符的操作符,在程序員中廣受歡迎。switch 語句:當選擇不是一個范圍時,超過 3 個以上選項,一般就用 switch 語句,都不符合就用 default: i+;break;case c:/如果 case 后面沒有 break;那么將執(zhí)行下一個 case,直到碰到 break。case值,非范圍case c:hanshu();break;/這樣輸入大寫小寫都行,這也是一種解決大小寫一樣的6.6break 和 continuebreak 是用在 switch 語句或任何循環(huán)中,他能夠跳出 switch 或循環(huán)后面的語句出執(zhí)行都必須是一個單獨法continue 語句用于循環(huán)中,讓程序

44、跳過循環(huán)體當前一輪循環(huán)后面的代碼,并開始下一輪循環(huán);goto 語句:一般情況下不要用 goto 語句,容易造成錯誤,一般在多層嵌套循環(huán)內(nèi)層,直接跳出,用 goto 比用多個break 簡單第七章 函數(shù)c+的程序模塊函數(shù)在中接受參數(shù)與在定義中接受參數(shù)可以用不一樣的變量名。如:void kk(long j);/void kk(long k)/定義在函數(shù)參數(shù)的過程中,如果基本類型(非復(fù)合類型)不匹配,c+會自動強制類型轉(zhuǎn)換,但盡量避免強制類型轉(zhuǎn)換,造成數(shù)據(jù)破壞7.3 函數(shù)與數(shù)組的屬性和特別之處 long kk=10;viod hans(long &kk);void hanshans(const lo

45、ng &kk)/變量、定義函數(shù)為了保證被調(diào)用函數(shù)只使用調(diào)用函數(shù)的變量值,而不是是修改變量值,一般情況下是不用的,如果要用引用可以將被調(diào)用函數(shù)中的const long*const kk;為 const,這樣只能使用該函數(shù),但是不能修改它的值,這就像是void hans(kk+3);/這是錯誤的,現(xiàn)在的 c+ 是不允許將表達式傳遞給,而按值傳遞是允許的void hanshans(kk+3);/這是正確的,在現(xiàn)在 c+中如果參數(shù)定義為 const時,可以給他傳遞非變量名的參數(shù)因為這樣/它創(chuàng)建了臨時變量,用原函數(shù)變量值,但沒修改的狀況指向臨時變量時,但是函數(shù)不會修改器臨時變量值,這樣避免了想修改/用

46、const以轉(zhuǎn)換編程時不會去修改原函數(shù)的變量。在 c+中使用時盡量將為 const 這樣傳遞的類型可將于用于結(jié)構(gòu):非常適合用于結(jié)構(gòu)和類,c+加入主要為了用于這些類型的,而不是基本的內(nèi)置類型7.9 函數(shù)指針獲取函數(shù)的地址:只要使用函數(shù)名(后面不跟參數(shù))即可函數(shù)指針:假一個函數(shù)為:double pam()確的指針類型為:double (*pf) () 這與 pam()的類似,只是把 pam 替換成了(*pf),由于 pam 是函數(shù),則(*pf)也是函數(shù),而如果(*pf)是函數(shù),則 pf 是指向函數(shù)的指針由于括號的優(yōu)先級比*高,則*pf()表示,pf 是一個返回指針的函數(shù),而(*pf)(),表示 p

47、f 是一個指向函數(shù)的指針。正確的了函數(shù)指針之后,可以將函數(shù)的地址賦給它:double pam(); double (*pf)();pf=pam使用指針來調(diào)用函數(shù):(*pf)扮演了函數(shù)名的角色,所以使用(*pf)的時候只需要將它看作是函數(shù)名即可:double pam(); double (*pf)();pf=pam;double x = (*pf)(5); 和 double x = pf(5);都是正確的第八章 函數(shù)探幽8.1 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)的編譯代碼和其他程序代碼“內(nèi)聯(lián)”起來了,也就是說編譯器將使用相應(yīng)的函數(shù)代碼替換函數(shù)調(diào)用(有多少次調(diào)用就有多少次拷貝),內(nèi)聯(lián)函數(shù)的運行速度比常規(guī)函數(shù)快,但是

48、需要占用相對于調(diào)用時間短,則可以使用內(nèi)聯(lián)函數(shù)的內(nèi)存。如果代碼的執(zhí)行時間函數(shù)前加上關(guān)鍵字 inline,函數(shù)定義前加上關(guān)鍵字 inline內(nèi)聯(lián)函數(shù)和常規(guī)函數(shù)一樣,也是按照值來傳遞的。內(nèi)聯(lián)和宏#define SQUARE(x)x*xa=SQUARE(5);b= SQUARE(5+2);c= SQUARE(a+);則只有 a 能夠被正確賦值。宏只是簡單地替換,并不能有函數(shù)那么智能8.2變量是已定義的變量的別名.修改的值和修改變量的值是一樣的效果創(chuàng)建變量:& rodents = rats;其中&不是地址操作符,而是表示 rodents 是 rats 的變量,rats;的&表示是指向,就像在中 char

49、* 表示的是指向 char 的指針。rats 和 rodents 的地址相同。必須在聲明將的時進行初始化。和 const 類型相似,必須在時初始化。用作函數(shù)參數(shù):經(jīng)常被用作函數(shù)的參數(shù),使得函數(shù)中的變量名成為調(diào)用程序中的變量的別名,這種傳遞參數(shù)的方式叫做按傳遞。和按指針傳遞效果一樣。例子(交換兩變量的值):void swapr(temp = a; a=b;b=temp;&a,&b)void swapp(temp=*a;*a=*b;*b=temp;swapr(a,b);*a,*b)void swapp1(*temp=a; a=b;b=temp;swapp1(&a,&b);*a,*b)調(diào)用方法分別為

50、a;b;swap(&a,&b);第三種方式不行,因為它只是交換了函數(shù)內(nèi)部的指針指向的地址,并沒有改變該地址的變量的值。當函數(shù)結(jié)束時,兩個指針變量將會被銷毀,則沒有對兩個變量的值產(chǎn)生任何變化。的屬性和特別之處:按值傳遞可以接受多種類型的實參:cube(x+2);cube(x*5)。但是按傳遞不可以接受多種類型的實參,但 const 引 用可接受多種類型的實參。像cube(x+2);這種形式,因為表達式 x+2 并不是變量如果參數(shù)為 const時,C+允許生成臨時變量,即按傳遞參數(shù)的函數(shù)調(diào)用的參數(shù)不是或者與相應(yīng)的 const參數(shù)的類型不匹配,則 C+將創(chuàng)建類型正確的變量,將函數(shù)調(diào)用的參數(shù)的值傳遞給

51、該變量,并讓參數(shù)來該變量。因為如果接受的參數(shù)的函數(shù)的意圖是修改作為參數(shù)傳遞的變量,則編譯器將會讓兩個臨時變量交換值,而原來的變量的值不變,const 變量不允許改變變量的值,因此不會出錯,可行。如:refcube(const double x);a;可以接受:refcube(7);refcube(x+2);refcube(a);盡可能的使用 const:使用 const 可以避免無意中修改數(shù)據(jù)的編程錯誤;使用 const 可以接受 const 類型的數(shù)據(jù),也可以接受非 const 類型的數(shù)據(jù);使用 const 能使函數(shù)正確的生成臨時變量,減少錯誤.將用于結(jié)構(gòu):struct sysopchar

52、name26; char quote64;used;sysop copycat= use(looper);const & sysop use(sysop & sysopref)sysopref.used +;cout”name:”endl; cout”quote:”sysopref.quoteendl; cout”used:”sysopref.usedendl;return sysopref;main()sysop copycat;sysop looper=“NAME”,”QUOTE”,0;use(looper);如果函數(shù) use()返回的是一個結(jié)構(gòu),則 sysopr

53、ef 的內(nèi)容將被copycat=use(looper);到一個臨時返回單元中,然后該臨時返回單元的內(nèi)容將被到 copycat 中。然而由于 use 返回的是一個指向 looper 的。這種情況下,looper 的內(nèi)容將被直接返回到 copycat 中,這是返回指向結(jié)構(gòu)的而不是結(jié)構(gòu)的優(yōu)點:效率更高時需要注意的問題:避免返回當函數(shù)終止的時候不再存在的內(nèi)存單元const sysop &clone(sysop &sysopref)sysop newguy; newguy = sysopref; return newguy;const sysop &clone(sysop &sysopref)sysop

54、 *newguy = new sysop;*newguy = sysopref; return *newguy;左邊的那種方式不行,因為在函數(shù)結(jié)束之后,臨時變量 newguy 就會被銷毀。C+中使用 new 的方式可以,但是需要使用 delete 來關(guān)于指針的一個小感悟:它們,auto_ptr 模板可幫助自動完成工作。*pt;未初始化的在。指針,系統(tǒng)會分配 pt 的空間(沒保存的地址),即并不會分配它指向的的空間,空間不存*pt=new;系統(tǒng)會分配pt 的空間,并且會分配它指向的的空間,只是的值是不確定的??臻g存在空間應(yīng)該存在。a=5; *pt=a;這個的意思是,把 a 的值賦給*pt,就是把

55、 a 的值寫到pt 指向的類型的空間去。前提是該pt=&a;這個的意思是,把 a 的地址賦給pt,就是把 a 的地址到pt 的空間里面。如果原來分配了變量的空間,也會被覆蓋。use()返回類型是 const sysop &。表示不能使用它返回的去修改它指向的。不能使用:use(looper).used = 10;將主用于類對象:(使用 string 類作為例子)明了不能修改 const 類型的變量,不能返回已經(jīng)被銷毀的變量的對象、繼承和:派生類繼承了基類的方法,意味著派生對象可以使用基類對象的方法?;惪梢灾赶蚺缮悓ο?,而如需進行強制類型轉(zhuǎn)換,可以定義一個接受基類作為參數(shù)的函數(shù),調(diào)用該函數(shù)時

56、,可以將基類對象作為參數(shù),也可以將派生類對象作為參數(shù)。何時使用參數(shù):使用參數(shù)的主要的原因有兩個:程序員能夠修改調(diào)用函數(shù)中的數(shù)據(jù)對象通過傳遞而不是整個數(shù)據(jù)對象,可以提高程序的運行速度。使用、指針、按住傳遞的一些指導(dǎo)原則:1.對于使用傳遞的值而不對其作修改的函數(shù):如果數(shù)據(jù)對象很小,如內(nèi)置數(shù)據(jù)類型或者小型數(shù)據(jù)類型,就使用傳值調(diào)用。如果數(shù)據(jù)對象是數(shù)組,則使用指針,因為這是唯一的選擇,并將指針為指向 const 的指針如果數(shù)據(jù)對象是較大的結(jié)構(gòu),則使用 const 指針或 const,以提高效率,節(jié)省空間和時間如果數(shù)據(jù)對象是類對象,則使用 const。類設(shè)計的語義常常要求使用。傳遞類對象參數(shù)的標準方式是按

57、傳遞。2.對于修改調(diào)用函數(shù)中數(shù)據(jù)的函數(shù):如果數(shù)據(jù)對象時內(nèi)置數(shù)據(jù)類型,就使用指針。如果數(shù)據(jù)對象是數(shù)組,只能使用指針。如果數(shù)據(jù)對象是結(jié)構(gòu),則使用或指針如果數(shù)據(jù)對象是類對象。則使用。8.3 默認參數(shù)通過函數(shù)原型來設(shè)定默認值,如:char *left(const char*str ,i = 1); i 的默認值為 1對于帶參數(shù)列表的函數(shù),必須從右向左添加默認值,也就是說,要為某個參數(shù)設(shè)置默認值,則必須為它右邊所有的參數(shù)提供默認值,因為實參按照從左到右的順序依次被賦給相應(yīng)的形參,不能跳過任何參數(shù)。one(two( three(n,n,m =4,j=5);/valid/invalidbeers=one(2

58、);beers=one(1,2); beers=one(1,2,3);/the same as: one(2,4,5);/the same as: one(1,2,5);/the same as: one(1,2,3);m=5,j);n=1,m =4,j=5); /valid注意:只有原型制定了默認值,函數(shù)定義與沒有默認參數(shù)時完全相同。8.4 函數(shù)重載函數(shù)多態(tài)(函數(shù)重載)能夠使多個同名的函數(shù)存在,術(shù)語多態(tài)指的是有多種形式,因此函數(shù)多態(tài)允許函數(shù)可以有多種形式。術(shù)語函數(shù)重載指的是可以有多個同名的函數(shù),因此對名稱進行了重載。函數(shù)重載的關(guān)鍵是函數(shù)的參數(shù)列表,也稱為函數(shù)特征標。(并不是返回值,不同返回值

59、不能夠進行函數(shù)重載)但是一些看起來彼此不同的特征表不能共存,如:double cube(double x);和 double cube(double & x);因為:double x = 3; cuble(3); 與這兩個原型都匹配,系統(tǒng)不知道調(diào)用哪個原型,因此它們不允許共存。何時使用函數(shù)重載:僅當函數(shù)基本上執(zhí)行相同任務(wù),但是使用不同形式的數(shù)據(jù)時,才采用函數(shù)重載8.5 函數(shù)模板函數(shù)模板是通用的函數(shù)描述,也就是說,他們使用通用類型來定義函數(shù)。templatevoid Swap(Any &a,Any &b)Any temp=a; a=b;b=temp;以上兩者等價。第一行templatevoid

60、Swap(Any &a,Any &b)Any temp=a; a=b;b=temp;要建立一個模板,并將類型命名為 Any。調(diào)用的方式為:i=1;j=2;Swap(i,j);double x=1.0; double y=2.0; Swap(x,y);編譯器會自動生成函數(shù)的版本和 double 版本,不需要程序員參與。重載的模板:可以像重載常規(guī)函數(shù)定義一樣重載模板定義。templatevoid Swap(Any a,Any b,Any temp;for(i=0;in;i+)temp=ai ai=bi; bi=temp;templatevoid Swap(Any &a,Any &b)Any tem

溫馨提示

  • 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

提交評論