指定基本類型等價於完成三項工做:ios
@:決定數據對象須要的內存數量程序員
@:決定如何解釋內存中的位(long 和 float 在內存中佔用的位相同,可是轉換方法卻不一樣)安全
@:決定可以使用數據對象執行的操做或方法服務器
C++ 中的類:函數
類規範有兩個部分組成:this
類聲明:以數據成員的方式描述數據部分,以成員函數(方法)的方式描述公有接口。spa
類方法定義:描述如何實現類成員函數。操作系統
簡單來講,類聲明提供了類的藍圖,而方法定義則提供了細節。設計
將數據與方法組合成一個單元是類最吸引人的特性,類要儘量的將公有接口與實現細節分開。公有接口表示設計的抽象組件。將實現細節放在一塊兒並將他們與抽象分開被稱爲封裝,將實現細節隱藏在私有部分中,也能夠理解爲將類函數定義和類聲明放在不一樣的文件中。指針
控制對成員的訪問:
不管類成員是數據成員仍是成員函數,均可以在類的公有或私有部分聲明它。可是因爲隱藏數據是OPP的主要目標之一,所以數據項一般放在私有部分,成員函數(方法)通常放在公有部分,不然沒法從程序中調用這些函數。公有成員函數卻能夠調用私有函數。
類中成員函數的實現:
定義一個類的成員函數,必須給函數名加上"::" 域名解析符。這樣就基本能保證函數的做用域式安全的。
一個並非最佳的可是基本能夠說說明問題的類的成員函數:
內聯方法:
定義於類聲明中的函數都將自動成爲內聯函數。爲此,只需在類實現部分中定義函數時使用inline 限定符便可,注意代碼塊在類內的函數纔會自動成爲內聯函數,可是若是成員函數在類外,須要加上inline 關鍵字,可是這只是一種請求,不是全部的狀況均可以變成內聯函數的。一樣的因而可知,既然類內的函數會自動變成內聯函數,而不須要經過編譯器的仲裁,直接反映了,類極可能就是一種靜態的存儲方式。同時通常的也把內聯函數放在頭文件中,也更爲方便。
方法使用對象:
首先什麼時對象?對象就是類的實例化,好比有一個類的名字叫作CAT;
那麼對象的就是:
CAT A,B;
這裏A,B 就是對象了。
使用方法簡單來講就是調用類中方法與函數 。
好比CAT 這個類中有eat ( )這個函數如今,調用這個函數---》 A.eat( ) ;就算是使用對象中的方法了。
建立類對象,能夠聲明類變量,也可使用new 爲類對象分配存儲空間。也能夠將對象做爲函數的參數和返回值,也能夠講一個對象賦給另外一個。
客戶/服務器模型(類比)
OPP程序員通常依照客戶/服務器模型來討論程序設計,客戶是使用類的程序。類聲明構成了服務器,它是程序可使用的資源。客戶只能經過以公有的接口使用服務器
,根據該接口可靠而且準確的執行。服務器設計人員只能修改類的設計的實現細節,而不能修改接口。這樣程序員獨立地對客戶端服務器進行改進,對服務器的修改不會對客戶的行爲形成意外的影響。
構造函數與析構函數
構造函數:
專門建立一個新對象,將值賦給他們的數據成員。而且沒有聲明類型。
構造函數的參數表示的不是類的成員,而是賦給類成員的值。所以類名不能與類成員函數相同。
構造函數的使用方式:
1.定義的構造函數
2.默認構造函數
定義的構造函數就是根據咱們的意願賦值,建造的新對象。
默認構造函數就是操做系統建立新對象的時候,自動給新建對象的變量復賦值。
析構函數:
簡單來講就是釋放已經使用的資源的函數,它名字比較特殊通常在類的名字前邊加上(~)。和構造函數同樣,析構函數也能夠沒有返回值,和聲明類型。與構造函數不一樣的是,析構函數沒有參數。
類的賦值:
在默認狀況下:將一個對象賦給同類型的另外一個對象。C++將源對象的每個數據成員的內容複製到目標對象中相應的數據成員中。
若是能夠經過初始化也能夠經過賦值來設置對象的值,應採用初始化的方式,一般這種方式的效率更高。
構造函數與析構函數小結:
構造函數是一類特殊的成員函數,在建立類的時候被使用,構造函數的名稱和類相同,可是經過函數重載能夠建立多個同名的構造函數,條件是每一個函數的特徵標識都不一樣,另外構造函數沒有聲明類型。一般,構造函數用來初始化類對象成員,初始化應與構造函數的參數列表相匹配。
This 指針:
這個指針指的是調用方法的對象。this 是指向這個對象的指針,而且*this 這個對象。
注意這個指針只能在成員函數中調用。其餘類型的方法不能調用這個指針,就算是友元函數也不行;
操做符重載:
簡單來講操做符重載就是給一個操做符一個新的使用方式,重載必需要調用一種方法:operator();使用這種方法就能夠重載了。好比說重載一個符號使兩個類能夠相加:
#include<iostream> class Two{ private: double a; double b; double sum; public: Two(); Two(double one,double two); void show()const; Two operator+ (const Two & t)const; Two operator- (const Two & t)const; Two operator* (double n)const; friend Two operator* (double a,const Two & t) {return t * a; } friend std::ostream & operator<< (std::ostream & os,const Two & t); }; Two::Two(){ a = 0; b = 0; sum = 0; } Two::Two(double one,double two){ a = one; b = two; sum = 0; } void Two::show()const{ std::cout << a << std::endl; std::cout << b << std::endl; std::cout << "sum = " << sum << std::endl; } Two Two ::operator+ (const Two &t)const{ Two temp; temp.sum = this->a + this->b + t.a + t.b; return temp; } Two Two ::operator- (const Two &t)const{ Two temp; temp.sum = this->a - t.a + this->b -t.a; return temp; } Two Two:: operator* (double n)const{ Two temp; temp.a = this->a * n; temp.b = this->b * n; temp.sum = temp.a + temp.b; return temp; } std::ostream & operator<< (std::ostream & os, const Two & t){ os << "a = "<< t.a << " b = " << t.b << " sum = " << t.sum; return os; } int main(){ int a,b; std::cin >> a >> b ; Two first(a,b); Two second(2,2); std::cout << first << std::endl; int mut = 10; first = second; std::cout << first<<std::endl; }
好比這段代碼就展現了重載+ - * 以及 >> 符號。可是特殊的 像 "<< " >>": "~"," =" 這些符號必須使用友元函數重載,不能使用成員函數。
重載限制:
1.重載後的操做數必須有一種是用戶自定義類型的
2.使用操做符是儘可能不要違反原來的操做符意義
3.不能從新定義操做符
4.這些操做符不能重載:sizeof , . ,* ,:: ,?:,typeid ,const_cast,dynamic_cast,reinterpret_cast ,reinterpret-cast,static_cast.
5.有些操做符只能經過成員函數重載: = , (), [ ] , -> .
上名提到了一個新名詞友元函數:
簡單來講,就是一種函數具備和成員函數同樣的訪問私有變量的權力,可是又不是成員函數的函數.
建立友元函數:
1。將原型放在類的聲明中而且在類型處聲明friend
2。不能使用成員操做符,由於它並非成員函數
3。 特性:與成員函數訪問權限相同
4。友元函數和類方法只是表達類接口的兩種不一樣機制。
關於類的強制類型轉換問題:
能夠根據使用狀況,定義相關的類方法或友元函數便可。