踏出C++的第一步

Similar documents
第二章 簡介類別

運算子多載 Operator Overloading

C/C++基礎程式設計班

運算子多載 Operator Overloading

陣列與鏈結串列 Array and Linked List

c_cpp

Microsoft PowerPoint - Class5.pptx

運算子多載 Operator Overloading

新版 明解C++入門編

Microsoft Word - ch04三校.doc

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

CC213

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

第3章.doc

untitled

Microsoft Word - ACL0204-ch11-ok.doc

PowerPoint Presentation

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

untitled

投影片 1

Strings

FY.DOC

untitled

Microsoft PowerPoint - Class4.pptx

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

Microsoft PowerPoint - 04-array_pointer.ppt

第七讲 继承与多态

The Embedded computing platform

Microsoft PowerPoint - L17_Inheritance_v4.pptx

Microsoft Word - 投影片ch11

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

untitled

Strings

Microsoft PowerPoint - P766Ch06.ppt

Scott Effective C++ C++ C++ Roger Orr OR/2 ISO C++ Effective Modern C++ C++ C++ Scoot 42 Bart Vandewoestyne C++ C++ Scott Effective Modern C++ Damien

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

資料結構之C語言重點複習

Microsoft Word - 01.DOC

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

Microsoft PowerPoint - 10 模板 Template.pptx

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

Microsoft PowerPoint - STU_C_Lang_CH13.ppt

Microsoft Word - ACL chapter02-5ed.docx

PowerPoint Presentation

提问袁小兵:

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

Microsoft Word - chap05.doc

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

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

无类继承.key

個 人 的 手, 拉 著 瞎 子 的 手 把 他 帶 往 村 外 的 時 候, 對 於 瞎 子 來 講, 那 個 人 的 手 和 耶 穌 的 手 有 沒 有 區 別? 沒 有! 為 什 麼 沒 有 區 別? 因 為 對 於 一 個 瞎 子 來 說, 手 和 耳 朵 就 是 他 接 觸 世 界, 瞭

What is OOP? 是一種寫程式的技巧, 而不是一種程式語言 是一種管理程式碼的方法 使得日後維護方便容易讓程式碼更具彈性讓程式碼提高再使用率 軟體元件 software components 常用來寫大型的軟體 軟體工程 software engineering 著名的支援 OOP 程式語言

C 語言—陣列及字串

CC213

Microsoft PowerPoint - 07-overloaded.ppt

Microsoft Word cppFinalSolution.doc

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

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

EJB-Programming-3.PDF

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

C++ 程式設計

Excel VBA Excel Visual Basic for Application

untitled

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

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

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

Microsoft PowerPoint - 13_Exception.ppt

C/C++基礎程式設計班

Microsoft PowerPoint - 13_指標、資料傳遞2.pptx

untitled

Microsoft Word - ch doc

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

Microsoft PowerPoint - Class2.pptx

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

EJB-Programming-4-cn.doc

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

Microsoft PowerPoint - string_kruse [兼容模式]

Microsoft Word - CPE考生使用手冊 docx

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

untitled

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

Microsoft Word - ACG chapter00c-3ed.docx

2

Microsoft Word - chap10.doc

概述

Chapter12 Derived Classes

投影片 1

105A 資管一程式設計實驗 06 函式定義謝明哲老師 2 程式設計實驗 6.3: 自行定義一個可以接受兩個整數並傳回其最大公因數的函式, 接著利用該函式自 行定義一個可以接受兩個整數並傳回其最小公倍數函式 // gcd_fcn.cpp int gcd(int m,

C/C++基礎程式設計班

C 1

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

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

Microsoft PowerPoint - plan08.ppt

<4D F736F F F696E74202D FB5F8B3A5A142B8EAAEC6B6C7BBBCA142BB50C0C9AED7BEDEA7402E >

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

Microsoft PowerPoint - C++類別.ppt

<313031A4C9BEC7C160BA5DB3E A457BAF4A4BDA769AAA9292E584C53>

Transcription:

踏出 C++ 的第一步 講師 : 洪安 1

已經學會的 C 語言基本概念 基本資料型態 變數 基本輸入輸出 控制敘述 選擇控制 迴圈 陣列 函式 指標 字元與字串 結構 檔案處理 2

C v.s. C++ C 函數 程序式語言 Procedural language 結構化程式設計 Structured programming 演算法 Top-down C++ 類別 物件導向程式設計 Object-Oriented Programming (OOP) 資料 Bottom-up 泛型程式設計 Generic programming 程式碼再利用 一般概念抽象化 3

OOP 的重要特性 抽象化 封裝與資料隱藏 多型 繼承 程式碼的再利用 4

C++ 基本輸入輸出 (1/2) #include <iostream> 將 iostream 檔案內容加入原始程式 支援許多輸出入函數 using namespace std; 使用定義在 std 名稱空間中的名稱 不加, 則須註明標準名稱空間 std::cout << C++ ; 輸出 cout cout 是一個預先定義好的物件, 知道如何顯示各種事物, 包括字串 數字和單一字元 cout << Hello World! << endl; 串流 Hello World! 5

C++ 基本輸入輸出 (2/2) 輸出 cout 以 cout 輸出變數值 int carrots = 5; cout << Now you have << carrots << carrots. << endl; 輸入 cin 將從鍵盤輸入的字元序列轉成接收變數可接收的型式 int carrots; cin >> carrots; 6

範例練習 1_GetInfo.cpp 7

課堂練習 1_Add.cpp 8

類別 (1/3) 類別 (class) 是一種使用者自定的資料型態, 與結構一樣, 類別是由許多資料型態集合而成 程式設計師可以在類別中定義多種資料型態的變數, 如 int char float 或 string 等等, 這些資料變數稱為類別的資料成員 (data member) 類別中還包括存取資料成員的函數稱為成員函數 (member function) 類別就像規格書, 定義了某樣物品應該要有的屬性 ( 靜態的物品描述 ) 和方法 ( 動態可施加於物品上的動作 ) 定義好規格書之後, 就可以產生出符合這個規格的實體, 也就是物件 9

類別 (2/3) 結構宣告 struct students{ char name[20]; int age; float grade; ; 資料成員 Data member 類別宣告 class students{ private: char name[20]; int age; 資料成員 Data member float grade; public: void updategrade(float new_grade); void show(); 成員函數 Member function ; 10

類別 (3/3) 語法 class 類別名稱 { public: 類別名稱 (); // 建構函數 ~ 類別名稱 (); // 解構函數公開的資料成員或成員函數 ; protected: 受保護的資料成員或成員函數 ; private: 私有的資料成員或成員函數 ; ; 11

存取控制 Access Control public private protected 這些標籤用以描述類別成員的存取控制 Public 任何使用特定類別物件的程式都可以直接存取 public 部分 標示構成此類別公用介面的類別成員 ( 抽象化 ) Private 標示類別成員只能透過公用成員函數來存取 ( 資料隱藏 ) 實作細節和資料被隔絕 未標示標籤時, 資料成員預設存取控制為 private Protected 留待繼承討論 12

實作類別成員函數 (1/2) 提供類別宣告中成員函數原型的程式碼 類似一般函數的定義 函數標題 函數主體 回傳型態及引數 寫在類別宣告外要用範疇運算子 (scope operator) :: 標示函數所屬的類別 辨別哪個類別擁有這個成員函數 不同的類別可以擁有相同名稱的成員函數 Mytime::setTime() v.s. YourTime::setTime() 類別的成員函數可以存取類別的 private 成員 語法資料型態類別名稱 :: 成員函數名稱 ( 參數 1, 參數 2,, 參數 n ) { 程式碼 ; 13

內嵌成員函數 實作類別成員函數 (2/2) class students{ private: char name[20]; int age; float grade; public: void updategrade(float new_grade) { grade = new_grade; void show(){ cout << name << endl; ; class students{ private: char name[20]; int age; float grade; public: void updategrade(float new_grade); void show(); ; void students::updategrade(float new_grade) { grade = new_grade; void students:: show(){ cout << name << endl; 14

Inline Function 內嵌成員函數為一種 inline function 適用於簡短的函數 編譯時會被自動展開 Cost/benefit analysis 增加程式執行效率 沒有呼叫與回傳的動作 可執行檔的大小可能變大 如果呼叫次數很多, 而且函數又不只一行 class students{ private: char name[20]; int age; float grade; public: void updategrade(float new_grade); void show(); ; 成員函數定義在類別宣告之外, 可以用 inline 使其成為內嵌成員函數 inline void students::updategrade(float new_grade) { grade = new_grade; inline void students:: show() { cout << name << endl; 15

物件 有了類別這個規格書之後, 我們就可以製造出一個一個的物件 object ( 或實體 instance) 規格書 class Animal { 類別 private: char category[20]; char name[20]; char gender; int age; float height; public: void show(); void update(int age); ; 宣告 產生物件 使用物件的成員函數 Jennifer.update(24); Bunny.show(); Kitty.update(18); 16

課堂練習 1_Rectangle.cpp 類別宣告 成員函數 主程式的輸入 設定與輸出 17

類別的建構函數與解構函數 (1/4) 宣告了類別物件之後, 除了透過成員函數之外, 不得直接存取資料成員 產生物件時最好就完成初始化的動作! 建構函數 Constructor 用途 : 專門處理建構新物件並指定成員資料的值 1. 函數名稱和類別名稱相同 2. 沒有回傳值, 不須宣告回傳型態 void 3. 成員函數之一 4. 可以很多個 5. 允許傳參數 18

類別的建構函數與解構函數 (2/4) 建構函數 例 : 將屬於 Carrots 的物件初始值設為 10 class Carrots { int num; public: Carrots(); // default constructor void show() ; ; Carrots :: Carrots() { num = 10 ; void Carrots::show() { cout << num << endl; int main() {Carrots ob; ob.show(); return 0; 宣告物件時自動呼叫建構函數 19

類別的建構函數與解構函數 (3/4) 解構函數 當類別物件結束時, 會自動呼叫其解構函數 若不提供, 則預設不做事情的解構函數 若建構函數用 new 配置記憶體, 則解構函數要使用 delete 釋放記憶體 1. 函數名稱為類別名稱前面加 ~ 2. 沒有回傳值, 不須宣告回傳型態 void 3. 成員函數之一 4. 只能有一個 5. 不允許傳參數 20

類別的建構函數與解構函數 (4/4) 解構函數 class myclass { int a ; public: myclass() {a=10; ~myclass() {cout << 物件消滅 ; // 解構子 void show() { cout << a; ; int main() { myclass ob; ob.show(); return 0; 21

接受參數的建構函數 class myclass { int a; public: myclass() { a = 10 ; myclass(int x) { a = x; myclass(const myclass& ob) { a = ob.a; void show() { cout << a << endl; ; void main() { myclass ob1, ob2(2), ob3(ob1) ; ob1.show() ; ob2.show() ; ob3.show() ; 22

多個參數的建構子 class myclass { int a, b; public: myclass(int x, int y) { a = x; b=y ; ; int main() { myclass ob(5,3) ;.. 23

課堂練習 1_RectangleConstructor.cpp 加上建構函數 x2 不接受參數的建構函數 長預設為 5, 寬預設為 10 接受兩個參數 ( 長與寬 ) 的建構函數 24

Memberwise Copy 指定運算子 (=) 與指定變數相同, i.e., x = y; 可以用於指定另外同類型的物件 Memberwise copy member by member copy myobject1 = myobject2; 25

物件指標 #include <iostream> using namespace std ; class myclass { int a;. set(int x) get() ; int main() { myclass ob(120) ; myclass * p ; // 指向 myclass 資料型態的指標 p = &ob ; ob.show() ; p->show() ; return 0; 26

this 指標 當成員函數需要處理兩個物件時可能用到 函式回傳一個指向同一個物件的參考指標 {return *this; 其他的函式可以直接在這個指標上面操作 1_this.cpp 27

static 類別成員 static class members 被所有此類別的所有物件所共有 一般來說, 所有的物件都有一份 COPY 當單一 COPY 已經足夠時很有效率 很像全域變數, 但是有類別範圍 只能夠被同一個類別的物件所存取 可以是變數或者函式 public, private, or protected 28

引數預設值 Default Argument 函數引數可以給預設值, 如呼叫時該引數未傳入, 則使用預設值 class Animal { private: char category[20]; int age; public: Animal(){ category[0] = '\0'; age = 20; Animal(int a, const char * cat = "Cat"); void show(); void update(int age); ; Animal ob1(16); Cat 16 Animal ob2(18, Dog ); Dog 18 Animal::Animal(int a, const char * cat){ age = a; strcpy(category,cat); 29

String 類別 (1/2) 用來處理字串的類別 必須引入 string 標頭檔 也是 std 名稱空間 隱含著字串的陣列特性, 可將字串看成一般的變數 #include <string> #include <iostream> using namespace std; 30 int main() { string str1; string str2= jaguar ; cin >> str1; cout << str2 << endl << str1[1] << endl; getline(cin,str2); return 0;

String 類別 (2/2) 比字串陣列簡單的使用方式 將一個字串物件指定給另外一個 str1 = str2; 結合兩個字串 string str3 = str1+str2; 串接字串 str1+=str2; 字串長度 str1.size(); 31

動態記憶體配置 (1/2) new 運算子會配置一個 int 所需要的空間, 並傳回該空間的位址, 所以您使用指標 ptr 來儲存這個位址 int *ptr = new int; 如果要在配置完成後指定儲存值, 則可以如此宣告 int *ptr = new int(100); #include <iostream> using namespace std; int main() { int *ptr = new int(100); cout << " 空間位置 : "<< ptr << endl; cout << " 空間儲存值 :" << *ptr << endl; *ptr = 200; cout << " 空間位置 :" << ptr << endl; cout << " 空間儲存值 :" << *ptr << endl; delete ptr; 32 return 0;

動態記憶體配置 (2/2) 動態配置陣列空間 int *arr = new int[1000]; 歸還配置陣列空間給記憶體 delete [] arr; #include <iostream> using namespace std; int main() { int size = 0; cout << " 請輸入陣列長度 :"; cin >> size; int *arr = new int[size]; cout << " 指定元素值 :" << endl; for(int i = 0; i < size; i++) { cout << "arr[" << i << "] = "; cin >> *(arr+i); 33 cout << " 顯示元素值 :" << endl; for(i = 0; i < size; i++) { cout << "arr[" << i << "] = " << *(arr+i) << endl; delete [] arr; return 0;

參考 Reference (1/3) 參考 (Reference) 型態代表了變數或物件的一個別名 (Alias) 參考型態可以直接取得變數或物件的位址, 並間接透過參考型態別名來操作物件 作用類似於指標, 但卻不必使用指標語法, 也就是不必使用 * 運算子來提取值 要定義參考型態, 在定義型態時於型態關鍵字後加上 & 運算子, 例如 : int var = 10; // 定義變數 int *ptr = &var; // 定義指標, 指向 var 的位址 int &ref = var; // 定義參考, 代表 var 變數 34

參考 Reference (2/3) 為何參考型態一定要初始化? 因為參考初始化後就不能改變它所代表的物件, 任何指定給參考的值, 就相當於指定給原來的物件 #include <iostream> using namespace std; int main() { int var = 10; int *ptr = &var; int &ref = var; cout << var: << var << endl; cout << *ptr: << *ptr << endl; cout << ref: << ref << endl; ref = 20; 35 cout << var: << var << endl; cout << *ptr: << *ptr << endl; cout << ref: << ref << endl; system( pause ); return 0;

參考 Reference (3/3) 參考型態最常使用於函式的參數列上 #include <iostream> using namespace std; int increment(int &n) { n = n + 1; return n; int & n = x; int main() { int x = 10; cout << increment(x) << "\n"; cout << x << "\n"; 36 system( pause ); return 0;