Microsoft PowerPoint - C++類別.ppt

Similar documents
untitled

c_cpp

沒有投影片標題

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

Microsoft PowerPoint - L17_Inheritance_v4.pptx

untitled

新版 明解C++入門編

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

C++ 程式設計

untitled

Strings

C/C++语言 - C/C++数据

untitled

FY.DOC

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

untitled

提问袁小兵:

Microsoft PowerPoint - string_kruse [兼容模式]

C语言的应用.PDF

Microsoft PowerPoint - 11_Templates.ppt

CC213

epub 33-8

第七讲 继承与多态

Microsoft Word - ch04三校.doc

untitled

Microsoft PowerPoint - Class5.pptx

PowerPoint Presentation

Microsoft PowerPoint - P766Ch06.ppt

第3章.doc

The Embedded computing platform

相 应 功 能 (5) 再 将 Boy 类 作 为 Girl 类 的 友 元 类, 在 Boy 类 的 某 成 员 函 数 VisitGirl(Girl & ) 中 访 问 Girl 类 的 私 有 成 员, 观 察 编 译 器 给 出 的 信 息 ( 6 ) 删 除 两 个 类 中 的 函 数 V

Microsoft Word 軟體設計第二部份範例試題_C++_ _1_.doc

Strings

第二章 簡介類別

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

Chapter12 Derived Classes

A.doc

untitled

Microsoft PowerPoint - 13_ClassAndObj.ppt

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

ebook39-6

CC213

2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

投影片 1

全国计算机技术与软件专业技术资格(水平)考试

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

ebook39-5

3.1 num = 3 ch = 'C' 2

Microsoft Word - chap10.doc

Microsoft Word - 物件導向編程精要.doc

C 1

nooog

HR HR

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 01.DOC

Template

Microsoft PowerPoint - STU_C_Lang_CH13.ppt

Microsoft Word cppFinalSolution.doc

運算子多載 Operator Overloading

運算子多載 Operator Overloading

EJB-Programming-3.PDF

用户大会 论文集2.2.doc

第1章

untitled

C/C++语言 - 分支结构

untitled

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

踏出C++的第一步

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

C/C++ 语言 - 循环

概述

untitled

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

第1章

Microsoft PowerPoint - plan08.ppt

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

Microsoft PowerPoint - C-Ch08.ppt

untitled

A 1 (T65C 1) ; (T65C 1) A (T65C 1) ( ~ 1) A (T65C 1) A (T96B 3) A (T96B 3) 1 (T96B 3) 0.8

Microsoft PowerPoint - 20-string-s.pptx

文档 3

致遠管理學院法規提案單

プリント

Microsoft PowerPoint - 10 模板 Template.pptx

新・明解C言語入門編『索引』

Microsoft Word - CPE考生使用手冊 docx

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

CC213

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

Microsoft Word - data_mid1611_and_sol.docx

Microsoft Word - MSP430 Launchpad 指导书.docx

Microsoft PowerPoint - ch04_AEL0080.ppt

51 C 51 isp 10 C PCB C C C C KEIL

内 容 提 要 指 针 持 久 动 态 内 存 分 配 字 符 串 ( 字 符 数 组 ) 2

2000 / / % 0.035% % % % 3 2 ETF creation / redemption TTT ETF 3 / -1 2

_汪_文前新ok[3.1].doc

Transcription:

C++ 的類別 (Class) 類別 (Class) 是一種資料型態, 可用來宣告物件 類別內含有資料成員 (Data member) 和成員函式 (Member function) 類別中不論是 Data Member 或 Member function 都可在 public 區或 private 區宣告 因 OOP 特性之一是隱藏資料, 一般會將 data member 以 private 方式宣告保護起來, 並將 member function 開放給外界操作 C++ 提供 Private, Protected 和 Public 來設定成員的保護等級 Private( 私有 ) 只有類別中的 member function 才可直接使用 ( 存取 ) 資料成員 Protected( 保護 ): 僅 member function 及繼承此類別之 member function 可直接使用資料成員 Public( 共用 ): 任何函式或敘述均可直接使用資料成員, 存取方式為物件. 成員 Class 預設的保護等級為 Private 類別函數的存取必須透過屬於該類別型態的物件和點運算子. 類別函數的取用方式 : o.f 或 p->f 其中 o 表物件名稱, f 表類別函數, p 表指標 定義在 Class 內的 function 為 inline function, 在 class 外每次呼叫該 function 時, 其 function code 會在呼叫處展開一次. P. 1 C++ 類別 (Class) Class Class 類別型態變數名稱 private: 私有資料成員變數之宣告 ;; 私有成員函式宣告及定義 ;; 公用成員函式 ;; 類別變數 ( 即物件 ( 即物件 ); ); data member stu1 average member function stu2 average newscore() printscore() //Page:7-4 class score float average; // 私有資料成員 void newscore(float avg) { average=avg; void printscore() { cout << Average of score: ; cout << average << endl; ; { score stu1,stu2; // 產生兩個物件 // 透過 member function 來存取 data member stu1.newscore(88.5); // 物件. Member function stu2.newscore(92.5); stu1.printscore(); stu2.printscore(); average=88.5; 錯誤的寫法 cout << average; P. 2 C++ 類別 (Class)

class Name char firstname[10]; char lastname[10]; void setname() { cout << "What's your first name:"; cin >> firstname; cout << "What's your last name:"; cin >> lastname; void printname() { cout << "\n The name is:" << firstname << ' ' << lastname << '\n'; ; { Name my_name; my_name.setname(); my_name.printname(); my_name data member firstname lastname Member function 若設計在 class 內, 呼叫此 member function 時 compiler 以 inline 方式處理 { Name my_name; // my_name.setname(); cout << "What's your first name:"; cin >> firstname; cout << "What's your last name:"; cin >> lastname; // my_name.printname(); cout << "\n The name is:" << firstname << ' ' << lastname << '\n'; member function setname() printname() P. 3 C++ 類別 (Class) Data member ( 資料成員 ) 的使用 data member 若在 private 區 僅可供 member function 直接取用 data member 若在 protected 區 可供 member function 直接取用 可供繼承此類別之類別其 member function 直接取用 data member 若在 public 區 可供 member function 直接取用 可供繼承此類別之類別其 member function 直接取用 可供一般的敘述或 function 以物件. 資料成員方式取用 Member function( 成員函式 ) 的使用 member function 若在 private 區 僅可供 member function 直接呼叫 member function 若在 protected 區 可供 member function 直接呼叫 可供繼承此類別之類別其 member function 直接呼叫 data member 若在 public 區 可供 member function 直接取用與繼承此類別之 member function 直接取用 可供一般的敘述或 function 以物件. 成員函數方式取用 P. 4 C++ 類別 (Class)

Class Base int a; void func1(){ protected: int b; void func2(){ int c; void func3(){ ; { 私有區 data 及 function 僅供自己類別內存取 保護區 data 及 function 僅供自己類別內及繼承之兒子存取 公用區 data 及 function 供所有敘述及函數存取 void void func1(){a=2; func1(){a=2; void void func2(){a=3; func2(){a=3; func1(); func1(); void void func3(){a=3; func3(){a=3; func1(); func1(); void main() {a=2; {a=2; func1(); func1(); void void func2(){b=2; func2(){b=2; void main() void void func3(){a=3; func3(){a=3; func1(); func1(); {b=2; {b=2; void void func3(){c=3; func3(){c=3; func1(); func1(); void main() void main() {base {base bs1; bs1; {{ base base bs1; bs1; c=2; c=2; bs1.c=3; bs1.c=3; func3(); func3(); bs1.func3(); bs1.func3(); P. 5 C++ 類別 (Class) //Private, Protected, Public 的差別 class test1 int a; void func1() { cout << "private function in test1\n"; protected: int b; void func2() { func1(); cout << "protected function in test1\n"; int c; void func3() { func2(); a=1;b=2;c=3; cout << "a=" << a << "b=" << b << "c=" << c << endl; void func4() { func3(); ; class test2:private test1 int d; void func5() { cout << "private function in test2\n"; int f; void func7() { // func1(); error! func2(); // a=4; error! b=5; c=6; ; { test1 t1; test2 t2; // t1.func1(); error! // t1.func2(); error! // t1.a=5; error! // t1.b=6; error! t1.c=7; t1.func3(); t2.func7(); P. 6 C++ 類別 (Class)

// Page 7-6 class score long number; float average; void newscore() // 輸入學號及平均 { cout << "enter number:"; cin >> number; cout << "enter average:"; cin >> average; void print_score() // 印出學號及平均 { cout << "student number is:" << number; cout << "student average:" << average; ; main() { score stu1,stu2; stu1.newscore(); stu2.newscore(); stu1.print_score(); stu2.print_score(); dinner // 類別的定義與使用 float ; // 長 float ; // 寬 void setlength(float le, float se) // 設定長寬 { =le; =se; void showsquare() // 計算面積並印出 { cout << * << endl; dinner; { dinner.setlength(5.0,3.5); P. 7 C++ 類別 (Class) // 類別的定義與使用 Page:7-10 /* data member 之值可以在 class 變數宣告時給值, 亦可透過 member function 供使用者輸入 */ float ; float ; void setlength(float le, float se) { =le; =se dinner living void getlength() { cout << "Input large edge:"; cin >> ; cout << "Input small edge:"; cin >> ; void showsquare() { cout << * << endl; dinner; { room living; dinner.setlength(3.2,3.1); living.getlength(); cout << "Square of dinner room is:"; cout << "Square of living room is:"; living.showsquare(); P. 8 C++ 類別 (Class)

雙冒號 :: 是範圍解析算符 (Scope resolution operator), 可用來表明該函式是屬於那一個類別的成員 當我們在類別以外的地方定義函式內容時, 一定要用 :: 來指明所屬的類別 而呼叫此成員函式的方式為非 inline 方式 class ID { int id_no; void set(int i) { id_no=i; ; int get() { return(id_no); class ID { int id_no; void set(int i); int get(); ; void ID::set(int i) { id_no=i; int ID::get() { return id_no; class ID { int id_no; void set(int i); int get(); ; inline void ID::set(int i) { id_no=i; int ID::get() { return id_no; P. 9 C++ 類別 (Class) 類別函數的存取必須透過屬於該類別型態的物件和點運算子. 類別函數的取用方式 : o.f 或 p->f 其中 o 表物件名稱, f 表類別函數, p 表指標 class ID { private: int id_no; void set(int i) { id_no=i; { ID o1,o2,*p=&o2; o1.set(1); p->set(2); cout << "o1=" << o1.get() << endl; cout << "o2=" << o2.get() << endl; cout << "*p=" << p->get() << endl; o1 0010 o2 0020 id_no id_no int get() { return(id_no); ; p 0020 P. 10 C++ 類別 (Class)

建構函數的名稱必須與類別名稱相同 建構函數不能有傳回值 建構函數可以接受參數以作為資料成員設定初值之用 在宣告類別變數 ( 物件 ) 時, 系統會自動執行建構函數 // 不用建構函數來設定初值的方法 float ; // 長 float ; // 寬 void setlength(float le, float se) // 設定長寬 { =le; =se; void showsquare() // 計算面積並印出 { cout << * << endl; ; { room dinner; dinner.setlength(5.0,3.5); 類別的建構函數與解建構函數 // 用建構函數來設定初值的方法 float,; room() { =6.0; =4.8; void showsquare() { cout << * < endl; ; { room dinner; cout << "square of dinner room is:"; P. 11 C++ 類別 (Class) 建構函數可以接受參數以作為資料成員設定初值之用 在指定物件初始值時, 可以用 = 初值 或 ( 初值 ) 來表明, 但若同時要設定多個資料成員的初值, 只有用小括號方式才行. // 用建構函數之參數來設定初值的方法 // 一個初值的設定 float edge; room(float a) { edge=a; void showsquare() { cout << edge * edge << endl; ; { room dinner=6.0,living(5.0); cout << "square of dinner room is:"; cout << "square of living room is:"; living.showsquare(); // 用建構函數之參數來設定初值的方法 // 兩個以上的初值 //Page: 7-29 float,; room(float le,float se) { =le; =se; void showsquare() { cout << * << endl; ; { room dinner(6.5,4.8); cout << "square of dinner room is:"; P. 12 C++ 類別 (Class)

// 用建構函數範例 Page:7-18,7-25 #include <conio.h> class counter unsigned int count; counter() // constructor { count=0; void countchar(); int getcount() { return count; ; void counter::countchar() { char ch; cout << "\nplease enter a string: \n"; while ((ch=getche())!='\r') { count++; { counter c1; c1.countchar(); cout << "\n Consists " << c1.getcount(); cout << "characters" << endl; 一個類別可以有一個以上的 constructor 我們稱為 overloaded constructor, 只要 constructor 之引數個數或資料型態不一樣, 則 compiler 便可視為不同之 constructor class String { char *str; String(); String(char *); void print() { cout << str << endl; ; String::String() { str="abcde"; String::String(char *ptr) { str=ptr; {String a; // call String() String b("xyz"); // call String(char *) a.print(); b.print(); P. 13 C++ 類別 (Class) 另一種 Constructor 初始值的設定方法 : 將初值設定在 constructor 之引數中, 呼叫時有設初值的引數可省略不寫 class Time int hour,minute,second; Time(int hr=0, int min=0,int sec=0) { hour=hr; minute=min; second=sec; void print() { cout << hour << ":" << minute << ":" << second << endl; ; {Time t1,t2(2),t3(21,34),t4(12,25,42); t1.print(); t2.print(); t3.print(); t4.print(); class Time int hour,minute,second; Time(int hr, int min,int sec) { hour=hr; minute=min; second=sec; void set(int hr, int min, int sec) {hour=hr; minute=min; second=sec; void print() { cout << hour << ":" << minute << ":" << second << endl; ; {Time t1,t2(2),t3(21,34) // error! Time t4(12,25,42); t4.print(); t4.set(13,24,55); t4.print(); P. 14 C++ 類別 (Class)

建構函數會在物件宣告後自動執行, 可以有參數但不可有傳回值 解建構函數 (Destructor) 會在物件消失時自動執行 解建構函數不可有參數亦不可有傳回值 解建構函數的名稱和類別名稱相同, 但其前須加上 ~ 符號 解建構函數之執行會將建構函數所配置的物件記憶體空間釋回 //7-22 float,; room() { =6.0; =4.8; float showsquare() { return * ; ~room() { cout << "Object deallocated"; ; { room dinner; cout << "square of dinner room is:"; cout << dinner.showsquare() << endl; dinner P. 15 C++ 類別 (Class) 以物件作為函數之參數 r1 3.2 2.1 r2 r3 //7-32 #include <iomanip.h> float,; room() { room(float le,float se) { =le; =se; void getlength() // 輸入物件長與寬 { cout << "Input large edge:"; cin >> ; cout << "Input small edge:"; cin >> ; void showsquare() // 計算面積並顯示 { cout << setprecision(3) << * << endl; void addsquare(room r1,room r2); ; void room::addsquare(room r1,room r2) // 將 r1 及 r2 兩物件之長寬分別加總後 // 存入本物件之長與寬並印出本物件周長 { =r1.+r2.; =r1.+r2.; cout << endl << "Total of room length: "; cout << setprecision(3) << (+)*2 << endl; ; { room r2,r3; room r1(3.2,2.1); r2.getlength(); cout << "\nsquare of r1 room is: "; r1.showsquare(); cout << "\nsquare of r2 room is: "; r2.showsquare(); cout << "\nsquare of r3 room is: "; r3.addsquare(r1,r2); P. 16 C++ 類別 (Class)

以物件作為函數之傳回值 r1 10.2 5.3 r2 r3 //7-37 temp #include <iomanip.h> float ; float ; room() { room(float le,float se) // 供宣告物件時給長寬值 { =le; =se; void getlength() // 供輸入長寬值 { cout << "Input large edge:"; cin >> ; cout << "Input small edge:"; cin >> ; void showlength() // 顯示物件周長 { cout << "Total of room length: << setprecision(3) << (+)*2 << endl; room tlength(room r2) // 將物件 r2 之長寬加上本物件之長寬並 // 存入 temp 物件之長寬後傳回 temp 物件 { room temp; temp.=+r2.; temp.=+r2.; return temp; ; { room r2; room r1(10.2,5.3); cout << "Length of r2 room:\n"; r2.getlength(); room r3=r1.tlength(r2); r3.showlength(); P. 17 C++ 類別 (Class) C++ 之動態記憶體配置 C 之動態記憶體配置函數為指標變數 =malloc( 容量 ) 及 free( 指標變數 ), malloc 通常搭配 sizeof( 型態變數 ) 以配置程式師所指定的記憶體容量 例如 : int *ptr; ptr=(int) malloc(10*sizeof(int)); 2 bytes 20 bytes 以 sizeof 將 int 之 bytes 數算出, 以 malloc 將使電腦配置 20 bytes 記憶體並將起始位址存入指標變數 ptr 中 C++ 之動態記憶體配置指令為為 New 與 Delete 可眚略 格式一 : 指標變數 = new 基本型態變數 [ 個數 ] 格式二 : 指標變數 = new 自定型態變數 ( 初始化之值 ) 將 new 所配置之記憶體釋回 : delete 指標變數例 : int *ptr; 例 : float *ptr; ptr=new int [100]; ptr=new float (3.14);... delete ptr; delete ptr P. 18 C++ 類別 (Class)

通常利用 constructor 來配置記憶體, 並利用 destructor 來釋回 #include <string.h> class Strings char *str; Strings() { strcpy(str,""); Strings(char *st) { str=new char[strlen(st)+1]; strcpy(str,st); ~Strings() { delete str; void set(char *ptr) { str=new char[strlen(ptr)+1]; strcpy(str,ptr); void printstr() { cout << str << endl; ; { char *title="london bridge is falling down!"; Strings ps1; // call String() ps1.set("london bridge"); / /use m.f. for initial ps1.printstr(); Strings ps2(title); // call Strings(char *st) for initial ps2.printstr(); Strings ps3("falling down"); //call String(char *st) ps3.printstr(); for initial Strings ps4="is falling down"; //call String(char *st) ps4.printstr(); for initial P. 19 C++ 類別 (Class) 成員的初始化串列 當我們用類別來定義物件時, 系統會先為類別內的資料成員配置好記憶體空間, 然後再呼叫適當的建構函數來設定初值 然而, 有時我們會希望系統在配置空間時能同時作初始化的工作, 這時就可以用 成員初始化串列 成員初始化串列必須出現在 constructor 的定義 ( 而非宣告 ) 之中 : constructor 名稱 ( 參數 ): 資料成員名稱 ( 初值運算式 )... #include <conio.h> class Test 配置順序 int i; int &ri; const int ci; Test(int a, int &b, int c); void Put() { cout << "i=" << i << endl; cout << "ri=" << ri << endl; cout << "ci=" << ci << endl; ; Test::Test(int a, int &b, int c) : ri(b),ci(c) { i=a; { clrscr(); int k=4; Test t1(2,k,6); t1.put(); 初始化串列 Output: i=2 ri=4 ci=6 建立 i 之空間 建立 ri, 並設定 ri 為 b 之 reference( 綽號 ) 建立 ci, ci c 執行 constructor, i a t1 P. 20 C++ 類別 (Class) i ri ci 每個資料成員在串列中最多只能出現一次, 初值的運算可以是常數 變數或複雜運算式, 其排列次序不重要, 系統為資料配置時依他們在類別定義 ( 宣告 ) 中出現的順序來執行 k