最初的C++稱爲「帶類的C」,擴展了C語言的不少功能。在C++語言中,仍然可使用C語言中的struct
定義結構。ios
struct 結構名{ 類型 變量名; 類型 變量名; ... }
在C++中,聚合類是一種特殊類型的類,用戶能夠直接訪問其成員,而且具備特殊的初始化語法形式(能夠提供一對花括號括起來的成員初始值列表初始化聚合類的數據成員)。c++
聚合類應當知足的條件:算法
public
類型的(任何狀況下,對象均可以經過成員運算符訪問成員);舉個例子,定義一個聚合類Data
:數組
struct Data{ int ival; string str; };
初始化能夠這樣:函數
Data dval = {8,"Smith"};
注意:初始值的順序必須與成員聲明的順序一致。初始值列表中元素的個數若是少於類的成員數量,則靠後的成員被值初始化。初始值列表中元素的個數絕對不能少於類的成員數量。工具
C++中的struct
不只能夠包含數據,還能夠包含函數。spa
舉個例子:設計
#include<iostream> using namespace std; struct Complex{ double real; double imag; void init(double r,double i){ real = r; imag = i; } double getReal(){return real;} double getImag(){return imag;} }; int main(){ Complex c; c.init(2,3); cout <<c.getReal() <<"+" <<c.getImag() <<"i" <<endl; return 0; }
小提示:在結構中數據成員後面帶分號,函數成員後面是不帶分號的,可是函數成員內須要帶分號,結構反括號後面也是要加分號的,main
結束是不加分號的。指針
說明:結構中的數據和函數稱爲成員,real
、imag
是數據成員。定義Complex
結構後,就能夠用它來定義變量,並能經過成員運算符訪問它的成員函數。code
爲了實現信息隱藏,限制對結構中某些成員的非法訪問,C++增高了3個訪問權限限定符,用於設置結構中數據成員和函數成員的訪問權限。
public
被設置爲public
權限的成員(包括數據成員和函數成員)稱爲類的公有成員,可被任何函數訪問(包括結構內和結構外的函數)。
private
被設置爲private
權限的成員(包括數據成員和函數成員)稱爲類的私有成員,僅供結構(類)的內部(自身成員函數)訪問。
protected
protected
與繼承有關。供結構(類)的內部及後代(派生類)訪問。
在C和C++中,若是沒有聲明訪問權限,默認的訪問權限是public
。若是不想讓外部直接訪問須要加個private
聲明爲私有類型。C++結構的定義形式:
struct 類名{ [public:] 成員; private: 成員; protected: 成員; };
類(class)具備信息隱藏的能力,可以完成接口與實現的分離,用於把數據抽象的結果封裝成能夠用於程序設計的抽象數據類型。是面向對象程序設計中通用的數據封裝工具。在C++中,class
具備與struct
徹底相同的功能,用法一致。類是默認private
。
類也是一種自定義數據類型,用關鍵字class
表示,用法與struct
相同,形式以下:
class 類名{ [private:] 成員; public: 成員; protected: 成員; };
類名一般首字符大寫的標識符表示 ;一對花括號界定了類的範圍;最後的分號必不可少,表示類聲明結束。
舉個例子:
class Complex { private: double real,imag; public: void init(double r,double i){ real = r; imag = i; } double getReal(){return real;} double getImag(){return imag;} void print(){ cout <<c.getReal() <<"+" <<c.getImag() <<"i" <<endl; } };
對於類定義須要注意的問題:
訪問說明符
對於類聲明中的訪問說明符private
、public
和protected
沒有前後主次之分,也沒有使用次數的限制。只是出於信息隱藏的目的,將數據成員設置爲private
權限,將須要讓外部函數訪問的成員設置爲public
權限。
類做用域
class
或struct
後面的一對花括號包圍的區域是一種獨立的做用域,稱爲類域。類域內的數據和函數都稱爲成員(數據稱爲數據成員,函數常被稱爲成員函數)。同一類域內的成員是不愛訪問權限和前後次序的限制,相互間能夠直接訪問。
關鍵字struct和class
C++的struct
也是一種類,它與class
具備相同的功能,用法也是徹底相同。惟一區別是在沒有指定成員的訪問權限時,默認的權限是不同的。
類是對客觀世界中同類事物的抽象,它給出了屬於該類事物共有的屬性(數據成員)和操做(成員函數)。
類具備封裝特性。
抽象是對具體對象(問題)進行歸納,抓住問題的本質,抽出這一類對象共有的性質,並加以描述的過程,抽象主要包括數據抽象和過程抽象。
抽象與封裝的區別:抽象是一種思惟方式,而封裝是一種基於抽象性的操做方法。通常經過抽象,把所獲得的數據信息以封裝的技術將其從新整合,造成一個新的有機體,這就是類。
類的數據成員能夠是任何數據類型,如整型、浮點型、字符型、數組、指針和引用等,也能夠是另一個類的對象或指向對象的指針,還能夠是自身類的指針或引用,但不能是自身類的對象;能夠是const
常量,但不能是constexpr
常量;能夠用decltype
推斷類型,但不能使用auto
推斷類型;數據成員不能指定爲extern
的存儲類別。
C++支持在定義類的同時爲類的數據成員賦初始值,舉個例子:
class X{ private: int a = 2; int y = {3}; int b[3] = {1,2,3}; const int ci = a; public: ... }
注意:類的定義或聲明只是在程序中增長的自定義數據類型,是沒有分配相應的內存空間。只有在實例化時,纔會分配相應的空間,也纔會在這時初始化數據成員。
類的成員函數也稱爲方法或服務。它能夠在類內定義,也能夠在類外定義;能夠重載,也可使用默認實參。
成員函數的定義
類的成員函數有兩種定義方式:
聲明類時就給出成員函數的定義。
class Complex { private: double real,imag; public: void init(double r,double i){ real = r; imag = i; } double getReal(){return real;} double getImag(){return imag;} };
在聲明類時,只聲明成員函數的原型,而後在外部定義成員函數。類外定義函數格式
返回類型 類名::成員函數名(參數列表);
其中,::
是做用域運算符,用於說明這裏定義的函數是指定類中的一個成員函數。
class Complex { private: double real,imag; public: void init(double r,double i); double getReal(); double getImag(); }; void Complex::init(double r,double i){ real = r; imag = i; } void Complex::getReal(){ return real; } void Complex::getImag(){ return imag; }
const(常量)成員函數
爲了禁止成員函數修改數據成員的值,能夠將它設置爲const
(常量)成員函數。設置的方法是在成員函數形參列表的後面加上關鍵字const
,格式以下:
class X{ T f(T1,T2,...) const; };
說明:T
是函數返回類型,f
是函數名,T1
,T2
是各參加的類型。將成員函數設置爲const
類型後,代表該成員函數不會修改任何成員的值。
注意:只有類的成員函數才能指定爲常量,通常的函數是一能的。const
成員函數與const
參數是不一樣的。
成員函數的重載與默認實參
類的函數是能夠重載,也能夠指定默認實參。
在外定義的函數,只能在聲明時或類外定義成員函數時才能指定默認實參,但不能在聲明和定義中同時指定。
嵌套類型是在類中定義的類、枚舉、使用typedef
聲明爲成員的任意類型以及使用using聲明的類型別名。
嵌套類
class X{ ... class Y{ //Y是在X類定義的嵌套類 ... } };
class X{ ... public: class Y; //Y是X的嵌套類,定義在外層類以外 }; class X::Y{ //Y是在X類外定義的嵌套類 ... }
類型別名
在類內部可使用typedef
和using
聲明類型別名。
typedef T alias; using alias = T;
經過class定義的類型稱爲類類型,由類類型定義的變量稱爲對象。
不一樣類類型的對象不能進行自動相互轉換,即便兩個類具備徹底相同的成員列表,它們也是不一樣類型,是不能進行自動類型轉換。
能夠直接把類名做爲類型的名字來用,從而直接指向類類型。也能夠把類名跟關鍵字後面來使用。
Complex c; //默認初始化Complex類型的對象 class Complex c; //等價聲明
類的聲明和定義是能夠分開的,能夠先聲明類,而暫時不定義它。
class C; //C類的聲明
類是對同類事物的一種抽象,這類事物中具體的一個實例就把它看做一個對象。類和對象的關係就是數據類型和變量的關係。
對象的定義
用類定義對象的形式以下:
類類型名 對象名;
類類型是一種自定義類類型,能夠定義類型的變量,也能夠定義類類型的指針和引用。
Clock* p = &cl1; //定義Clock類的指針p指向對象cl1 Clock& r = cl2; //定義Clock類的引用r指向對象cl2
對象對成員的訪問
類中成員之間能夠相互訪問,不受訪問說明符的限制,能夠直接使用成員名。類外使用只能使用「對象名.成員名」訪問具備public訪問說明符的成員。對象引用方法與結構類似,必須用成員運算符「.」做爲對象名和對象成員之間的間隔符,格式以下:
對象名.數據成員名 對象名.成員函數名(實參列表) clk1.setHour(12); clk1.print();
說明:類外只能訪問對象的公有成員,不能訪問對象的私有和受保護成員;若是定義的對象指針,在經過指針訪問對象成員時,要用成員運算符「->」做爲指針對象和對象成員之間的間隔符。
對象間的賦值
不一樣類類型的對象之間不能互相賦值。同類的不一樣對象之間,以及同類的指針之間能夠相互賦值。
對象名1 = 對象名2;
說明:進行賦值兩個對象類型必須相同;進行數據成員的值複製,賦值以後,兩不相干。