C++學習(二):類的定義與對象的創建

1 軟件概述

一個軟件的生命期包含:需求分析、設計、編程、測試、運行維護這五個部分

程序的設計方法包括兩種:結構化程序設計和麪向對象的程序設計。

結構化程序設計歸結爲:程序=算法+數據結構,面向過程,數據與程序分離;設計的基本思想是自頂向下、逐步細化的設計方法和單入單出的控制結構。

面向對象程序設計是將數據和對數據的操作方法放在一起,形成一個相對獨立的整體——對象(object),同類實體可抽象出共性,形成類(class),一個類的數據通常只能通過本類提供的方法進行處理,這些方法成爲該類與外部的接口。對象之間通過消息(message)進行通訊。

其中面向對象的程序設計有三大特點。

  1. 封裝性:建立類,支持封裝和數據隱藏,每一個定義完好的類可以作爲一個獨立模塊使用,並對外提供一定的接口。
  2. 繼承與派生性:類變爲基類,新類稱爲子類或派生類,是對基類中部分屬性和操作的增加或修改,其中新類只需描述自己所特有的屬性和操作即可,派生可以一直進行下去,形成一個派生樹。

在這裏插入圖片描述

  1. 多態性:同一個消息被不同對象接收時,產生不同結果。即實現同一接口,不同方法。

2 類與對象

關鍵字class與C語言中的結構體struct類似,是數據類型說明符。其將類定義成一個變量,這個變量就叫對象,這個定義的過程就叫實例化

class 中訪問限定符有三種:public(公有)、private(私有)、protected(保護)。前一種可以從外部訪問,後兩者不能。如果無訪問限定符,則系統默認爲private(私有),而在C中的struct默認爲public(公有)。訪問說明符private(私有)和protected(保護)體現了類具有封裝性,即把變量和操作的函數都放在類裏。

一般情況下,在public中書寫的是給用戶提供的方法和可執行的操作,相當於接口;而在private裏書寫的是成員變量,是操作的目標

class CGoods
{
public: //給用戶提供的方法,哪些操作
	void RegisterGoods(char name[],int,float); //輸入數據
	void CountTotal(void); //計算商品總價值
	void GetName(char[]); //讀取商品名
	int GetAmount(void); //讀取商品數量
	float GetPrice(void); //讀取商品單價
	float GetTotal_value(void); 
private: //有哪些成員(可操作的變量)
	char Name[21];
	int Amount;
	float Price;
	float Total_value;
}; // 最後的分號不可少,這是一條說明語句

void main()
{
	CGoods cd; //定義對象——過程就是實例化
	// CGoods.Amount = 10 這樣沒有實例化,是錯誤的。 !!!必須先實例化才能操作
	cd.GetPrice();
}

下面說明類中的函數,類中的函數可以在類內構造,也可以在類外構造。以下爲類內構造示例。

class CGoods
{
public: //給用戶提供的方法,哪些操作
	void RegisterGoods(char name[],int amount,float price); //輸入數據
	{
		strcpy(Name,name); //複製字符串strcpy(dst,src)
		Amount = amount;
		Price = price;
	}
	void CountTotal(void); //計算商品總價值
	{
		Total_value = Amount * Price;
	}
	void GetName(char name[]); //讀取商品名
	{
		strcpy(name,Name);
	}
	int GetAmount(void); //讀取商品數量
	{
		return Amount;
	}
	float GetPrice(void); //讀取商品單價
	{
		return Price;
	}
	float GetTotal_value(void); 
	{
		return Total_value;
	}
private: //有哪些成員(可操作的變量)
	char Name[21];
	int Amount;
	float Price;
	float Total_value;
};

void main()
{
	CGoods c1,c2; //定義對象——過程就是實例化
	c1.RegisterGoods("C++",10,45);
	c2.RegisterGoods("Java",5,43);
	cout<<"c1 amount:"<<c1.GetAmount()<<end1;
	cout<<"c2 amount:"<<c2.GetAmount()<<end1;
}

當函數是在類外構造的話,要注意加上作用域解析符::,限定函數的作用域爲一個類,而不是全局函數。如果不限定,則函數中使用的變量需要重新定義。(即東北大學到底說的是中國的還是美國的,得加前提限定才能知道具體指代)

class CGoods
{
public: //給用戶提供的方法,哪些操作
	void RegisterGoods(char name[],int,float); //輸入數據
	void CountTotal(void); //計算商品總價值
	void GetName(char[]); //讀取商品名
	int GetAmount(void); //讀取商品數量
	float GetPrice(void); //讀取商品單價
	float GetTotal_value(void); 
private: //有哪些成員(可操作的變量)
	char Name[21];
	int Amount;
	float Price;
	float Total_value;
};

void CGoods::RegisterGoods(char name[],int amount, float price)
{
	strcpy(Name,name);
	Amount = amount;
	Price = price;  //如果你不限定CGoods::則變量Name,Amount,Price未定義
}

void main()
{
	CGoods c1; //定義對象——過程就是實例化
	c1.RegisterGoods("C++",10,45);
}

-----------------------------------------------------------------------------------------------------------------------------------------
當然,一個比較好的程序,它一般會將類和類中的函數分開編寫,將類的定義放在Header File裏面,而將類中的一些操作函數放在Source File裏面
在這裏插入圖片描述這樣做以後,比如上面的Test,需要將Test.cpp裏面的頭文件改爲對應的.h,下面就是Test.cpp中寫類中的函數。

#include"Test.h"

//返回值 類名::函數名(參數)
void CGoods::RegisterGoods(char name[],int amount,float price)
{
	strcpy(Name,name);
	Amount = amount;
	Price = price;
}
...

而在Test.h裏只剩下了類的聲明:

#include<iostream>
using namespace std;

class CGoods
{
public: //給用戶提供的方法,哪些操作
	void RegisterGoods(char name[],int,float); //輸入數據
	void CountTotal(void); //計算商品總價值
	void GetName(char[]); //讀取商品名
	int GetAmount(void); //讀取商品數量
	float GetPrice(void); //讀取商品單價
	float GetTotal_value(void); 
private: //有哪些成員(可操作的變量)
	char Name[21];
	int Amount;
	float Price;
	float Total_value;
};

另外的,在Main.cpp中只用寫void main()就可以:

#include"Test.h"

void main()
{
	CGoods c1;
	c1.RegisterGoods("C++",10,45);
}

這一系列操作就是庫層面的封裝。

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