




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、個人筆記總結(jié)范文 c+ 個人筆記總結(jié) - - good luck believe yourself just go - 1 - 概述: 一、 c+ 語言語法根底 (6) 1.從 c 到 c+的過渡 2.類和對象 3.操作符重載 4.繼承與多態(tài) 5.異常和 i/o 流 二、數(shù)據(jù)結(jié)構(gòu)和算法 1.根本數(shù)據(jù)結(jié)構(gòu),堆棧、隊列、鏈表、二叉樹,實現(xiàn)和應(yīng)用(2) 2.排序和查找算法 三、模板和 stl 1.模板語法 2.stl 四、階段工程 簡化的企業(yè)管理信息系統(tǒng)(mis) - 2 - 第一課 從 從 c c 到 到 c+ 的過渡 一、背景介紹 算盤 - 面向硬件的編程 電子計算機 - 機器語言的編程 101
2、0 - 匯編語言的編程 add - 高級語言的編程 fortran printf ("%d", 12); - 結(jié)構(gòu)化程序設(shè)計 c/pascl 順序、分支、循環(huán)、函數(shù) - 面向?qū)ο蟮某绦蛟O(shè)計 c+/java/c# - 面向問題的程序設(shè)計 1960 - algol 60,算法語言,遠(yuǎn)離硬件,不適合進(jìn)行系統(tǒng)開發(fā) 1963 - 劍橋大學(xué),cpl,在 algol 60 的根底上增加對系統(tǒng)開發(fā)的支 持,復(fù)雜,不易掌握,不易使用 1970 - mit,bcpl,cpl 的精華版,易學(xué)易用,太慢,不實用 1972 - ken thomposon,b 語言,通過運行時支持優(yōu)化 bcpl 的性
3、能,缺少類型 1973 - dennis ritchie,c 語言,用 c 重新實現(xiàn) unix 內(nèi)核 1978 - the c programming language,第一個 c 語言的事實標(biāo)準(zhǔn) 1989 - ansi c,c89 1990 - iso c, c90 1999 - iso c 修訂,c99 197x - bajarne stroustrup,simula 早期的面向?qū)ο笳Z言,性能低 下,b 語言。 1979 - 貝爾實驗室,多核 unix 系統(tǒng)仿真,cpre, 通過擴展宏為 c 語言增加類似 simula 的面向?qū)ο髾C制。c with class: simula - 類 al
4、ogo 68 - 操作符重載 ada - 模板、名字空間 smalltalk - 引用、異常 c 是 c+的子集,c+是對 c 的擴展。 1983 - c+命名 1985 - cfront 1.0,第一款商用 c+編譯器 1987 - gnu c+ 1990 - borland c+ 1992 - microsoft c+,ibm c+ 1998 - iso c+98 xx - iso c+03 xx - iso c+xx/c+11/c+0x - 3 - 二、 c+ 語言的使用領(lǐng)域: 1.游戲開發(fā):強建模能力,性能高。 2.科學(xué)計算:fortran,c+算法庫。 3.網(wǎng)絡(luò)和分布式:ace 框架
5、。 4.桌面應(yīng)用:vc/mfc,office,qq,多媒體 5.操作系統(tǒng)和設(shè)備驅(qū)動:優(yōu)化編譯器的創(chuàng)造使 c+在底層開發(fā)方面可 以和 c 向媲美。 6.移動終端 既需要性能,同時又要有面向?qū)ο蟮慕!?三、 c+比 比 c c 更豐富 1.支持面向?qū)ο螅瑢栴}域和方法域統(tǒng)一化。宏觀面向?qū)ο?,微觀面 向過程。 2.支持泛型編程。 int add (int a, int b) . template<typename t> t add (t a, t b) . 3.支持異常機制。 int func (void) . int main (void) if (func () = -1) 錯誤處
6、理; 4.操作符重載 四、第一個 c+ 程序 1.編譯器:g+,如果用 g 需要帶上-lstdc+, 指定其使用標(biāo)準(zhǔn) c+的運行庫。 2.源文件擴展名:.cpp/./.c/.cxx/.c+,最好用.cpp 3.頭文件:#include <iostream> 大多數(shù)標(biāo)準(zhǔn)庫頭文件都沒有.h 后綴。 4.輸出:cout - 標(biāo)準(zhǔn)輸出對象 輸入:cin - 標(biāo)準(zhǔn)輸入對象 插入運算符:<< 提取運算符:>> 5.std:所有標(biāo)準(zhǔn)庫的函數(shù)、對象、類型都位于 std 名字空間中。 - 4 - 五、名字空間 1. 對程序中的標(biāo)識符(類型、函數(shù)、變量), , 按照某種邏輯規(guī)那
7、么劃分成假設(shè)干組。 2. 定義名字空間 namespace 名字空間名 名字空間成員; 3. 使用名字空間 1 1 作用于限定符:名字空間名 : 名字空間成員, 表示訪問特定名字空間中的特定成員。 例子: #include <iostream> int main (void) std :cout << "hello, world !" << std :endl; int i; double d; char s256; / scanf ("%d%lf%s", &i, &d, s); std :cin &g
8、t;> i >> d >> s; / printf ("%d %lf %s n", i, d, s); std :cout << i << " " << d << " " << s << "n" return 0; - 2 2 名字空間指令: using namespace 名字空間名; 在該條指令之后的代碼對指令所指名字空間中的所有成員都可見, 可直接訪問這些成員,無需加“:”。 例: using namespa
9、ce std; 3 3 名字空間聲明: using 名字空間名:名字空間成員; 將指定名字空間中的某個成員引入當(dāng)前作用域, 可直接訪問這些成員,無需加“:”。 - 5 - 4. 匿名名字空間 如果一個標(biāo)識符沒有被顯示地定義在任何名字空間中, 編譯器會將其缺省地置于匿名名字空間中。 對匿名名字空間中的成員通過“:名字空間成員”的形式訪問。 5. 名字空間合并 6. 名字空間嵌套 namespace ns1 namespace ns2 namespace ns3 void foo (void) . ns1:ns2:ns3:foo (); using namespace ns1:ns2:ns3; f
10、oo (); - 例子:名字空間 #include <iostream> using namespace std; /namespace void print (int money) cout << money << endl; / / 農(nóng)行名字空間 namespace abc int balance = 0; void save (int money) balance += money; void draw (int money) balance -= money; namespace abc void salary (int money) balance
11、 += money; - 6 - void print (int money) cout << "農(nóng)行:" :print (money); / 建行名字空間 namespace b int balance = 0; void save (int money) balance += money; void draw (int money) balance -= money; void salary (int money) balance += money; int main (void) using namespace abc; / 名字空間指令 save (50
12、00); cout << "農(nóng)行:" << balance << endl; draw (3000); cout << "農(nóng)行:" << balance << endl; b:save (8000); cout << "建行:" << b:balance << endl; b:draw (5000); cout << "建行:" << b:balance << endl;
13、using b:salary; / 名字空間聲明 / using abc:salary; salary (6000); cout << "建行:" << b:balance << endl; abc:print (abc:balance); return 0; - 7 - 六、 c+ 中的結(jié)構(gòu)、聯(lián)合和枚舉 1. 結(jié)構(gòu) 和 c 語言的不同: 1)定義結(jié)構(gòu)型變量時,可以省略 struct 關(guān)鍵字。 2)結(jié)構(gòu)內(nèi)部可以定義函數(shù)成員函數(shù)。 3)sizeof (空結(jié)構(gòu)) -> 1 例子: #include <iostream> us
14、ing namespace std; struct student char name128; int age; void who (void) / 成員函數(shù) cout << "我叫" << name << ",今年" << age << "歲了。" << endl; ; int main (void) student student = "張飛", 25, *ps = &student; student.who (); ps->
15、who (); struct a ; cout << sizeof (a) << endl; return 0; - 2. 聯(lián)合 增加了匿名聯(lián)合的概念。借用聯(lián)合語法形式, 描述一些變量在內(nèi)存中的布局方式。 int main() union int a; char ch4; ; a=0x12345678; 定義聯(lián)合變量時,可以不加 union - 8 - 例子: #include <iostream> using namespace std; int main (void) / 匿名聯(lián)合 union int x; char c4 /*= "a&quo
16、t;, "b", "c", "d"*/; ; cout << (void*)&x << " " << (void*)c << endl; x = 0x12345678; for (int i = 0; i < 4; +i) cout << hex << (int)ci << " " cout << endl; return 0; - 3. 枚舉 枚舉是一個獨立的數(shù)據(jù)類型。 c: enum
17、 e a, b, c; enum e e; e = a; e = 1000; c+: enum e a, b, c; e e; e = a; e = b; e = c; b=1; / error ! e = 1000; / error ! e = 1; / error ! - 9 - 例子: #include <iostream> using namespace std; int main (void) enum e a, b, c; e e; e = a; e = b; e = c; / / / e = 1000; / 報錯 / e = 1; / 報錯 return 0; 七、
18、c+ 的布爾類型,跟在 t cout 后面可以 boolalpha bool b = true; b = false; cout << sizeof (b) << endl; / 1 b = 100; b = 1.234; b = "hello" b = "a" 八、 c+ 中的運算符別名 && - and | - or & - bitand - xor - <% - %> - <: - :> - 10 - 九、 c+ 中的函數(shù) 1. 重載:條件 在同一個作用域中, 函數(shù)名相同, 參
19、數(shù)表不同的函數(shù), 構(gòu)成重載關(guān)系。 c+編譯器會對程序中的函數(shù)做換名, 將參數(shù)表中的類型信息集合到函數(shù)名中,以保證函數(shù)名的唯一。 通過 extern "c",可以要求編譯器不做 c+換名,以方便在 c 語言的模塊中使用c+編譯生成的代碼。 方式一: extern "c" int add (int a, int b) return a + b; int sub (int a, in t b) return a - - b; 方式二: extern "c" int add (int a, int b, int c) return a + b
20、 + c; 2. 缺省參數(shù)和啞元參數(shù) 1)如果調(diào)用一個函數(shù)時,沒有提供實參,那么對應(yīng)形參就取缺省值。 2)如果一個參數(shù)帶有缺省值,那么 它后邊的所有參數(shù)必須都帶有缺省值。 3)如果一個函數(shù)聲明和定義 分開,那么缺省參數(shù) 只能放在聲明中。 4)防止和重載發(fā)生歧義。 5)只有類型而沒有名字的形參,謂之啞元。 i+ - operator+ +i v1: void decode (int arg) . v2: void decode (int) . 例子 1 1 :重載與缺省值 #include <iostream> using namespace std; void foo (int a
21、 = 10, double b = 0.01, const char* c = "tarena"); / 函數(shù) 1 1 void foo (void) / 函數(shù) 2 2 / 函數(shù) 1 1 與函數(shù) 2 2 構(gòu)成重載關(guān)系 void bar (int) / 函數(shù) 3 3 - 11 - cout << "bar(int)" << endl; void bar (int, double) / 函數(shù) 4 4 cout << "bar(int,double)" << endl; / 函數(shù) 3 3 與函
22、數(shù) 4 4 構(gòu)成重載關(guān)系 int main (void) foo (1, 3.14, "hello"); / 調(diào)用函數(shù) 1 1 foo (1, 3.14); / 調(diào)用函數(shù) 1 1 foo (1); / 調(diào)用函數(shù) 1 / foo (); / 歧義 ,可以調(diào)用函數(shù) 2 2 ,但也可以調(diào)用函數(shù) 1 1 ,因為函數(shù) 1 1 在不提供實參的情況下, 可以取缺省值。 bar (100); / 調(diào)用函數(shù) 3 3 bar (100, 12.34); / 調(diào)用函數(shù) 4 4 return 0; - 例子 2 2 :重載與作用域 #include <iostream> using n
23、amespace std; namespace ns1 int foo (int a) 函數(shù) 1 1 cout << "ns1:foo(int)" << endl; return a; ; namespace ns2 double foo (double a) 函數(shù) 2 2 cout << "ns2:foo(double)" << endl; return a; ; int main (void) using namespace ns1; / 名字空間指令 using namespace ns2; / 名字
24、空間指令 cout << foo (10) << endl; /10 調(diào)用函數(shù) 1 1 ,作用域可見 2 ns2 與 與 ns1 ,所以與函數(shù) 2 2構(gòu)成重載 cout << foo (1.23) << endl; /1.23 調(diào)用函數(shù) 2 2 ,作用域可見 2 ns2 與 與 ns1 ,所以與函數(shù)1 1 構(gòu)成重載 - 12 - using ns1:foo; / 名字空間聲明 (當(dāng)同時出現(xiàn)名字指令與名字空間聲明,那么名字空間聲明會隱藏名字空間指令) cout << foo (10) << endl; /10 ,調(diào)用函數(shù) 1
25、 1 ,只可見名字空間 1 ns1 的 的 foo(), 所以也并不構(gòu)成重載。 cout << foo (1.23) << endl; /10 ,調(diào)用函數(shù) 1 1 ,只可見名字空間 1 ns1 的 的 foo(), 所以也并不構(gòu)成重載。 using ns2:foo; / 名字空間聲明 cout << foo (10) << endl; /10 ,調(diào)用函數(shù) 1 1 ,可見名字空間 1 ns1 與名字空間 2 ns2 的foo(), 所以構(gòu)成重載。 cout << foo (1.23) << endl; /1.23 ,調(diào)用函數(shù)
26、 2 2 ,可見名字空間 1 ns1 與名字空間 2 ns2 的foo(), 所以構(gòu)成重載。 return 0; - 3. 內(nèi)聯(lián) 1)編譯器用函數(shù)的二進(jìn)制代碼替換函數(shù)調(diào)用語句,減少函數(shù)調(diào)用的時間開銷。這種優(yōu)化策略成為內(nèi)聯(lián)。 2)頻繁調(diào)用的簡單函數(shù)適合內(nèi)聯(lián),而稀少調(diào)用的復(fù)雜函數(shù)不適合內(nèi)聯(lián)。 3) 遞歸函數(shù)無法內(nèi)聯(lián)。 4)通過 inline 關(guān)鍵字,可以建議編譯對指定函數(shù)進(jìn)行內(nèi)聯(lián),但是僅僅是建議而已。 inline void foo (int x, int y). - 13 - 十、 c+ 的動態(tài)內(nèi)存分配 malloc/calloc/realloc/free 1.new/delete:對單個變量進(jìn)
27、行內(nèi)存分配/釋放 2.new/delete:對數(shù)組進(jìn)行內(nèi)存分配/釋放 例子:w new 與 與 delete #include <iostream> using namespace std; int main (void) / int* pi = (int*)malloc (sizeof (int); / free (pi); c /c 中的方法 int* pi = new int; *pi = 1000; cout << *pi << endl; delete pi; / 一定要釋放內(nèi)存,否那么會造成內(nèi)存泄露,很嚴(yán)重 pi = null; / 不要忘記這個
28、,雖然不會 報錯,但是要有好習(xí)慣 /* *pi = 2000; cout << *pi << endl; i /pi 指向的內(nèi)存地址已經(jīng)被釋放,被初始化為指向 null */ pi = new int10; for (sizet i = 0; i < 10; +i) pii = i; for (sizet i = 0; i < 10; +i) cout << pii << " " cout << endl; delete pi; / 千 萬記住 new 要用 delete 來釋放內(nèi)存 pi = null
29、; pi = new int (1234); /用 用 w new 分配內(nèi)存的同時初始化賦一個值。 cout << *pi << endl; /1234 delete pi; pi = null; char buf4 = 0x12,0x34,0x56,0x78; pi = new (buf) int; cout << hex << *pi << endl; / delete pi; cout << (void*)pi << " " << (void*)buf << e
30、ndl; int (*p)4 = new int34; delete p; int (*q)45 = new int345; delete q; return 0; - 14 - 十一、引用 1. 引用即別名。 int a = 20; int& b = a; / int* b = &a; b = 10; / *b = 10; cout << a << endl; / 10 2. 引用必須初始化。 int a; int* p; a = 20; p = &a; int& b; / error ! int& b = a; / ok 3.
31、 引用一旦初始化就不能再引用其它變量。 int a = 20, c = 30; int& b = a; b = c; / c => b/a 4. 引用的應(yīng)用場景 1) 引用型參數(shù) a.修改實參 b.防止拷貝,通過加 const 可以防止在函數(shù)中意外地修改實參的值,同時還可以接受擁有常屬性的實參。 2) 引用型返回值 int b = 10; int a = func (b); func (b) = a; 從一個函數(shù)中返回引用往往是為了將該函數(shù)的返回值作為左值使用。但是,一定要保證函數(shù)所返回的引用的目標(biāo)在該函數(shù)返回以后依然有定義,否那么將導(dǎo)致不確定的后果。 不要返回局部變量的引用,可
32、以返回全局、靜態(tài)、成員變量的引用,也可以返回引用型形參變量本身。 5. 引用和指針 1)引用的本質(zhì)就是指針,很多場合下引用和指針可以互換。 2)在 c+層面上引用和指針存在以下不同: - 15 - a. 指針式實體變量,但是引用不是實體變量。 int& a = b; sizeof (a); / 4 double& d = f; sizeof (d); / 8 b. 指針可以不初始化,但是引用必須初始化。 c. 指針的目標(biāo)可以修改,但是引用的目標(biāo)的不能修改。 d. 可以定義指針的指針,但是不能定義引用的指針。 int a; int* p = &a; int* pp = &
33、amp;p; / ok int& r = a; int&* pr = &r; / error e. 可以定義指針的引用,但是不能定義引用的引用。 int a; int* p = &a; int*& q = p; / ok int& r = a; int&& s = r; / error f. 可以定義指針的數(shù)組,但是不能定義引用的數(shù)組。 int a, b, c; int* parr = &a, &b, &c; / ok int& rarr = a, b, c; / error 可以定義數(shù)組的引用。
34、int arr = 1, 2, 3; int (&arrref)3 = arr; / ok 例子:指針與引用 #include <iostream> using namespace std; void swap1 (int a, int b) int c = a; a = b; b = c; void swap2 (int* a, int* b) int c = *a; *a = *b; *b = c; void swap3 (int& a, int& b) int c = a; a = b; b = c; - 16 - void swap4 (const
35、char* x, const char* y) const char* z = x; x = y; y = z; void swap5 (const char* x, const char* y) const char* z = *x; *x = *y; *y = z; void swap6 (const char*& x, const char*& y) const char* z = x; x = y; y = z; struct student char name1024; int age; ; void print (const struct student&
36、s) cout << << "," << s.age << endl; / s.age = -1; void foo (const int& x) cout << x << endl; int main (void) int a = 100, b = 200; / swap1 (a, b); / swap2 (&a, &b); swap3 (a, b); cout << a << " " << b <&l
37、t; endl; / 200 100 const char* x = "hello", *y = "world" / swap4 (x, y); / swap5 (&x, &y); swap6 (x, y); cout << x << " " << y << endl; student s = "張飛", 22; print (s); print (s); foo (100); return 0; - 17 - 十二、顯示類型轉(zhuǎn)換運算符 c:目標(biāo)類型變
38、量 = (目標(biāo)類型)源類型變量; 1. 靜態(tài)類型轉(zhuǎn)換 staticcast<目標(biāo)類型> (源類型變量) 如果在目標(biāo)類型和源類型之間某一個方向上可以做隱式類型轉(zhuǎn)換,那么在兩個方向上都可以做靜態(tài)類型轉(zhuǎn)換。反之如果在兩個方向上都不能做隱式類型轉(zhuǎn)換,那么在任意一個方向上也不能做靜態(tài)類型轉(zhuǎn)換。 int* p1 = .; void* p2 = p1; p1 = staticcast<int*> (p2); char c; int i = c; 如果存在從源類型到目標(biāo)類型的自定義轉(zhuǎn)換規(guī)那么,那么也可以使用靜態(tài)類型轉(zhuǎn)換。 例子:靜態(tài)類型轉(zhuǎn)換 #include <iostream&
39、gt; using namespace std; int main (void) int* p1 = null; 1 /p1 為 為 t int 型的指針 void* p2 = p1; 2 /p2 為 為 d void 型的指針 p1 = staticcast<int*> (p2); /將 將 d void 型的 2 p2 指針轉(zhuǎn)換為 t int 型指針并復(fù)制給 int型的 1 p1 指針。 return 0; - 2. 動態(tài)類型轉(zhuǎn)換 dynamiccast<目標(biāo)類型> (源類型變量) 用在具有多態(tài)性的父子類指針或引用之間。 3. 常類型轉(zhuǎn)換 constcast<
40、目標(biāo)類型> (源類型變量) 給一個擁有 const 屬性的指針或引用去常 const int a = 100; const int* p1 = &a; *p1 = 200; / error int* p2 = constcast<int*> (p1); *p2 = 200; / ok 4. 從解釋類型轉(zhuǎn)換 reinterpretcast<目標(biāo)類型> (源類型變量); 在不同類型的指針或引用之間做類型轉(zhuǎn)換,以及在指針和整型之間做類型轉(zhuǎn)換。 5. 目標(biāo)類型變量 = 目標(biāo)類型( ( 源類型變量) ) ; int a = int (3.14); - 18 - 例子
41、一:常類型轉(zhuǎn)換 #include <iostream> using namespace std; int main (void) const volatile int a = 100; ( (字 關(guān)鍵字 e volatile 在描述變量時使用, ,以 阻止編譯器優(yōu)化那些以 e valatile 修飾的變量 ,volatile被用在一些變量能被意外方式改變的地方, , 例如: : 拋出中斷, , 這些變量假設(shè)無 volate ile 可能會和編譯器執(zhí)行的優(yōu)化 相沖突. .) ) / a = 200; const volatile int* p1 = &a; / *p1 = 2
42、00; int* p2 = constcast<int*> (p1); / / / 去常,去掉常屬性 *p2 = 200; cout << *p2 << endl; / 200 cout << a << endl; / 200 / cout << 100 << endl; return 0; - - 例子二:解釋型類型轉(zhuǎn)換 #include <iostream> using namespace std; int main (void) int i = 0x12345678; char* p = re
43、interpretcast<char*> (&i); for (sizet i = 0; i < 4; +i) cout << hex << (int)pi << " " /78 56 34 12 cout << endl; float* q = reinterpretcast<float*> (&i); cout << *q << endl; void* v = reinterpretcast<void*> (i); cout <<
44、 v << endl; return 0; - 19 - 十三、 c+ 之父的建議 1. 少用宏,多用 const 、m enum 和 和 inline #define pai 3.141519 const double pai = 3.14159; #define errorfile -1 #define errormem -2 enum errorfile = -1, errormem = -2 ; #define max(a,b) (a)>(b)?(a):(b) inline int double max (double a, double b) return a &g
45、t; b ? a : b; 2. 變量隨用隨聲明同時初始化。 3. 少用 malloc/free ,多用 new/delete 。 4. 少用 c c 風(fēng)格的強制類型轉(zhuǎn)換,多用類型轉(zhuǎn)換運算符。 5. 少用 c c 風(fēng)格的字符串,多用 string 。 6. 樹立面向?qū)ο蟮木幊趟枷搿?- 20 - 附加: g string 類: 例子: #include <iostream> #include <cstring> #include <cstdio> using namespace std; int main (void) string s1 ("he
46、llo"); string s2 = "world" (s1 += " ") += s2; cout << s1 << endl; string s3 = s1; cout << s3 << endl; cout << (s1 = s3) << endl; s30 = "h" cout << s3 << endl; cout << (s1 > s3) << endl; cout << s1
47、.length () << endl; cout << (s1 = s3) << endl; cout << (strcasecmp (s1.cstr (), s3.cstr () = 0) << endl; cout << sizeof (s1) << endl; file* fp = fopen ("string.txt", "w"); / fwrite (&s3, sizeof (s3), 1, fp); fwrite (s3.cstr (), sizeof
48、 (char), s3.length (), fp); fclose (fp); return 0; - 21 - 第二課 類和對象 一、什么是對象 1.萬物皆對象 2.程序就是一組對象,對象之間通過消息交換信息 3.類就是對對象的描述和抽象,對象就是類的具體化和實例化 二 、通過類描述對象 屬性:姓名、年齡、學(xué)號 行為:吃飯、睡覺、學(xué)習(xí) 類就是附屬性和行為兩個方面對對象進(jìn)行抽象。 三、面向?qū)ο蟪绦蛟O(shè)計 (oop) 現(xiàn)實世界 虛擬世界 對象 -> 抽象 -> 類 -> 對象 1.至少掌握一種 oop 編程語言 2.精通一種面向?qū)ο蟮脑Z言uml 3.研究設(shè)計模式,gof 四、
49、類的根本語法 1. 類的定義 class 類名 ; 如 class student ; 2. 成員變量 屬性 class 類名 類型 成員變量名; ; 如 class student string mname; int mage; ; 3. 成員函數(shù) 行為 class 類名 返回類型 成員函數(shù)名 (形參表) 函數(shù)體; ; - 22 - 如 class student string mname; int mage; void eat (const string& food) . ; 4. 訪問控制屬性 1)公有成員:public,誰都可以訪問。 2)私有成員:private,只有自己可以
50、訪問。 3)保護(hù)成員:protected,只有自己和自己的子類可以訪問。 4)類的成員缺省訪控屬性為私有,而結(jié)構(gòu)的成員缺省訪控屬性為公有。 例子: #include <iostream> using namespace std; class student private: / 聲明為私有局部 string mname; int mage; public: / 聲明為私有局部 void eat (const string& food) cout << mage << "歲的" << mname << &qu
51、ot;同學(xué)正在吃" << food << "。" << endl; void setname (const string& name) / 為接口 if (name = "2") cout << "你才" << name << "!" << endl; else mname = name; void setage (int age) / 為接口 if (age < 0) cout << "
52、;無效的年齡!" << endl; else mage = age; ; int main (void) student student; student.setname ("2"); / 你才 2 2 student.setage (-100); / 無效年齡 student.setname ("張飛"); / 將其賦值給成員變量 mname - 23 - student.setage (20); / 將其賦值給 成員變量 mage student.eat ("包子"); 0 /20 歲的張飛同學(xué)正在吃包子 r
53、eturn 0; 5. 構(gòu)造函數(shù) class . 類名 (行參表) 構(gòu)造函數(shù)體; ; 當(dāng)一個對象被創(chuàng)立時,構(gòu)造函數(shù)會自動被執(zhí)行,其參數(shù)構(gòu)造實參。 6. 構(gòu)造函數(shù)可以通過構(gòu)造參數(shù)實現(xiàn)重載。 7. 如果一個類沒有定義任何構(gòu)造函數(shù),那么系統(tǒng)就會缺省地為其提供一個無參構(gòu)造函數(shù),該構(gòu)造函數(shù)對于根本類型的成員變量不做初始化,對于類類型的成員變量,調(diào)用其相應(yīng)類型的無參構(gòu)造函 數(shù)初始化。 8. 對象創(chuàng)立過程 分配內(nèi)存->調(diào)用構(gòu)造函數(shù)->調(diào)用類類型成員的構(gòu)造函數(shù)->構(gòu)造函數(shù)的代碼 9. 初始化表 class 類名 類名(.) :初始化表 構(gòu)造函數(shù)體 ; const int x = 100; x
54、 = 100; int& a = b; a = b; 1) 如果類中含有常量或引用型的成員變量,必須通過初始化表對其初始化。 2)成員變量的初始化順序僅于其被聲明的順序有關(guān),而與初始化表的順序無關(guān)。 class a public: a (char* psz) : mstr (psz), mlen (mstr.length() private: sizet mlen; string mstr; - 24 - 例子 1 1 :類的聲明與定義以及使用可以不在一個文件 這是 h s.h 文件 #ifndef sh #define sh #include <string> using
55、 namespace std; / 聲明 t student 類 class student public: student (const string& name = "", int age = 0); void eat (const string& food); private: string mname; int mage; ; #endif / sh 這是 p s.cpp 文件 #include <iostream> using namespace std; #include "s.h" / 實現(xiàn) t student
56、類 student:student (const string& name /* = "" */, int age /* = 0 */) : mname (name), mage (age) void student:eat (const string& food) cout << mname << "," << mage << "," << food << endl; 這是 p main.cpp 文件: #include "s.h&qu
57、ot; / 使用 t student 類 int main (void) student s ("張飛", 25); s.eat ("包子"); return 0; - - 25 - 例子 2 2 :不同的構(gòu)造函數(shù) #include <iostream> using namespace std; class a public: a (int a) ; class student private: string mname; int mage; a ma; / 類類型的成員變量 public: void eat (const string&am
58、p; food) cout << mage << "歲的" << mname << "同學(xué)正在吃" << food << "。" << endl; / void zn7student3eaterkss (student* this, / const string& food) / cout << this->mage << "歲的"<<this->mname / <<
59、; "同學(xué)正在吃" << food << "。" << endl; / / 這是計算機中編譯的 樣子 void setname (const string& name) if (name = "2") cout << "你才" << name << "!" << endl; else mname = name; void setage (int age) if (age < 0) cout <
60、< "無效的年齡!" << endl; else mage = age; / 如果同時有多種構(gòu)造函數(shù)存在,那么根據(jù)構(gòu)造參數(shù)來確定調(diào)用哪 個構(gòu)造函數(shù),既構(gòu)造函數(shù)可以通過構(gòu)造參數(shù)實現(xiàn)重載 / 構(gòu)造函數(shù) student (const string& name, int age) : ma (100) mname = name; - 26 - mage = age; / 無參構(gòu)造 student (void) : ma (100) / 沒有參數(shù) mname = "沒名" mage = 0; / 單參構(gòu)造 student (const s
61、tring& name) : ma (100), mname (name), mage (0) mname = "哈哈" ; int main (void) student s1 ("張飛", 25); s1.eat ("包子"); / zn7student3eaterkss (&s1, "包子"); / 編譯器中的樣子 student s2 = student ("趙云", 22); s2.eat ("燒餅"); / zn7student3eaterkss
62、(&s2, "燒餅"); / 編譯器中的樣子 student s3; / 調(diào)用的無參構(gòu)造 s3.eat ("煎餅果子"); student* s4 = new student ("關(guān)羽", 30); / 調(diào)用有參構(gòu)造,分配內(nèi)存,并初始化 s4->eat ("烤鴨"); / 當(dāng)訪問地址(指針或迭代器)的成員或數(shù)據(jù)時,用- -> > delete s4; student& s5 = *new student (); / 調(diào)用無參構(gòu)造初始化 s5.eat ("面條"); / 當(dāng)訪問直接對象的成員或數(shù)據(jù)時,用“. . ” delete &s5; student sa13 = s1, s2; /用 用 1 s1 與 與 2 s2 給數(shù)組初始化,但第三個元素沒有賦值 sa10
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 壯族特色公司年會策劃方案
- 大型促銷抽獎活動方案
- 大班暑假閱讀活動方案
- 大型策劃活動方案
- 天籟促銷活動方案
- 大型蛋糕活動方案
- 大班生活禮儀活動方案
- 場地比賽活動方案
- 大班奧運活動方案
- 大牌簽到活動方案
- 2025年新疆中考數(shù)學(xué)試卷真題
- 2025年福建省中考語文試卷真題(含標(biāo)準(zhǔn)答案)
- 保溫材料安全管理制度
- 餐飲廢棄物管理制度
- 2025年甘肅高考物理試卷真題及答案詳解(精校打印版)
- 護(hù)士禮儀與職業(yè)素養(yǎng)課件
- 玉溪市2025年事業(yè)單位公開招聘工作人員筆試歷年典型考題及考點剖析附帶答案詳解
- 2025至2030中國工業(yè)電機行業(yè)市場發(fā)展現(xiàn)狀及商業(yè)模式與投資發(fā)展報告
- 國內(nèi)在線教育的發(fā)展?fàn)顩r研究論文3000字
- 合肥長鑫存儲在線測評題2024
- DL-T5153-2014火力發(fā)電廠廠用電設(shè)計技術(shù)規(guī)程
評論
0/150
提交評論