一、對象初始化
1.不能在類聲明中對數據成員初始化,因為類只是一個抽象類型,不占存儲空間,無處容納數據。
2.若某類的數據成員都是public,則可以像結構體一樣初始化,如
? ?Time t={12,21,04};
? ?若數據成員有private或protected則不能這樣初始化。
3.構造函數沒有返回值,不需要用戶調用,也無法被用戶調用。
4.帶參數的構造函數初始化格式:類名 對象名(實參1,實參2...)
5.構造函數的參數初始化列表格式:
類名::構造函數名(若干參數):初始化表{}
Student ::stu(x,y):stuNum(x),name(y){}
6.在類內聲明構造函數時就可以指定默認參數,如
Box(int h=10,int w=10,int l=10)或Box()
默認構造函數要么無參,要么指定全部參數,一個類只能有一個默認構造函數,若定義了全參默認構造函數,則不能再重載構造函數,應該在聲明構造函數時指定默認值,不能在定義時指定,若構造函數的全部參數都指定了默認值,則創建對象是可以給出任意個實參,也可以不給。
7.this指針指向對象,它的值是當前被調用的成員函數所在的對象的起始地址。
二、析構函數
1.用new動態創建對象,delete時會調用析構函數。析構函數只能有一個,用來執行“用戶希望在最后一次使用對象之后所執行的任何操作”。
2.先構造的對象后析構,相當于棧。
三、對象數組
1.若構造函數只有一個參數,則可進行如下定義:Student stu[3]={5,8,12},三個參數分別給三個構造函數;
2.若構造函數不止一個參數,則亦可用上述方式定義,其中三個參數分別稱為三個構造函數的第一個參數,但最好不要用上述方式來定義,因為會歧義(在vs2015中直接連編譯都沒通過)。應該用如下方式來定義:
Student stu[3]={Student(1,2,3),Student(11,12,13),Student(21,22,23)};
四、對象指針
1.指向普通函數的指針:
假設現有一函數
int haha(int i,char c)
{
? ? //xxxxxxx
}
要通過指針來調用該函數,則先聲明指針:
int (*p)(int i, char c);
再讓指針指向函數:
p = haha或者p = &haha也行;
即可通過指針調用函數了,如:
(*p)(1, 'w');
2.指向成員函數的指針:
與普通指針函數相比,聲明指針要加上類限制:int(Student::*p)(int i, char c);
定義指針也得加上類限制:p = &Student::haha,而且&不可省略。
用指針調用函數時必須通過對象:(stu.*p)(1, 'w');
五、共用數據保護
1.常對象:Time const t(1,2,3);或const?Time t(1,2,3);定義時必須初始化,然后數據成員無法被修改。常對象只能調用常成員函數。
2.常成員函數:函數聲明時最后要加上const,如:void haha()const;
常成員函數可以訪問對象中數據成員,但不能修改。
3.若一定要修改常對象的某個數據成員,應該用關鍵字mutable,如:mutable int count;也只能通過常成員函數來修改。
4.常數據成員:只能通過構造函數的參數初始化表來初始化,并不能被更改。
六、對象動態建立、釋放
1.一般的對象空間都不能隨時釋放,比如Student stu這樣的,只能是在函數調用結束之類的時候被動釋放。
2.new、delete就可以隨時開辟、撤銷空間,所以稱為動態的。
七、靜態成員
1.靜態數據成員:是一個類的成員而不是某個對象的成員,一個類的所有對象都可以引用這個成員,是共用的,值都是一樣的,如果改變值,則對所有對象來說這個值都會變,這樣比較節省空間。即使不定義對象,也可以引用類的靜態數據成員(用類名),也可以通過對象引用。不能用構造函數來初始化,只能在類外初始化。
如,static int a;
2.靜態成員函數:性質和靜態數據成員一樣。調用一個對象的普通成員函數后,會將該對象的首地址賦給this指針,但靜態成員函數沒有this指針,不能訪問非靜態數據成員,只能訪問靜態數據成員。如果指定了對象,其實也是可以訪問非靜態數據成員的,但是一般不建議這么用。
如static int add();
八、類模板
1.有時多個類的功能相同,僅僅是數據類型不同,為了省去重復工作的麻煩,就可以用模板類。類模板是類的抽象,類是類模板的實例。
2.成員函數定義在類定義內:
template <class haha>//haha為數據類型
class hehe//hehe不是類名,是類模板名
{
private:
? ? haha x;
? ? haha y;
public:
? ? hehe(haha a,haha b)
? ? {
? ? ? ? x=a;
? ? ? ? y=b;
? ? }
? ? haha max()
? ? {
? ? ? ? return (x>y)?x:y;
? ? }
}
使用時:hehe <int> hh(4,5);//此處int代替了上面的haha
3.成員函數定義在類定義外:則應該
template <class haha>//haha為數據類型
haha hehe<haha>::?max()
{
? ? return (x>y)?x:y;
}
九、其他特性
1.c++是基于過程和面向對象的混合型語言。基于過程的程序主要是面對函數,只要設計一個個函數就行了。面向對象的程序主要是類,函數基本都在類內,所以主要是設計類。
2.基于過程的程序=算法+數據結構;
面向對象的程序=對象+消息=算法+數據結構+消息
3.定義類時一般先public后private。
4.c++也可以用struct關鍵字來定義類,與class唯一的區別就是struct默認為private。不推薦用struct。
5.在類定義內定義的成員函數,若不包括循環等結構,c++系統會自動將其作為inline函數。類外定義的成員函數就沒有這個待遇了,必須要寫上inline關鍵字才能成為內聯函數。
6.函數的聲明和定義只要有一個inline關鍵字就夠了。
7.sizeof一個類時,返回值是這個類中數據成員的大小,跟成員函數無關,若沒有數據成員則返回1。
8.一個類至少有一個public成員函數,負責就沒有對外的接口,無法對對象進行操作。