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