C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015
C++相較於C的特色 向下相容 高階的程式描述方式 物件導向程式設計 更利於用來開發大型專案, 讓程式設計師在分工時更能快速的 開發程式, 並減少錯誤的產生 物件導向程式設計 讓開發程式者簡單的使用物件所提供的功能, 來達到所需要的 效果
課程大綱 C++基礎語法 第一個C++程式: Hello World ! 輸入輸出 動態記憶體配置 字串 檔案 參考 (Reference) 重載函式 (Over Loading)
C++: Helloworld 第一個C++程式:Helloworld #include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; }
C++輸入輸出 cout物件: 輸出 cin物件: 輸入 << : 將一個指定的內容傳給cout輸出 (有幾個內容就用幾個<<或>>) #include <iostream> using namespace std; int main() { int num; cin >> num; cout << num << endl; return 0; }
C++輸入輸出 試著輸入輸出不同型態的資料 請觀察跟printf函式使用上的差異 #include <iostream> using namespace std; int main() { int a; double b; char c; char d[80]; cout << "請分別輸入整數, 小數, 字元, 字串" << endl; cin >> a; cin >> b; cin >> c; cin >> d; cout << "輸入的內容為: " << endl; cout << a << endl; cout << b << endl; cout << c << endl; cout << d << endl; return 0; }
C++輸入輸出 思考: 為什麼cin/cout物件都不用跟告訴它我要印 到螢幕的資料型態, scanf/printf函式就要? 在聰明的背後… (使用物件很容易, 難在物件的設計!)
輸入含有空白字元的字串 使用cin物件提供的getline函式 (類似gets函式) 輸入字串放到指定字元陣列中 若輸入字串長度超過 最大長度-1 則自動捨去 #include <iostream> using namespace std; int main() { char a[80]; cin.getline(a, 80); cout << a << endl; return 0; }
輸入含有空白字元的字串 使用cin的>>與getline會產生像在C語言中使用 scanf與gets的問題 使用cin物件提供的cin.ignore()解決 #include <iostream> using namespace std; int main() { char a[80]; char b[80]; cin >> a; cin.ignore(); cin.getline(b, 80); cout << a << endl << b << endl; return 0; }
C++動態記憶體配置 動態記憶體配置: new 釋放記憶體: delete 配置一個資料空間,並傳回該空間的位址,語法: 配置一個給定初始值的空間,並傳回該空間的位址,語法: 指標 = new 資料型態(初始值); 釋放記憶體: delete 配置一個空間的釋放 delete 指標; #include <iostream> using namespace std; int main() { int *ptr = new int(100); cout << "空間位置:" << ptr << endl; cout << "空間儲存值:" << *ptr << endl; *ptr = 200; delete ptr; return 0; }
C++動態記憶體配置 動態記憶體配置: new 釋放記憶體: delete 配置多個資料空間,並傳回該空間的位址,語法: 配置多個空間的釋放 #include <iostream> using namespace std; int main() { int *ptr; int size, i; cout << "請輸入個數:"; cin >> size; ptr = new int[size]; cout << "請輸入內容:" << endl; for(i = 0; i < size; i++) cout << "ptr[" << i << "] = "; cin >> ptr[i]; } cout << "ptr[" << i << "] = " << ptr[i] << endl; delete [] ptr; return 0;
C++字串: string 使用C++提供的特殊字串型態string可以用來宣告 字串物件,方便我們做字串處理 宣告語法: 產生的字串物件提供下面語法可以使用: [索引]: 取得索引值代表的字元 =: 字串複製 == : 字串比對 += : 字串連結 length(): 計算字串長度 c_str(): 回傳字串位置 (常用在字串函式)
C++字串: string 範例:輸入字串後印出長度與所有字元 #include <iostream> #include <string> using namespace std; int main() { string str; int n, i; cout << "請輸入字串: "; cin >> str; n = str.length(); cout << "輸入的長度為: " << n << endl; cout << "輸入的字元為: " << endl; for(i=0; i<n; i++) cout << "[" << i << "]:" << str[i] << endl; return 0; }
C++字串: string 範例:string常用之運算 字串比對: a==b //比對a與b是否相等 字串複製: a = b // 將b複製到a 字串連結: a+=b // 將b連結到a後面 #include <iostream> #include <string> using namespace std; int main() { string a, b; a = "Hello"; cout << "請輸入b字串: "; cin >> b; if(a==b) cout << "b字串a字串相同" << endl; else cout << "b字串a字串不同" << endl; a+=b; cout << "a,b字串連結結果: " << a << endl; return 0; }
C++字串: string 範例:輸入b字串內容後儲存a string 字元陣列 字元陣列 string #include <iostream> #include <string> #include <string.h> using namespace std; int main() { char a[80]; string b; cout << "輸入string字串b: "; cin >> b; strcpy(a, b.c_str()); cout << "輸出字元陣列a: " << a << endl; return 0; } #include <iostream> #include <string> #include <string.h> using namespace std; int main() { char a[80]; string b; cout << "輸入字元陣列a: "; cin >> a; b = a; cout << "輸出string字串b: " << b << endl; return 0; }
C++檔案: fstream C++中使用fstream物件操作檔案 fstream 檔案物件(“檔名”,模式); 此物件中包含讀檔(>>), 寫檔(<<),關檔(close),強制寫回檔案 (flush),判斷檔案是否結束(eof)…等動作 常用檔案模式: ios::in 讀檔 ios::out 寫檔 ios::app 寫在檔案最後 ios::binary 二進位檔 #include <iostream> #include <fstream> using namespace std; int main() { fstream in("input.txt", ios::in); fstream out("output.txt", ios::out); char str[128]; in >> str; out << str; in.close(); out.close(); return 0; }
課程大綱 C++基礎語法 第一個C++程式: Hello World ! 輸入輸出 動態記憶體配置 字串 檔案 參考 (Reference) 重載函式 (Over Loading)
C++ 參考(Reference) 用途: 幫宣告的變數或物件取另一個名稱 代表了變數或物件的一個別名(Alias) 參考型態可以直接取得變數或物件的位址,並間 接透過參考型態別名來操作物件 作用類似於指標,但卻不必使用指標語法,也就是不必使用* 運算子來提取值。 語法: 資料型態 &參考名稱 = 變數名稱 範例: int var = 10; // 定義變數 int &ref = var; // 定義參考,代表var變數
C++ 參考(Reference) 參考型態一定要初始化 參考初始化後就不能改變它所代表的物件,任何指定給參考 的值,就相當於指定給原來的物件 #include <iostream> using namespace std; int main() { int var = 10; int &ref = var; cout << "var: " << var << endl; cout << "ref: " << ref << endl; ref = 20; return 0; }
C++ 參考(Reference) 參考最常使用於函式的引數列上 用來設計一個不需傳位置也能改變傳入參數值的函式 #include <iostream> using namespace std; void increment(int &n) { n = n + 1; } int main() int x = 10; increment(x); cout << x << "\n"; return 0;
練習 使用參考寫一個swap函式, 將兩個變數內容交換 ex: int a=10, b=5; swap(a,b); // a=5, b=10
C++重載函式 用途: 設計相同函式名稱, 但用法不同的函式 根據回傳值的不同或參數列個數或型態的不同,而自動呼叫 對應的函式 #include <iostream> using namespace std; void show(int x) { cout << "我有一個整數int:" << x << endl; } void show(int x, int y) cout << "我有兩個整數int:" << x << ", " << y << endl; int main() show(10); show(20, 30); return 0;
C++重載函式 根據參數的型態來決定要呼叫的函式 #include <iostream> using namespace std; void show(int x) { cout << "我是整數int:" << x << endl; } void show(double x) cout << "我是小數double:" << x << endl; int main() show(12); show(12.5); return 0;
練習 延續上頁範例,新增一個函式show將上一章的 struct Person型態中的姓名, 身高, 體重輸出 void show(struct Person x);
C++重載函式 思考: 為什麼要使用重載函式? 宣告成不同函式名 稱不好嗎? 從使用函式角度… 功能一樣但引數不同的函式不用取多個名字比較好記!