本 章 主 要 內 容 如 下:
第 11.1 節 第一個 C++ 程式
由 10.1 節的方法 2, 利用 stack 來解決標準括號式的問題,於檔案 stack.h 與
stack.c 已具有 C++ class 中資料封包的性質,以 class 的方式重新整
理 stack.h 與 stack.c 成為新的檔案 stack.cpp 其內容為
說明:
將檔案 main.c 改為 main.cpp 其內容如下:
一般而言檔案 stack.h 的內容僅含 data members 及 member functions
的宣告,其內容 如下:
當 class 的宣告, data members s 與 tos 之前的 private 去掉,那麼
data protection 就沒有了,其屬性變成 public, 資料的一致性也無法達成。
此時對於物件 stack
而言,即可直接引用 s 及 tos 如 stack.tos=1002; stack.s[1]=100;等。
一般而言, private 的 data members 及 member functions 都是放在 class 宣告的尾部。
回本章主目錄
第 11.2 節 new 與 delete operators 及 iostream.h 檔
陣列亦可以經由 動態( dynamic ) 方式取得, 於 C 程式語言 是以 malloc 函數
呼叫方式取得 動態記憶体, 於 C++ 程式語言 是以 new 來取得 動態記憶体。
於 C 程式語言 是以 free 方式來釋放 動態記憶体, 於 C++ 程式語言
是以 delete 方式來釋放 動態記憶体。
將上一個程式修改成下列的程式如下:
檔案 stack.h 的內容 如 例 1 所示。
例 1 :
說明:
檔案 stack.cpp 的內容 如下:
說明:
檔案 main.cpp 其內容如下:
說明:
回本章主目錄
第 11.3 節 overloaded functions
C++ 程式語言容許同一個函數名稱有不同的用法, 事實上 C 程式語言亦有
類似情形, 如 2 + 3 與 2.0 + 3.0 , 對於加法
運算可以 用在 集合 int x int 與 集合 float x float 上, 即 加法運算
有超載的情形。
對於 C++ 程式, 我們可以明確地定義超載函數, 同一個函數名稱,
只要函數的引數當中,個數不一, 或同名函數中相對應的引數中的資料型態不一,
即可定義不同的函數。
我們以例子來說明其使用法。
例 2 : overloaded functions
說明:
C++ 程式語言提供了函數的設計更有彈性, 即呼叫函數時, 實際的引數 個數
可以少於 形式引數的 個數。 欲達此功能, 只要在 函數的 定義中,
將 形式引數 加上 = 以及其起始值即可。 其使用方式以例 3 來說明。
例 3 : overloaded functions with initial values
例 4 : overloaded constructor CStack()
#define MAXSIZE 100
class CStack
{
public:
CStack( ) { tos=0; }
~CStack( ) { }
int isEmpty( ) { return tos == 0; }
int isFull( ) { return tos == MAXSIZE; }
void push(char c) { s[tos++]=c; }
char pop( ) { return s[--tos]; }
private:
char s[MAXSIZE];
int tos;
}
任意一個 class 都有一個 預設 (default) 建構函數,
即使 不將它 標明出來, 它仍然 存在。 一個 class 可能 含有 一個 或 多個
建構函數。 如有多個函數 其名皆相同, 則稱之為 overloaded function, 將於
第 3 節討論。
任意一個 class 都有一個 預設 (default) 解構函數,
一個 class 也可能 含有 一個 或 多個 解構函數。
#include <stdio.h>
#include "stack.cpp"
main( )
{ CStack stack;
char c;
while ( ( c=getchar() ) != '\n' )
{ if(c=='(') stack.push(c);
eise if (c==')')
{ if (stack.isEmpty())
{ printf("Eorror input!\n");return;}
else stack.pop();
}
else { printf("Eorror input!\n");return;}
}
if (stack.isEmpty()) printf("Correct input!\n");
else printf("Eorror input!\n");
}
說明:
CStack S1,S2;
那麼 S1 與 S2 分別有其變數 S 與 tos。當引用 member functions
如
S1.push(c); S2.push(c)
物件 S1 與 S2 彼此都不互相影響。
#define MAXSIZE 100
class CStack
{
public:
CStack( );
~CStack( );
int isEmpty( );
int isFull( );
void push(char c);
char pop( );
private:
char s[MAXSIZE];
int tos;
}
檔案 stack.cpp 才將 member functions 的定義 (implmentation) 加進去。不過每個
member functions 都要加上 class specification CStack::, 該 檔案的 內容如下:
#include "stack.h"
CStack:: CStack( ){ tos=0; }
CStack:: ~CStack( ){ }
int CStack:: isEmpty( ){ return tos==0; }
int CStack:: isFull( ){ return tos==MAXSIZE; }
void CStack:: push(char c){ s[tos++]=c; }
char CStack:: pop( ){ return s[--tos]; }
#define MAXSIZE 100
class CStack
{
public:
CStack( );
~CStack( );
int isEmpty( );
int isFull( );
void push(char c);
char pop( );
private:
char *s;
int tos;
}
#include "stack.h"
CStack:: CStack( ){ tos=0; s = new char[MAXSIZE]; }
CStack:: ~CStack( ){ delete [] s; }
int CStack:: isEmpty( ){ return tos==0; }
int CStack:: isFull( ){ return tos==MAXSIZE; }
void CStack:: push(char c){ s[tos++]=c; }
char CStack:: pop( ){ return s[--tos]; }
#include <iostream.h> // 已經將 stdio.h 換成 iostream.h
#include "stack.h"
main( )
{ CStack stack;
char c;
while ((cin >> c)!='\n')
{ if(c=='(') stack.push(c);
else if (c==')')
{ if (stack.isEmpty())
{ cout << "Error input!\n";
return;
}
else stack.pop();
}
else { cout << "Error input!\n"; return;}
}
if (stack.isEmpty()) cout << "Correct input!\n";
else cout << "Error input!\n";
}
其格式為 cin >> 變數 >> 字串;
其格式為 cout << 變數 << 字串;。
欲跳行,可以用
cout << endl; 來替代 cout <<"\n";。
其中 endl 表 end of line。
int f(int a)
{
return a*a;
}
char f(char a)
{
return a+1;
}
int f(int a, int b)
{
return a*b;
}
main()
{
cout<< "f(2)="<< f(2)<< endl;
cout<< "f('a')="<< f('a')<< endl;
cout<< "f(2, 3)="<< f(2,3)<< endl;
}
f(2)=4
f('a')=b
f(2, 3)=6
int f(int a=1, int b=2, int c=3)
{
return a*b*c;
}
main()
{
cout<< "f()="<< f()<< endl;
cout<< "f(10)="<< f(10)<< endl;
cout<< "f(10, 5)="<< f(10, 5)<< endl;
cout<< "f(10, 5, 2)="<< f(10, 5, 2)<< endl;
}
說明:
於例 1 中 CStack 的 constructor CStack() 就可以設計的更具彈性, 如例 4 所示。
f()=6
f(10)=60
f(10, 5)=150
f(10, 5, 2)=100
#define MAXSIZE 100
class CStack
{
public:
CStack(int n = MAXSIZE);
~CStack( );
int isEmpty( );
int isFull( );
void push(char c);
char pop( );
private:
char *s;
int tos;
int size;
}
CStack:: CStack(int n = MAXSIZE)
{ tos=0; size = n; s = new char[size]; }
CStack:: ~CStack( ){ delete [] s; }
int CStack:: isEmpty( ){ return tos==0; }
int CStack:: isFull( ){ return tos==size; }
void CStack:: push(char c){ s[tos++]=c; }
char CStack:: pop( ){ return s[--tos]; }
回第 10 章
至第 12 章
回 C 程式主目錄