歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++基本語法筆記

C++基本語法筆記

日期:2017/3/1 9:33:18   编辑:Linux編程

第七章
函數在調用前要先聲明。
new和delete可以用來分配內存和釋放。雖然malloc和free也保留了,但不推薦使用。
delete運算符使用的一般格式為delete [] 指針變量
有時需要使幾種不同類型的變量存放到同一段內存單元中,應使用union。聲明的一般形式為:
union 類型名{ 成員表列};
枚舉類型:enum weekday{sun,mon,tue,....}
聲明了枚舉類型之後,可以用它來定義變量。如 weekday workday, week_end;
typedef int INTEGER;
typedef float REAL;
第八章
如果在類的定義中既不指定private,也不指定public,則系統就默認為是私有的。
歸納以上對類類型的聲明,可得到其一般形式如下:
class
類名
{
private:
私有的數據和成員函數
public:
公用的數據和成員函數
};
為了減少時間開銷,如果在類體中定義的成員函數中不包括循環等控制結構,C++會自動把它們作為內置函數處理。
只有在類外定義的成員函數規模很小而調用頻率較高時,才將此成員函數指定為內置函數。
此每個對象所占用的存儲空間只是該對象的數據部分所占用的存儲空間,而不包括函數代碼所占用的存儲空間。
在頭文件中包含了類的聲明,因此在程序中就可以用該類來定義對象。由於在類體中包含了對成員函數的聲明,在程序中就可以調用這些對象的公用成員函數。為了實現上一節所敘述的信息隱蔽,對類成員函數的定義一般不放在頭文件中,而另外放在一個文件中。
請注意:student.h放在用戶當前目錄中,因此在文件名兩側用雙撇號包起來″student.h″而不用尖括號


<student.h>
否則編譯時會找不到此文件
庫包括兩個組成部分: 類聲明頭文件;已經過編譯的成員函數的定義,它是目標文件戶只需把類庫裝入到自己的計算機系統中(一般裝到C++ 編譯系統所在的子目錄下),並在程序中用include命令行將有關的類聲明的頭文件包含到程序中,就可以使用這些類和其中的成員函數,順利地運行程序。

第九章

構造函數:略
也可采用以下形式:
Box::Box(int h, int w, int len):height(h),width(w),length(len){}
Box(int h=10,int w=10,int len=10); //在聲明構造函數時指定默認參數
析構函數:~
析構函數的作用並不是刪除對象,而是在撤銷對象占用的內存之前完成一些清理工作,使這部分內存可以被程序分配給新對象使用。
際上,析構函數的作用並不僅限於釋放資源方面,它還可以被用來執行用戶希望在最後一次使用對象之後所執行的

任何操作
果在函數中定義靜態局部對象,則只在程序第一次調用此函數建立對象時調用構造函數一次,在調用結束時對象並不釋放,因此也不調用析構函數,只在main函數結束或調用exit函數結束程序時,才調用析構函數。
果構造函數只有一個參數,在定義數組時可以直接在等號後面的花括號內提供實參。
tudent Stud[3]={ //定義對象數組
Student(1001,18,87), //調用第1個元素的構造函數,為它提供3個實參
Student(1002,19,76), //調用第2個元素的構造函數,為它提供3個實參
Student(1003,18,72) //調用第3個元素的構造函數,為它提供3個實參
}
定義指向成員函數的指針變量應該采用下面的形式:
void (Time:: *p2)();
可以讓它指向一個公用成員函數,只需把公用成員函數的入口地址賦給一個指向公用成員函數的指針變量即可。
p2=&Time∷get_time;
定義常對象的一般形式為
const 類名 對象名(實參表列);
也可以把const寫在最左面
mutable int count;
如果將成員函數聲明為常成員函數,則只能引用本類中的數據成員,而不能修改它們,例如只用於輸出數據等
void get_time( ) const; //注意const的位置在函數名和括號之後
如果已定義了一個常對象,只能調用其中的const成員函數,而不能調用非const成員函數指向對象的常指針(指針值始終為初值,不能改變指向)的一般形式為類名 *const 指針變量名;
指向常對象的指針變量:
const 類名 *變量名
const Time &t1=t;對象的常引用,不能改變所指位置的值在執行運算符時,在釋放內存空間之前,自動調用析構函數,完成有關善後清理工作。
象之間的賦值也是通過賦值運算符“=”進行的對象的賦值只對其中的數據成員賦值,而不對成員函數賦值類的數據成員中不能包括動態分配的數據,否則在賦值時可能出現嚴重後果
對象的復制:Box box2(box1);
如果用戶自己未定義復制構造函數,則編譯系統會自動提供一個默認的復制構造函數,其作用只是簡單地復制類中每個數據成員。
C++還提供另一種方便用戶的復制形式,用賦值號代替括號,如Box box2=box1;
復制構造函數的形式是這樣的:
Box::Box(const Box &b){
height=b.height;
width=b.width;
...}
靜態數據成員可以被初始化,但只能在類體外進行初始化。
靜態數據成員既可以通過對象名引用,也可以通過類名來引用。
靜態成員函數可以通過類調用,也可以通過對象名調用,例如
Box::volume();
a.volume();
靜態成員函數沒有this指針,不能訪問本類中的非靜態成員。
靜態成員函數可以直接引用本類中的靜態數據成員,如果一定要引用本類的非靜態成員,應該加對象名和成員運算符"."
類體中用friend對其進行聲明,此函數就稱為本類的友元函數。友元函數可以訪問這個類中的私有成員。
A在B類的定義體中用以下語句聲明類為其友元類:
friend B;
友元類關系不傳遞,在工作中一般不使用。
有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同,此時可以聲明一個通用的類模板:
template<class 類型參數名>
實際使用時,在尖括號內指定實際的類型名:Compare<int>,此時Compare中的numtype都被替換成int
在類外定義類成員函數時,需要使用如下形式:
numtype Compare<numtype>::max(){......}
第十章 運算符重載

第十一章 繼承與派生
派生類的聲明方式:class Student1: public Student{...}
公用繼承:基類的公用成員和保護成員在派生類中保持原有訪問屬性,其私有成員仍為基類私有。
私有繼承:基類的公用成員和保護成員在派生類中成了私有成員。其私有成員仍為基類私有。
protected繼承:基類的公用成員和保護成員在派生類中成了保護成員,其私有成員仍為基類私有。
派生類構造函數的一般形式為:
派生類構造函數名(總參數表列):基類構造函數名(參數表列)
Student1(int n, string nam, char s, int a, string ad):Student(n, nam, s){
age=a;
addr=ad;
}
也可包含內嵌對象:
派生類構造函數名(總參數表列):基類構造函數名(參數表列),子對象名(參數表列),例如:
student(int n, string nam, int n1, string nam1, int ad, string ad):Student(n, nam), monitor(n1, nam1)
派生時,派生類是不能繼承基類的析構函數的,也需要通過派生類的析構函數去調用基類的析構函數。在派生類中

可以根據需要定義自己的析構函數,用來對派生類中所增加的成員進行清理工作。
多重繼承:class D: public A, private B, protected C
派生類構造函數名(總參數表列):基類1構造函數(參數表列),基類2構造函數(參數表列){...}
多重繼承引起的二義性問題:兩個基類有同名成員、兩個基類和派生類三者都有同名成員。
規則:基類的同名成員在派生類中被屏蔽。
虛基類:在繼承間接共同基類時只保留一份成員(需要在所有直接派生類中聲明虛基類)。
class B: virtual public A{...}
class C: virtual public A{...}
在最後的派生類中不僅要對直接基類進行初始化,也要對虛基類初始化。
派生類對象可以替代基類對基類對象的引用進行賦值或初始化。
第十二章
靜態多態性在編譯時決定調用哪個函數,動態多態性在運行時。靜態多態性通過函數重載和運算符重載實現,動態多態性通過虛函數實現。
虛函數:用同一個調用形式,既能調用派生類又能調用基類的同名函數。在程序中不是通過不同的對象名去調用不同派生層次中的同名函數,而是通過指針調用它們。
虛函數聲明:virtual void play();
當一個成員函數被聲明為虛函數後,其派生類中的同名函數都自動成為虛函數。
在派生類中重新定義此函數,要求函數名、函數類型、函數參數個數和類型全部與基類的虛函數相同。
通過虛函數與指向基類對象的指針變量的配合使用,就能方便地調用同一類族中不同類的同名函數,只要先用基類指針指向即可。
確定調用的具體對象的過程稱為關聯(binding)。
一個成員函數被聲明為虛函數後,在同一類族中的類就不能再定義一個非virtual的但與該虛函數具有相同的參數(包括個數和類型)和函數返回值類型的同名函數。當基類的析構函數為虛函數時,無論指針指的是同一類族中的哪一個類對象,系統會采用動態關聯,調用相應的析構函數,對該對象進行清理工作。
virtual float area( ) const =0;//純虛函數
純虛函數沒有函數體,只是通知編譯系統:在這裡聲明一個虛函數,留待派生類中定義。
凡是包含純虛函數的類都是抽象類。

Copyright © Linux教程網 All Rights Reserved