過程性編程強調要遵循一定的步驟劃分和解決問題,用函數把這些步驟一步一步實現,使用時依次調用這些函數;而面向對象編程強調從用戶的角度去考慮問題,把問題的本質抽象出來,把問題分解成各個對象,從功能來劃分問題。
面向對象中,可以說類是最重要的概念,類是一種將抽象轉換爲用戶定義的工具,它將數據表示和操作數據的方法組合成一個包。
這裏要解釋幾個概念,類的公有成員和私有成員,使用類對象的程序可以直接訪問公有成員,只能通過公有成員函數修改私有成員,換句話說,公有成員函數是程序和對象私有成員之間的橋樑,提供了對象和程序之間的接口。類設計中儘量將公有接口和實現細節分開,公有接口表示設計的抽象組件,將實現細節放在一起並將它們與抽象分開被稱爲封裝。數據隱藏(將數據放在類的私有部分中)。
#include <iostream>
#include <cstring>
class Stock //類聲明
{
private: //私有成員
char company[30]; //類私有數據
int shares;
double share_val;
double total_val;
void set_tot() {total_val = shares * share_val;}
public: //公有成員
void acquire(const char * co, int n, double pr); //類成員函數聲明
void buy(int num, double price);
void sell(int num, double price);
void update(double price);
void show();
};
//類成員函數定義
void Stock::acquire(const char * co, int n, double pr)
{
strncpy(company, co, 29);
company[29] = '\n';
if(n < 0)
{
std::cerr << "Number of shares can't be negative. "
<< company << " shares set to 0.\n";
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}
void Stock::buy(int num, double price)
{
if(num < 0)
{
std::cerr << "Number of shares purchased can't be negative. "
<< "Transaction is aborted. \n";
}
else
{
shares += num;
share_val = price;
set_tot();
}
}
void Stock::sell(int num, double price)
{
using std::cerr;
if (num < 0)
{
cerr << "Number of shares sold can;t be negative. "
<< "transaction is absorted. \n";
}
else if(num > shares)
{
cerr << "You can't sell more than you have! "
<< "transaction is absorted. \n";
}
else
{
shares -= num;
share_val = price;
set_tot();
}
}
void Stock::update(double price)
{
share_val = price;
set_tot();
}
void Stock::show()
{
using std::cout;
using std::endl;
cout << "company: " << company
<< " shares: " << endl
<< " share price: {1}quot; << share_val
<< " total worth: {1}quot; << total_val << endl;
}
int main()
{
using std::cout;
using std::ios_base;
Stock stock1;
stock1.acquire("Nanosmart", 20,12.5);
//cout.self(ios_base::fixed);
cout.precision(2);
//cout.self(ios_base::showpoint);
stock1.show();
stock1.buy(15, 18.25);
stock1.show();
stock1.sell(400, 20.00);
stock1.show();
return 0;
}
由於c++類不能像其他類型直接初始化,而要通過類對象成員函數才能初始化,因此在調用包含初始化對象的函數之前,調用其他函數均不會使其成員有值,向上面這個程序,在調用acquire之前,調用buy是不會使company有值的,爲了避開這一現象,c++提供了一個特殊的成員函數---類構造函數,用於構造新對象、將值賦給它的數據成員,該函數的名稱和類相同,構造函數沒有返回值,但也沒有被聲明爲void類型,構造函數沒有聲明類型。構造函數的參數名稱不能和類成員名稱相同。用構造函數創建對象後,程序負責跟蹤該對象,直到其過期爲止,對象過期時,程序將自動調用一個特殊的成員類,也就是析構函數。構造函數和析構函數的關係就像new和delete的關係一樣,構造函數完成創建,析構函數負責清理,但是如果構造函數沒有使用new,那麼析構函數就沒有需要完成的任務。,析構函數的命名是在類名前加上~,析構函數也可以沒有返回值和聲明類型,但是析構函數沒有參數。,在代碼中不應該顯式的調用析構函數。