總覽c & c++ (轉)

worldblog發表於2007-12-11
總覽c & c++ (轉)[@more@]

1.0.C++ 和 C

C++是C語言的一個面向(-oriented)的擴充套件(大師們都建議我們在學習C++的時候,把C++當成一門新的語言對待).
C++可以被用來編譯C。你使用C所完成的任何工作,都可以使用C++完成。
C++程式與他們的擴充套件不能在C環境下編譯透過。

2.0.物件導向

2.1.類
類是所有物件導向程式(S)的基本組成。
一個類包含一個(或一組)物件和操作物件的

2.2.類的組成
一個類的定義包含變數和函式的宣告
一個類的定義同樣為變數和函式提供不同的區域
class FILE_C
{
private:
  long ptr; // 指標
  char name[FNAME_LEN]; // 檔名
  short state; // 檔案狀態
  short mode; // 檔案

public:
  FILE_C(void); // 類構造器
  ~FILE_C(void);. // 類析構器
  short.Open(char *,short); // open 函式
  short.Close(void);. // close 函式
  short.Read(char *,short); // read 函式
  short.Write(char *,short);// write 函式
};

上面的FILE_C類包含四個私有資料成員(物件)和六個操作那些物件的函式
任何有權使用類的物件都必須透過類的函式操作
private關鍵字:說明它裡面的資料除了類成員函式以外的任何物件都不能訪問

2.3.類的構造器和析構器
FILE_C類有一個FILE_C()建構函式和一個~FILE_C解構函式
建構函式與類同名,它在類的例項建立的時候
並且初始化任何類的需要
解構函式在類名之前加上~字元
解構函式可以在類的例項終止時進行進行任何清除工作
類的例項可以用兩種方式建立。
一種是使用標準C語言建立一個變數的方式建立:

  short.x; //  建立一個名為x的變數

  FILE_C  LogFile; //  建立一個類FILE_C的例項

另外一種方式是透過指標和new關鍵字分派一個新的例項:

  FILE_C *pLogFile; // 建立一個指向類FILE_C的指標


  pLogFile = new FILE_C; // 建立一個例項並且分配空間

2.3.1.使用引數構造
建構函式也可以象其他函式一樣使用引數。
引數使用在建立一個新的類例項的時候
.class FILE_C
{
  ....

public:

  FILE_C(char *pFileName);

};


FILE_C.LogFile("LogFileName");  // 使用引數構造

2.4.類函式呼叫
類函式的呼叫方法與普通的C函式相同
不同的是它們使用相似的語法構造成員資格

.FILE_C LogFile; // 建立一個類FILE_C的例項

.FILE_C *pInputFile;. // 建立一個指向類FILE_C的例項的指標

.pInputFile = new FILE_C; // 建立一個類FILE_C的例項


.LogFile.Open("LogFile",O_APPEND);  // 開啟LogFile


.InputFile -> Open("InputDat",O_READONLY);  // 開啟InputFile


.InputFile -> Read(buffer,sizeof(buffer));  // 讀 InputFile

從以上的示例可以看出,一個檔案指標從來沒有像標準C檔案函式那樣傳送到FILE_C函式
每一個FILE_C的例項維持它自己的控制資訊
C++通常在類和應用之間使用單一化介面因為類在它自己內部完成
它們包含所有屬性和/或物件的內部描述

2.5.類函式宣告
一個類的定義(比如FILE_C)將可能出現在一個標頭檔案
實際的函式實現將出現在C++原始檔
每一個類函式前面都使用符號::代表它的歸屬
.short FILE_C::Open(char * pFileName,short mode)
{
 mode = mode; // 提取私有資料項

 strcpy(name,pFileName);

 //  開啟操作

 return (status);
}

2.6.Inline函式
如果一個類函式執行一個非常簡單的任務,他可以被宣告成一個行內函數
一個行內函數實際上是一個函式的擴充套件,它在類中宣告並實現,透過包含inline宣告
class FILE_C

{
private:
 char.name[FNAME_LEN];  // 檔名

 .....

public:
 FILE_C(char *pFileName) { strcpy(name,pFileName); }

 .....

};

上面的示例顯示了FILE_C行內函數構造器的實現
注意:行內函數不能濫用

3.0.繼承類
class BROWSE_C : FILE_C  // browse繼承自file

private:
 short  curline;
 ...
public:
 BROWSE_C(void);
 ~BROWSE_C(void);
 OpenFile(char *);
};

上面的示例,BROWSE_C類將不僅可以訪問它所有的成員data/object,而且可以訪問
FILE_C類的所有public/protected成員

下表顯示了父子類的繼承關係

.父..子

.----------..---------

.Private.....在繼承類中不可見

.Protected...在繼承類中被當作私有成員

.Public......在繼承類中被當作受保護的成員


從上表可以看出,BROWSE_C可以使用
任何 FILE_C的public/protected資料和函式 FILE_C
應用程式將不能接受任何
FILE_C 類的私有資料或函式
這些是預設的類安全繼承

3.1.自定義類繼承
當定義繼承類時,預設的安全繼承可以過載:
class BROWSE_C : public FILE_C  // browse 繼承自 file
{
private:
 short  curline;
 ...
public:
  BROWSE_C(void);
  ~BROWSE_C(void);
  OpenFile(char *); 
};


上例中,所有的FILE_C 類的公共功能同樣
公開到使用BROWSE_C 類的應用程式中

3.2.容器類
容器類是包含別的類的類。
以下是使用一個類實現binary tree的例子:

class TREE_C
{
private:
  struct TNODE_S. // 容器類
  {
  PVOID  pvData;
  struct TNODE_S *pstLeft;
  struct TNODE_S *pstRight;
  };
  typedef struct TNODE_S TNODE_T;
  typedef TNODE_T *TNODE_P;
  typedef TNODE_T **TNODE_PP;
  TNODE_P  pstHead;
  TNODE_P  pstNode;
 .....
public:
  TREE_C(VOID);
  ~TREE_C(VOID);
  SHORT  Delete(PVOID);  // Remove entry
  SHORT  Find(PVOID,PPVOID);  // Find entry
  SHORT  Insert(PVOID);  // Insert entry
 .....
};

typedef TREE_C * TREE_CP;
typedef TREE_C ** TREE_CPP;

在binary tree 例子中,樹中的每一個節點在TREE_C 類的例項
並不是都需要。所以每一個節點包含在TREE_C 類,
並且類TREE_C實行所有的包含在其內的TNODE_S操作

3.3.虛擬函式
虛擬函式提供一種方法為類基類具有
特有的或行為適當的到當前繼承類

class FILE_C
{
private:
  char.name[FNAME_LEN];  // file name
 .....
public:
 FILE_C(char *pFileName) { strcpy(name,pFileName); }
  virtual short Reset(void); 
};

class BROWSE_C : FILE_C  // browse derived from file
{
private:
  short  curline;
  ...
public:
  BROWSE_C(void);
  ~BROWSE_C(void);
  OpenFile(char *);
  short Reset(void);
};

short BROWSE_C::Reset(void)
{
  FILE_C::Reset();
  curline = 0;
}

4.0.操作過載
自從C++類定義詳細的在類的例項操作
以來,C++允許所有標準操作(i.e.'+','-', '*', '/', '++', '--')
可以被當前類重新定義或過載

class STRING_C
{
private:
  char * pChar;
  int  len;
  ....
public:
  STRING_C(const char * = 0);  // prov default value
  ~STRING_C(delete pChar);
  void operator+(char *)
};

STRING_C::operator+(char *pC)
{
  char * pBuf;

  pBuf = new char[len=strlen(pC)+len];

  strcpy(pBuf,pChar);

  strcat(pBuf,pC);

  delete pChar;

  pChar = pBuf;
}

 

STRING_C  Str("ABC");

Str + "DEF";.  // 現在pChar = 'ABCDEF'

5.0.C++ 輸入/輸出
C++輸出把C語言的printf家族簡單化
C++定義關鍵字cout,cin,stdout,stdin裝置
C++根據當前變數型別自動格式化

/*  C */

printf("%s = %dn", szRate, sRate);

/*  C++ */

cout << szRate << " = " << sRate << "n";

//  C++另外一種方式

cout << form("%s = %dn", szRate,sRate);

/* C */

scanf("%d",&sRate);

/* C++ */


cin >> sRate;

 

7.0.Reference Variables


C++提供一種語法允許程式設計師更加容易地使用指標到應用程式中

/*  C */

short Afunc(short * psShort)
{
  *psShort++;
}

 

/*  C++ */


short Afunc(short & Short)
{
  Short++;
}


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991227/,如需轉載,請註明出處,否則將追究法律責任。

相關文章