第一篇:VC類定義
VC++怎樣定義類對象
如果你定義了一個類(假設是A)那么聲明一個A的對象的方法就是:
A a;// a 就是一個A的對象
A *a;// a 就是一個A的對象的指針
A a[N];// a 就是一個A的對象的數組
A fuctionName();// 返回A的一個對象的函數
上面是說如何定義對象,下面說如何定義一個類
最基本的:(運用關鍵字class)
class A{
public://公有變量及函數(沒聲明是public,private,protected的都默認為public,這個與Java是不同的,后者默認為protected)(可以在任意位置被訪問)
......private://私有變量及函數(只能在類里面被訪問)
......protecte://受保護的變量及函數(可以在派生類中被訪問)
};//注意分號
一般構造函數,析構函數,復制構造函數都是在public里被聲明的(不用我說什么是構造函數(construct)和什么是析構函數(destruct)了吧)。
更往深一層會有派生類,友元類,抽象類的概念。
派生類就是有一個已經存在的類來derive一個新的類,一般新的類跟原來的是被包含與包含的關系(否則聲明一個派生類就沒什么意義)具體實現如下:
class A: public B{
......//跟一個普通的類沒什么區別
}
聲明一個友元類是這樣的:
class A: {
friend B
......}(A就成了B的友元類,友元函數的聲明也類似)
不過要注意到,友元函數、友元類的大量使用破壞了類里的數據及函數的穩定性,或是可靠性。使得private類型的都可能被篡改。
最后抽象類:
它是通過虛函數來實現的,所謂虛函數就是加上virtual關鍵字在前面的函數;含有虛函數的類就是抽象類,注意到如果要實現一個函數的動態綁定對象必須要以地址的形式來傳遞。好吧,短短幾句是不能把聲明類的注意事項說清楚的,太多了(像什么封裝,繼承,抽象)。不過,你只要多編寫多看書就會的。
第二篇:定義銀行類
在定義銀行類時,若取錢數大于余額則作為異常處理(InsufficientFundsException).思路:產生異常的條件是余額少于取額, 因此是否拋出異常要判斷條件
取錢是withdrawal([wie'dr?:?l, wiθ-]n.撤退,收回;提款;取消;退股)方法中定義的動作,因此在該方法中產生異常.處理異常安排在調用withdrawal的時候,因此withdrawal方法要聲明異常,由上級方法調用 要定義好自己的異常類class Bank
{double balance;
public void deposite(double dAmount)
{if(dAmount>0.0){balance+=dAmount;}}
public void withdrawal(double dAmount)
throws InsufficientFundsException{if(balance throw new InsufficientFundsException(this,dAmount);} balance=balance-dAmount; } public void show_balance() { System.out.println(“The balance is ”+(int)balance);} } public class ExceptionDemo { public static void main(String args[]) { try { Bank ba=new Bank(50); ba.withdrawal(100); System.out.println(“Withdrawal successful!”); }catch(Exception e) {System.out.println(e.toString());} }public class InsufficientFundsException extends Exception{private Bankexcepbank; private double excepAmount; InsufficientFundsException(Bank ba, doubledAmount){ excepbank=ba; excepAmount=dAmount; } public StringexcepMesagge() {String str=“The balance”+ excepbank.showBalance()+“The withdrawal was”+excepAmount;return str;} 如何組織編寫模板程序 前言 常遇到詢問使用模板到底是否容易的問題,我的回答是:“模板的使用是容易的,但組織編寫卻不容易”。看看我們幾乎每天都能遇到的模板類吧,如STL, ATL, WTL, 以及Boost的模板類,都能體會到這樣的滋味:接口簡單,操作復雜。 我在5年前開始使用模板,那時我看到了MFC的容器類。直到去年我還沒有必要自己編寫模板類。可是在我需要自己編寫模板類時,我首先遇到的事實卻是“傳統”編程方法(在*.h文件聲明,在*.cpp文件中定義)不能用于模板。于是我花費一些時間來了解問題所在及其解決方法。 本文對象是那些熟悉模板但還沒有很多編寫模板經驗的程序員。本文只涉及模板類,未涉及模板函數。但論述的原則對于二者是一樣的。 問題的產生 通過下例來說明問題。例如在array.h文件中有模板類array: // array.h template 然后在main.cpp文件中的主函數中使用上述模板: // main.cpp #include “array.h” int main(void){ array 將array.h文件分裂成為array.h和array.cpp二個文件(main.cpp保持不變)// array.h template // array.cpp #include “array.h” template 編譯時會出現3個錯誤。問題出來了: 為什么錯誤都出現在第一個地方? 為什么只有3個鏈接出錯?array.cpp中有4個成員函數。 要回答上面的問題,就要深入了解模板的實例化過程。模板實例化 程序員在使用模板類時最常犯的錯誤是將模板類視為某種數據類型。所謂類型參量化(parameterized types)這樣的術語導致了這種誤解。模板當然不是數據類型,模板就是模板,恰如其名: 編譯器使用模板,通過更換模板參數來創建數據類型。這個過程就是模板實例化(Instantiation)。 從模板類創建得到的類型稱之為特例(specialization)。 模板實例化取決于編譯器能夠找到可用代碼來創建特例(稱之為實例化要素,point of instantiation)。 要創建特例,編譯器不但要看到模板的聲明,還要看到模板的定義。模板實例化過程是遲鈍的,即只能用函數的定義來實現實例化。 再回頭看上面的例子,可以知道array是一個模板,array 現在,編譯array.cpp時會發生什么問題呢?編譯器可以解析模板定義并檢查語法,但不能生成成員函數的代碼。它無法生成代碼,因為要生成代碼,需要知道模板參數,即需要一個類型,而不是模板本身。 這樣,鏈接程序在main.cpp 或 array.cpp中都找不到array 至此,我們回答了第一個問題。但還有第二個問題,在array.cpp中有4個成員函數,鏈接器為什么只報了3個錯誤?回答是:實例化的惰性導致這種現象。在main.cpp中還沒有用上operator[],編譯器還沒有實例化它的定義。解決方法 認識了問題,就能夠解決問題: 在實例化要素中讓編譯器看到模板定義。 用另外的文件來顯式地實例化類型,這樣鏈接器就能看到該類型。使用export關鍵字。 前二種方法通常稱為包含模式,第三種方法則稱為分離模式。 第一種方法意味著在使用模板的轉換文件中不但要包含模板聲明文件,還要包含模板定義文件。在上例中,就是第一個示例,在array.h中用行內函數定義了所有的成員函數。或者在main.cpp文件中也包含進array.cpp文件。這樣編譯器就能看到模板的聲明和定義,并由此生成array 第二種方法,通過顯式的模板實例化得到類型。最好將所有的顯式實例化過程安放在另外的文件中。在本例中,可以創建一個新文件templateinstantiations.cpp: // templateinstantiations.cpp #include “array.cpp” template class array array Stroustrup的書中讀到export時,感到非常興奮。但很快就發現VC 6.0不支持它,后來又發現根本沒有編譯器能夠支持這個關鍵字(第一個支持它的編譯器要在2002年底才問世)。自那以后,我閱讀了不少關于export的文章,了解到它幾乎不能解決用包含模式能夠解決的問題。欲知更多的export關鍵字,建議讀讀Herb Sutter撰寫的文章。 結論 要開發模板庫,就要知道模板類不是所謂的“原始類型”,要用其它的編程思路。本文目的不是要嚇唬那些想進行模板編程的程序員。恰恰相反,是要提醒他們避免犯下開始模板編程時都會出現的錯誤。 ////////////////////////////// http://www.tmdps.cn,.cxx)擴展名。 這種組織方式工作的很好:它使得在編程時可以方便地訪問所需的類型定義,并且避免了來自鏈接器的“變量或函數重復定義”的錯誤。 由于以上組織方式約定的影響,模板編程新手往往會犯一個同樣的錯誤。下面這一小段程序反映了這種錯誤。就像對待“普通代碼”那樣,我們在頭文件中定義模板: // basics/myfirst.hpp #ifndef MYFIRST_HPP #define MYFIRST_HPP // declaration of template template // basics/myfirst.cpp #include 大部分C++編譯器(Compiler)很可能會接受這個程序,沒有任何問題,但是鏈接器(Linker)大概會報告一個錯誤,指出缺少函數print_typeof()的定義。 這個錯誤的原因在于,模板函數print_typeof()的定義還沒有被具現化(instantiate)。為了具現化一個模板,編譯器必須知道哪一個定義應該被具現化,以及使用什么樣的模板參數來具現化。不幸的是,在前面的例子中,這兩組信息存在于分開編譯的不同文件中。因此,當我們的編譯器看到對print_typeof()的調用,但是沒有看到此函數為double類型具現化的定義時,它只是假設這樣的定義在別處提供,并且創建一個那個定義的引用(鏈接器使用此引用解析)。另一方面,當編譯器處理myfirst.cpp時,該文件并沒有任何指示表明它必須為它所包含的特殊參數具現化模板定義。頭文件中的模板 解決上面這個問題的通用解法是,采用與我們使用宏或者內聯函數相同的方法:我們將模板的定義包含進聲明模板的頭文件中。對于我們的例子,我們可以通過將#include “myfirst.cpp”添加到myfirst.hpp文件尾部,或者在每一個使用我們的模板的點C文件中包含myfirst.cpp文件,來達到目的。當然,還有第三種方法,就是刪掉myfirst.cpp文件,并重寫myfirst.hpp文件,使它包含所有的模板聲明與定義: // basics/myfirst2.hpp #ifndef MYFIRST_HPP #define MYFIRST_HPP #include 從這個方法中我們可以得到一些觀察結果。最值得注意的一點是,這個方法在相當程度上增加了包含myfirst.hpp的開銷。在這個例子中,這種開銷并不是由模板定義自身的尺寸引起的,而是由這樣一個事實引起的,即我們必須包含我們的模板用到的頭文件,在這個例子中是 這在實踐中確實是一個問題,因為它增加了編譯器在編譯一個實際程序時所需的時間。我們因此會在以后的章節中驗證其他一些可能的方法來解決這個問題。但無論如何,現實世界中的程序花一小時來編譯鏈接已經是快的了(我們曾經遇到過花費數天時間來從源碼編譯的程序)。 拋開編譯時間不談,我們強烈建議如果可能盡量按照包含模式組織模板代碼。 另一個觀察結果是,非內聯模板函數與內聯函數和宏的最重要的不同在于:它并不會在調用端展開。相反,當模板函數被具現化時,會產生此函數的一個新的拷貝。由于這是一個自動的過程,編譯器也許會在不同的文件中產生兩個相同的拷貝,從而引起鏈接器報告一個錯誤。理論上,我們并不關心這一點:這是編譯器設計者應當關心的事情。實際上,大多數時候一切都運轉正常,我們根本就不用處理這種狀況。然而,對于那些需要創建自己的庫的大型項目,這個問題偶爾會顯現出來。 最后,需要指出的是,在我們的例子中,應用于普通模板函數的方法同樣適用于模板類的成員函數和靜態數據成員,以及模板成員函數。 實驗一、二叉樹的類定義 程序說明 1、改程序用二叉鏈存儲結構將其生成一棵二叉樹; 2、分別用三種遍歷算法將二叉樹的遍歷序列輸出; 3、用括號表示法輸出二叉樹。 二叉樹的形狀 A 程序代碼 #include “stdafx.h” #include char data; struct CZYP_BTNode *left; //左孩子指針 struct CZYP_BTNode *right;// 右孩子指針 } *BiTree; void CreateBiTree(BiTree &T){ // 在先序遍歷二叉樹的過程中輸入二叉樹的“先序字符串”,// 建立根指針為 T的二叉鏈表存儲結構。在先序字符串中,// 字符'#'表示空樹,其它字母字符為結點的數據元素 char ch; cin >> ch; if(ch=='#') { T=NULL;// 建空樹 } else { T = new CZYP_BTNode; // “訪問”操作為生成根結點 T->data = ch; CreateBiTree(T->left); // 遞歸建(遍歷)左子樹 CreateBiTree(T->right); // 遞歸建(遍歷)右子樹 } } //先序遍歷以T為根指針的二叉樹 void PreOrder(BiTree &T){ if(T) { // T=NULL時,二叉樹為空樹,不做任何操作 cout<< T->data << “ ”;// 通過函數指針 *visit 訪問根結點 PreOrder(T->left); // 先序遍歷左子樹 PreOrder(T->right); // 先序遍歷右子樹 } } //中序遍歷以T為根指針的二叉樹 void InOrder(BiTree &T){ if(T){ // T=NULL時,二叉樹為空樹,不做任何操作 InOrder(T->left);// 先序遍歷左子樹 cout<< T->data << “ ”;// 通過函數指針 *visit 訪問根結點 InOrder(T->right);// 先序遍歷右子樹 } } //后序遍歷以T為根指針的二叉樹 void PostOrder(BiTree &T){ if(T){ // T=NULL時,二叉樹為空樹,不做任何操作 PostOrder(T->left);// 先序遍歷左子樹 PostOrder(T->right);// 先序遍歷右子樹 cout<< T->data << “ ”;// 通過函數指針 *visit 訪問根結點 } } //用括號表示法輸出二叉樹 void DispBTree(BiTree &bt){ if(bt!=NULL){ cout< if(bt->right!=NULL||bt->left!=NULL) { cout<<“(”;程序結果 DispBTree(bt->left); if(bt->right!=NULL)cout<<“,”; DispBTree(bt->right); cout<<“)”; } } } int main(){ cout << “請依次輸入字符: ABD#G##E##C#FH###” << endl; BiTree T; CreateBiTree(T); cout << “先序遍歷: ” << endl; PreOrder(T); cout << endl << “中序遍歷: ” << endl; InOrder(T); cout << endl << “后序遍歷: ” << endl; PostOrder(T); cout<<“n用括號表示法輸出二叉樹:n”;DispBTree(T);cout< return(0);} 心得體會 在這次實驗中,我花了很多的時間。最重要的體會就是我的知識卻是很少。在做這次試驗之前我仔細的看了一遍樹的三種遍歷的偽代碼。對程序中用到的遞歸思想有了更深刻的認識,并且我也借鑒了老師PPT上的很多程序的寫法。再者就是我從網上找了一些二叉樹的寫法,然后通過自己修改、調試。在這里我想說一下,我調試的時候很多錯誤都不知道從哪里找,后來我就把出現的錯誤信息輸入到baidu里,事實證明這樣確實很有效。終于沒有錯誤了。Happy!! 今天調試了一上午,雖說很累,但是我確確實實感到學到了很多知識。不足之處 這個程序的int isEmpty()函數沒有實現,需要改天寫出來。 一、給定二叉樹如下圖所示,編程完成下列要求: 1、用二叉鏈存儲結構將其生成一棵二叉樹; 2、分別用三種遍歷算法將二叉樹的遍歷序列輸出; 3、用括號表示法輸出二叉樹。G D B E A C F H 上面是個圖。。由于我分不多了,所以不是很多。但是我很想學這方面知識,到時我有分了再給你叫啊。高手幫忙啊。問題補充: 我把圖詳細說下。A是樹根;B、C分別是A的左右孩子;D、E分別是B的左右孩子;G是D的右孩子;F是C的右孩子;H是F的左孩子。相信我已經表達清楚了吧。謝謝各位大蝦了。 編號: 河北工業大學計算機軟件技術基礎(VC)2007年課程設計報告 學院 班級 姓名 __ 學號 ____ 成績 __ ____ 一、題目:查找滿足特定條件的三位數(27) 二、設計思路 1、總體設計 1)分析程序的功能 2)系統總體結構:設計程序的組成模塊,簡述各模塊功能。 2、各功能模塊的設計:說明各功能模塊的實現方法 3、設計中的主要困難及解決方案 在這部分論述設計中遇到的主要困難及解決方案。1)如何將輸出1~9不重復數字 2)困難2 4、你所設計的程序最終完成的功能 1)說明你編制的程序能完成的功能 2)準備的測試數據及運行結果 三、程序清單 如果是使用一個文件完成的程序,只需列出程序代碼。 如果是使用多文件完成的程序,首先說明程序中的代碼存放在哪些文件中,說明文件名(例如:本程序包含first.cpp、second.cpp、third.cpp和all.h四個文件);然后依次給出每個文件名及該文件清單,例如: 1、first.cpp文件清單 2、second.cpp文件清單 3、third.cpp文件清單 第1頁/共2 頁 編號: 4、all.h文件清單 (說明:程序清單中一定要有注釋。將程序中自己編寫的代碼列在此處,系統自動生成的代碼就不要列出了。程序清單部分的行間距設為1行即可。) 四、對該設計題目有何更完善的方案 1、對自己完成程序進行自我評價。 2、對課題提出更完善的方案 五、收獲及心得體會 1、通過本次課程設計,自己在哪些方面的能力有所提高。 2、收獲和心得體會。 日期: 2007年 月 日 (說明:本模板只提供參考,每個同學根據自己課題的特點,可減少或增加某方面的論述) 第2頁/共2 頁第三篇:類聲明和定義
第四篇:二叉樹的類定義
第五篇:VC課程設計報告