1 軟件概述
一個軟件的生命期包含:需求分析、設計、編程、測試、運行維護這五個部分
程序的設計方法包括兩種:結構化程序設計和麪向對象的程序設計。
結構化程序設計歸結爲:程序=算法+數據結構,面向過程,數據與程序分離;設計的基本思想是自頂向下、逐步細化的設計方法和單入單出的控制結構。
面向對象程序設計是將數據和對數據的操作方法放在一起,形成一個相對獨立的整體——對象(object),同類實體可抽象出共性,形成類(class),一個類的數據通常只能通過本類提供的方法進行處理,這些方法成爲該類與外部的接口。對象之間通過消息(message)進行通訊。
其中面向對象的程序設計有三大特點。
- 封裝性:建立類,支持封裝和數據隱藏,每一個定義完好的類可以作爲一個獨立模塊使用,並對外提供一定的接口。
- 繼承與派生性:類變爲基類,新類稱爲子類或派生類,是對基類中部分屬性和操作的增加或修改,其中新類只需描述自己所特有的屬性和操作即可,派生可以一直進行下去,形成一個派生樹。
- 多態性:同一個消息被不同對象接收時,產生不同結果。即實現同一接口,不同方法。
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);
}
這一系列操作就是庫層面的封裝。