C++入門 以Dev C++為例
C++入門 將物件導向的概念加入C語言,之後又加入了封裝(encapsulation)、繼承(inheritance)與多型(polymorphism)等功能。 C++語言 物件導向,如封裝,繼承與多型 布林邏輯型態 C語言 C與C++共有的功能,如迴圈與選擇性敘述 C++不常用的 功能,如結構 C++裡多使用類別來取代結構
物件導向語言 封裝: 繼承: 多型 是指將資料和函數都包裝在類別(class)的內部, 限定只有特定的函數才能存取到它,保護資料的安全。 將已有的類別功能,透過繼承的方式給新的類別使用, 因此新的類別不需再撰寫相同的程式碼。 允許相同名稱的函數針對參數的不同而進行不同的處理動作。
程式範例一 在螢幕上顯示一行文字 #include<iostream> //為input/output的縮寫 #include<cstdlib> //相當於C語言裡stdlib.h using namespace std; //設定名稱空間,std為standard的縮寫 int main() { cout << “Hello, 您好!” << endl; system("pause"); return 0; } 在C++的最新規範中,C++標準函式庫裡所包含 的函數,類別與物件都是定義std名稱空間內 endl為換行符號
程式範例二 要求使用者輸入兩個整數,並把計算結果輸出 #include <iostream.h> //副檔名.h為舊版本的寫法 int main() { int x; // 第一個輸入整數 int y; // 第二個輸入整數 int Sum; // 兩個整數的和 cout << "請輸入第一個整數\n"; cin >> x; //由鍵盤讀取一個整數並存入變數x cout << "請輸入第二個整數\n"; cin >> y; cout << "這兩個整數的和是: " << Sum << endl; return 0; } C++的 cin可以輸入整數、浮點數、字元與字串 不需格式控制碼(%d , %c…等)
請寫一程式,輸出下列資訊,並可讓使用者輸入自己的四種資訊. 1.班級 2.學號 3.姓名 4.生日 實習練習一 請寫一程式,輸出下列資訊,並可讓使用者輸入自己的四種資訊. 1.班級 2.學號 3.姓名 4.生日
布林型態 #include<iostream> #include<cstdlib> using namespace std; int main(void) { //C++提供了布林型態,它的值只有true和false兩種. bool is_odd; //宣告布林型態的變數is_odd. int num; cout <<"請輸入一個正整數: "; cin>>num; if(num%2!=0) /*如果num是奇數,設定is_odd為true*/ is_odd=true; else /*如果num是偶數,設定is_odd為false*/ is_odd=false; if(is_odd) cout<< num << "是奇數" <<endl; else cout<< num << "是偶數" <<endl; system("pause"); return 0; }
變數的位置 C語言只能將變數宣告於函數最開始的地方,C++可在程式的任何地方宣告變數. 若在迴圈內宣告的區域變數只能在迴圈內使用. 以下的例子中的變數i在離開for迴圈之後就不能再使用了! #include<iostream> #include<cstdlib> using namespace std; int main(void) { for(int i=0;i<3;i++) cout<<"在for迴圈裡,i="<< i <<endl; cout<< "for迴圈執行完後,i=" << i <<endl; system("pause"); return 0; }
類別介紹 宣告一個類別就等於建立一個新型態,類別是一組不同型態 類別的宣告方式: 的變數及一組相關函數的結合。 類別可以由任何型態的變數或其他類別組合而成。 類別中的變數被稱為 成員變數 類別中的函數被稱為 成員函數 或 方法 類別的宣告方式: 是關鍵字 class Cat { int itsAge; int itsWeight; void Meow(); };
類別介紹 宣告一個類別就等於建立一個新型態,類別是一組不同型態 類別名稱 成員變數 成員函數 的變數及一組相關函數的結合。 類別可以由任何型態的變數或其他類別組合而成。 類別中的變數被稱為 成員變數 類別中的函數被稱為 成員函數 或 方法 類別名稱 class Cat { //宣告類別的屬性與方法 public: int itsAge; int itsWeight; void Meow(); }; 成員變數 類別的所有成員(所有變數跟方法)預設皆為private。 私有成員(private)只能在該類別的方法內存取, 公共成員(public)則可以被其他類別的所有物件存取。 成員函數 結束分號
類別---定義物件 接著我們就可以使用這個新的資料型別(類別)來宣告變數---類別的實體化。 物件是將類別實體化,如此才有配置記憶體空間,程式才能透過物件來存取類別中的成員變數與函數。 Cat Test; /*定義了類別為Cat的物件Test*/ 類別名稱 物件名稱 int itsAge; int itsWeight; void Meow(); Memory space Test
類別---存取類別成員 使用點運算子(.)來存取物件的成員 Test . itsAge = 5; 呼叫成員函數 物件名稱.變數名稱 = 變數值; Test . itsAge = 5; 呼叫成員函數 Test . Meow ();
Private(私有) 與 Public(公有) 類別中最常用的兩個關鍵字是 public 與 private。 類別的所有成員(變數或方法)預設皆為 private。 private(私有) 成員只能在該類別的方法內存取。 Public(公有) 成員可以被該類別的所有物件存取。 範例: class Cat { public: int itsAge; int itsWeight; void Meow(); }; class Cat { int itsAge; int itsWeight; void Meow(); }; Cat Boots; Boots.itsAge=5; 錯誤寫法,因為成員預設為private 因此只能從Cat 類別的成員函數中 去存取 itsAge 變數
程式範例三 #include<iostream> #include<cstdlib> using namespace std; class Cat { public: int itsAge; int itsWeight; }; int main() Cat Frisky; cout << “請輸入貓咪的年齡: ”; cin >> Frisky.itsAge ; cout << “Frisky 貓咪的年齡是 ” << Frisky.itsAge
範例三 class Circle { public: float x0,y0; float radius; float getCircumfrence() return 2.0*3.14159*radius; } }; class Circle //效率較高版 { public: float x0,y0; float radius; float getCircumfrence(); }; float Circle::getCircumfrence() return 2.0*3.14159*radius;} getCircumfrence()已經沒有傳入參數,因為它已經是Circle 的一份子,所以可以直接存取radius變數,而不需透過物件成員運算子(ex. c.radius) getCircumfrence()的宣告和定義都放在類別之內,這種宣告的方式稱為inline 函式宣告,優點是執行效率較高,但是編譯時產生的執行檔較冗長.
成員函式放在類別之外 範例三 也被稱為函數定義。 成員函數定義以類別名開始,然後是兩個冒號、函數名以及參數。 前面需加返回值型態 float Circle::getCircumfrence() { return 2.0*3.14159*radius; }
建構者函數 對於一般變數,我們可以在宣告的同時指定其初值,如 int x = 0;這種變數初值化的方式對於類別中的成員變數宣告是不允許的,例如下列宣告將發生編譯錯誤: class err { public: int x = 0; //錯誤 …… } 解決之道:使用建構者函數
建構者函數 若在產生一個新物件時,立即執行建構者函式,就能將所需的成員變數初值化,一旦物件產生,則所有變數初值也被設定了。 特性: 建構者函式名稱與類別名稱一樣。 建構者函式的最重要目的是對物件的屬性進行初值化的工作。 建構者函式不能傳回值,但可以傳入參數值。 一個類別可以擁有多個建構者函式,但每個建構者函式傳入的參數必須不同。
用建構者函數初始化 宣告Cat 類別 (int initialAge) class Cat { Cat :: Cat pubilc: { 我們可以自己寫預設建構者函數,並且在預設建構者函數中寫一個用於初始化類別的函數體。 兩個冒號 宣告Cat 類別 類別名稱 傳入的參數 class Cat { }; (int initialAge) Cat :: Cat 與類別同名的類別方法 在public中寫一個預設建構者函數 Cat() pubilc: private: 注意: 建構者函數無返回值,連void也不能有。 { } Cat(); itsAge = initialAge; int itsAge; 將 initialAge 的值指定給成員變數 itsAge
解構者函數 每當宣告建構者函數時,就應同時宣告一個解構者函數。 沒有宣告解構者函數時,編譯器將自動產生一個 在函數執行完畢時,可以釋放資源。 解構者函數總是帶有類別名,前面是一個否定號(~)。 兩個冒號 否定號加類別名 類別名稱 Cat :: ~Cat() { }
多載函數 int myFunction(int , int) int myFunction(long , long) 這些函數的參數必須不相同,或者是參數型態不同,或者是參數數目不同,或者是兩者都不同 。 型 態 不 同 int myFunction(int , int) int myFunction(long , long) 型態、參數 數目都不同 int myFunction(long)
多載建構子 建構子與類別的成員函數都可以像函數一樣重載。 class Cat { public: Cat( ); private: } 宣告 Cat類別 class Cat { } 預設建構子 public: private: Cat( ); Cat(int initialage); 接收一個整數變數的建構子 int itsAge;
範例四(1) #include<iostream> #include<cstdlib> using namespace std; class CWin { public: char id; int width; int height; int area(void) //用來計算面績 { return width*height; } void show_area(void) //顯示計算的結果 { cout<<"Window "<< id <<", area=" <<area() <<endl; } void set_data(char i,int w,int h) //第一個set_data()函數 { id=i; width=w; height=h; } void set_data(char i) //第二個set_data()函數 { id=i; } void set_data(int w,int h) //第三個set_data()函數 { width=w; };
範例四(2) int main(void) { CWin win1,win2; win1.set_data('A',50,40); //呼叫第一個set_data() win2.set_data('B'); //呼叫第二個set_data() win2.set_data(80,120); //呼叫第三個set_data() win1.show_area(); //利用win1物件來呼叫show_area() win2.show_area(); //利用win2物件來呼叫show_area() system("pause"); return 0; }
範例四的執行結果