1.5 導入Classes
C++是一個OOP(Object-oriented programming, 物件導向程式), 而類別(Class)在OO中, 是非常重要的基礎觀念, OO可以參考wiki_物件導向程式設計.
而簡單來說, 請把類別(classes)當成一個黑盒子, 這個黑盒子會提供有限的功能(ex. 吃飯, 睡覺, 打東東), 但外界(使用者)並不用管黑盒子如何實作(ex.怎麼吃, 睡法如何, 用什麼打).
所以一個類別(class),會有許多公開(public, 外界可使用)的函式(function)與成員變數(variable), 當然也包含私有(private, 只有類別自己可使用)的函式與變數.
所以在定義一個類別時, 有幾個重點.
1.這個類別名稱是什麼?
2.它要做什麼事?
3.它有哪些成員(變數/函式)?
以書上的舉例來說, 我們寫了一個Sales_Book的類別(class), 將其定義在Sales_Book.h的標頭檔內.
//<*-------------------------- Sales_Book.h --------------------------
#include <iostream>
#include <string>
class Sales_Book //類別 名稱
{
public: //公開的成員
Sales_Book() //類別建構式
{
//給予變數成員預設值
m_strBookName = "Unknown Book";
m_iPrice = 0;
m_iTotalSalesNum = 0;
};
void setBookName( string sName){ m_strBookName = sName; } //設定書籍名稱
void setPrice( int iPrice){ m_iPrice = iPrice; } //設定單價
void addSalesNum( int iNum){ m_iTotalSalesNum += iNum; } //銷售書籍數量
void showSalesResult() //印出銷售結果
{
cout << "Book: " << m_strBookName;
cout << ", Price: $" << m_iPrice;
cout << ", SalesNum: $" << m_iTotalSalesNum;
cout << " , TotalSales: $" << m_iPrice * iTotalSalesNum << endl;
}
private: //私有的成員
string m_strBookName; //書名
int m_iPrice; //單價
int m_iTotalSalesNum; //總銷售數量
}; //注意類別結尾 要有分號
//<*-------------------------------------------------------------------
從上面Sales_Book.h中定義的Sales_Book這個類別, 可以看到提供了4個公開方法(function), 與3個私有成員, 包含書名, 單價, 總銷售數 這些變數設為私有成員, 避免外界直接存取修改到. 而設定書籍名稱, 設定銷售單價, 設定銷售書量, 印出銷售情況. 這些為公開的方法, 用來存取私有成員, 或者執行某些功能(ex. 印出銷售情況).
然後在類別的建構式中將必要的成員變數賦予預設值;
另外在變數命名上, 最好遵照
匈牙利命名法(匈牙利命名法是電腦程式設計中的一種變數命名規則
), 簡單來說, 我們會在變數名稱前, 定義此變數的資料型別, 比如上述類別中的strBookName, 此為一個string, 變數名稱為bookName, 在匈牙利命名法下, 就會寫成strBookName.
//<*-------------------------- main --------------------------
#include <Sales_Book.h>
void main()
{
Sales_Book book1;
book1.setBookName("helloWorld");
book1.addSalesNum(2);
book1.setPrice(50);
book1.addSalesNum(3);
book1.showSalesResult();
system("pause");
}
//<*------------------------------------------------------------------
從main中可以看到, 建立了一個Sales_Book的類別 叫做book1. 然後操作了一些公開方法, 最後將銷售結果印出, 會得到以下畫面.
Book: helloWorld, Sales: $50 , TotalSales: $250
請按任意鍵繼續 . . .
book1.setBookName("helloWorld");
這行操作為要求book1操作其類別提供的setBookName方法, 並代入"helloWorld"的字串, 當做書名. 而"點(dot)" 是實體操作成員的方法, 之後還會有 "箭頭(->)" 指標操作成員的方法.
若方法要求代入值(引數), 卻未給予, 在程式編譯時, 就會出錯. 但我們可以透過給予方法引數(arguments)預設值的方法, 省略輸入引數.
ex.將設定銷售金額做一些變更.
void setPrice( int iPrice){ m_iPrice = iPrice; } //設定單價
修改為
void setPrice( int iPrice, string tp = "NT") //設定單價
{
strMoneyType = tp; //貨幣類型
m_iPrice = iPrice;
}
book1.setPrice(30); //貨幣使用預設值(NT)
book1.setPrice(1, "US"); //貨幣使用美金(US)
像這樣, 我們在設定銷售金額的引數中, 增加第2引數為貨幣類別, 並給予預設值為新台幣(NT).
所以在使用上中, 若第2引數為給予, 就會使用預設值.
而最後印出的"請按任意鍵繼續" 這行字,來自於system("pause")這個方法, 若此主控台應用程式在未使用此方法, 則在程式執行的瞬間, 會來不及看到畫面就結束.