讀書筆記------對象和類

過程性編程強調要遵循一定的步驟劃分和解決問題,用函數把這些步驟一步一步實現,使用時依次調用這些函數;而面向對象編程強調從用戶的角度去考慮問題,把問題的本質抽象出來,把問題分解成各個對象,從功能來劃分問題。

面向對象中,可以說類是最重要的概念,類是一種將抽象轉換爲用戶定義的工具,它將數據表示和操作數據的方法組合成一個包。

這裏要解釋幾個概念,類的公有成員和私有成員,使用類對象的程序可以直接訪問公有成員,只能通過公有成員函數修改私有成員,換句話說,公有成員函數是程序和對象私有成員之間的橋樑,提供了對象和程序之間的接口。類設計中儘量將公有接口和實現細節分開,公有接口表示設計的抽象組件,將實現細節放在一起並將它們與抽象分開被稱爲封裝。數據隱藏(將數據放在類的私有部分中)。

#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,那麼析構函數就沒有需要完成的任務。,析構函數的命名是在類名前加上~,析構函數也可以沒有返回值和聲明類型,但是析構函數沒有參數。,在代碼中不應該顯式的調用析構函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章