/* * Main.cpp * * Created on: 2015-7-24 * Author: feiruo */ /* * 類與對象: * * 1.抽象: * 面向對象方法中的抽象,是指對具體問題或對象的概括,抽出一類對象的公共性質並加以描述的過程。 * 數據抽象:描述某類對象的屬性或狀態,也就是此類對象區別於彼類對象的特征; * 行為抽象:描述某類對象的共同行為或功能的特征。 * * 2.封裝: * 封裝就是將抽象得到的數據和行為或功能相結合,形成一個有機的整體,也就是將數據與操作數據的函數代碼進行有機結合。形成類,其中的數據和函數都是類的成員。 * *class Clock{ public: void setTime(int newH,int newM,int newS); void showTime(); private: int hour,minute,second; }; * * 3.繼承: * 面向對象語言中類的繼承機制允許程序員在保持原有類特性的基礎上,進行更具體更詳細的說明。 * * 4.多態: * 從廣義上講,多態性是指一段程序能夠處理多種類型對象的能力。在C++語言中,這種多態性可以通過強制多態、重載多態、類型參數化多態、包含多態4中形式來實現。 * 強制多態是通過一種類型的數據轉換成另一種類型的數據來實現的。重載是指給同一個名字賦予不同的含義。包含多態和形參數化多態屬於一般多態性,是真正的多態性。 * * 5.類的定義: * 在面向對象程序設計中,程序模塊是由類構成的。類是對邏輯上相關的函數與數據的封裝,它是對問題的抽象描述。 * class 類名稱{ public: //外部接口; private: //私有成員; protected: //保護型成員; }; * * 6.對象: * 類是一種抽象機制,它描述的是一類事物的共同屬性和行為。類的對象就是該類的某一種特定實體(實例化). * 采用的一般方式: * 類名稱 對象名; * * 7.類的成員函數: * (1)成員函數的實現: * 函數的原型聲明要寫在類體中,原型說明了函數的參數表和返回值類型。而函數的具體實現是寫在類定義之外的。與普通函數不同的是,實現成員函數時要指明類的名稱,具體形式為: * 返回值類型 類名::函數成員名(參數表){ //函數體; } * (2)成員函數調用中的目的對象: * 調用一個成員函數與調用普通函數的差異在於,需要使用"."操作符指出調用所針對的對象,這一對象在本次調用中稱為目的對象。 * * (3)帶默認形參值得成員函數: * 如:類Clock中的:void setTime(int newH,int newM,int newS); * * (4)內聯成員函數: * 函數的調用過程中要消耗一些內存資源和運行時間來傳遞參數和返回值。內聯函數的聲明有兩種方式: * 隱式聲明: * class Clock{ public: void setTime(int newH,int newM,int newS); void showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; }; private: int hour,minute,second; }; * * 顯式聲明: * inline void Clock::showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; } *為了保證定義的簡潔,可以使用inline關鍵字顯式聲明的方式。即在函數體實現時,在函數返回值類型前加上inline,類定義中不加入showTime的函數體。 * * 8.構造函數: * 構造函數的作用是在對象被創建時利用特定的值構造對象,將對象初始化為一個特定的狀態。構造函數也是類的一個成員函數,除了一般成員函數特征之外,還有一些特殊的性質: * (1)構造函數的函數名與類名一致,而且沒有返回值。 * (2)構造函數一般被聲明為公有函數。 * (3)只要類中有了構造函數,編譯器就會在建立新對象的地方自動插入對構造函數調用的代碼。因此,構造函數在對象被創建的時候將被自動調用。 class Clock{ public : Clock(){}; } * (4)作為類的成員函數,構造函數可以直接訪問類的所有數據成員,可以是內聯函數,可以帶有參數表,可以重載。 * * 9.復制構造函數: * 復制構造函數是一種特殊函數,具有一般構造函數的特性,其形參是本類的對象的引用。其作用是使用一個已經存在的對象初始化同類的一個新對象。 * class 類名{ public: 類名(); 類名(類名 &對象名); }; 類名::類名(類名 &對象名){ //函數體 }; * 復制構造函數的3種調用情況: * (1)當用類的一個對象去初始化該類的另一個對象時。 * (2)如果函數的形參是類的對象,調用函數時,進行形參和實參結合時。 * (3)如果函數的返回值是類的對象,函數執行完成返回調用者時。 * * 10.析構函數: * 簡單來說,析構函數和構造函數正好相反,它用來完成對象被刪除前的一些清理工作。析構函數是在對象的生存期即將結束的時刻被自動調用。相應的內存空間也被釋放。 * public: slh();//構造函數 ~slh();//析構函數 }; * * 11.類的組合: * 當創建類的對象時,如果這個類具有內嵌對象成員,那麼各個內嵌對象將首先被自動創建。創建對象時,既要對本類的基本類型數據成員進行初始化,又要對內嵌對象成員進行初始化。析構函數的調用執行順序與構造函數的正好相反。 * 類名::類名():內嵌對象1(形參表),內嵌對象2(),...; * 其中,內嵌對象1(形參表),內嵌對象2(),...稱為初始化列表,起作用是初始化內嵌對象; * */ #include "Main.h" #include "iostream" #include "cmath" using namespace std; class Clock{ public: void setTime(int newH,int newM,int newS); void showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; }; private: int hour,minute,second; }; class Circle{ public: Circle(float r); float circumFrence(); float area; private: float radius; }; class slh{ public: slh();//構造函數 ~slh();//析構函數 }; Main::Main() { // TODO Auto-generated constructor stub } Main::~Main() { // TODO Auto-generated destructor stub }; class Point{ public: Point(int xx=0,int yy=0){ x=xx; y=yy; } Point(Point &p); int getX(){ return x; } int getY(){ return y; } private: int x,y; }; Point::Point(Point &p){ x=p.x; y=p.y; } class Line{ public: Line(Point xp1,Point xp2); Line(Line &l); double getLength(){return len;}; private: Point p1,p2; double len; }; Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2){ cout<<"Calling constructor of line"<<endl; double x=static_cast<double> (p1.getX()-p2.getX()); double y=static_cast<double> (p1.getY()-p2.getY()); len=sqrt(x*x+y*y); } Line::Line(Line &l):p1(l.p1),p2(l.p2){ cout<<"Calling the copy constructor of Line"<<endl; } int main(){ Point myP1(1,1),myP2(4,5); Line line(myP1,myP2); Line line2(line); cout<<"The length of the line is:"; cout<<line.getLength()<<endl; cout<<"The length of the line2 is:"; cout<<line2.getLength()<<endl; return 0; }