c++面向對象復習
c++考試主要是選擇題和判斷題考基本概念,然后是上機編程,所以我總結了做過的選擇判斷題的一些概念和一些基本代碼。
此篇博客主要涉及類與對象,繼承,友元,運算符重載,多態等知識點。
<1>常考基本概念
1. 類是創建對象的樣板
2. 類是抽象數據類型的實現
3. 類是具有共同行為的若干對象的統一描述
4. 面向對象系統所包含的要素:繼承,類,對象
5. 面向對象程序設計將數據與對數據的操作放在一起,作為相互依存、不可分割的整體來處理
6. 面向對象的封裝性是一種信息隱藏技術,目的在於將於對象的使用者和設計者分開,使用者不必知道對象行為實現的細節,只需設計者提供的協議命令對象支做即可
7. 操作是對象的動態屬性
8. 對象間的通信靠信息傳遞
9. 對象是屬性和方法的分裝體
10. 在面向對象中一個對象請求另一個對象為其服務的方式是發送消息
11. 類和對象的關系是一種數據類型與變量的關系
12. 類是對某一類對象的抽象
13. 對象是類的具體實例
14. 自身類的對象不能作為該類的成員
15. 在c++語言中,也可以使用struct(結構體)來定義一個類
16. 成員函數可以是靜態的,成員函數可以設置參數的默認值,成員函數可以重載,但是,成員函數不一定是內聯函數
17. 友元函數不是類的成員函數
18. 可以在類外引用對象的公有數據成員,而且還可以調用對象的公用成員函數,但必須指出對象名
19. 當所有類都是私有的,在一個類中至少有一個公有的成員函數,作為對外接口,否則就無法對對象進行任何操作
20. 如果為一個對象定義了一個引用變量,它們是共占同一段存儲單元的,實際上它們是同一個對象不同的名字
21. 訪問對象的三種方法:通過對象名和成員運算符訪問對象中的成員,通過指向對象的指針訪問對象中的成員,通過對象的引用變量訪問對象中的成員
22. 公用成員函數時用戶使用類的對外接口
23. 類中被操作的數據時私有的,實現的細節對用戶是隱蔽的,這種實現稱為私有實現
24. 類的作用是把數據和算法封裝在用戶的抽象數據類型中
25. 在類中如果不做特別說明,所有的成員函數均為公有類型
26. 類是一種用戶自定義的類據類型
27. 只有類中的成員函數,才能存取類中的私有類型
28. 具有轉換函數功能的構造函數是帶有一個參數的構造函數
29. 構造函數不具備的特征是構造函數需要指定類型說明
30. 析構函數沒有參數沒有返回值,一個類中只能定義一個析構函數、
31. 最先被調用的構造函數,其對應的(同一對象中的)析構函數最后被調用,而最后被調用的構造函數,其對應的析構函數最先被調用
32. 如果定義的是局部自動對象(例如在函數中定義的對象),則在建立對象時調用其構造函數
33. 在全局范圍中定義的對象(即在所以函數之外定義的對象),它的構造函數在文件中的所有函數(包括main函數)執行之前調用
34. 如果在函數中定義靜態(static)局部對象,則只在程序第一次調用此函數建立對象時調用構造函數一次
35. 由對象組成的數組稱為對象數組
36. 在建立數組時,要調用構造函數,如果有50個元素,就需要調用40次構造函數
37. 對象有地址,存放對象初始地址的指針變量就是指向對象的指針變量
38. 對象中的成員也有地址,存放對象成員地址的指針變量就是指向對象成員的指針變量
39. 對象空間的起始地址是對象指針
40. 一旦生成一個對象,該對象的this指針就指向該對象本身
41. 在類的非靜態函數中this指針指向調用該函數的對象
42. 在建立對象時,編譯系統會為每一個對象分配一定的存儲空間,以存放其成員
43. 如果已經定義了一個常對象,只能調用其中的const成員函數,不能調用非const函數
44. 只能通過構造函數的參數初始化表對常數據成員進行初始化
45. 關於new運算符:使用它創建對象時要調用構造函數;它可以用來創建對象和對象數組;使用它創建的對象或者對象數組,可以使用運算符delete刪除
46. 當對象時靜態時,在程序運行過程中,對象所占的空間是不能隨時釋放的
47. 默認情況下,new和malloc基本是等同的
48. 復制構造函數也是構造函數,但它只有一個參數,這個參數是本類的對象
49. 在c++語言中,如果不自定義類的拷貝構造函數,則每個類都有默認的拷貝構造函數
50. 靜態數據成員是所有對象所共有的
51. 友元本身並不是類的成員
52. 一個類的友元函數能夠訪問該類的所有成員
53. C++不允許將構造函數和析構函數聲明為友元函數
54. 友元的作用是提高程序的運行效率
55. 某類中的友元類的所有成員函數可以存取或者修改該類中的私有成員
56. 運算符重載不能夠改變語法結構
57. ?:和::不能夠重載
58. 將運算符重載為類的成員函數時,其參數表中沒有參數,說明該運算符是前綴一元運算符
59. 在成員函數中進行雙目運算符重載時,其參數表中應該帶有1個參數
60. 派生類是基類的具體化,而基類則是派生類的抽象
61. 構造函數和析構函數是不能從基類繼承的
62. 在私有繼承中,基類中所有成員對派生類的對象都是不可見的
63. 如果派生類沒有實現基類的一個純虛函數,則該派生類是一個抽象類
64. 對基類成員的初始化必須在派生類構造函數中的參數初始化表處進行
65. 派生類對象可以向基類對象賦值
66. 如果函數的參數是基類對象或基類對象的引用,相應的實參可以用子類對象
67. C++支持兩種多態性,分別是編譯時和運行
<2>常考/基本代碼
1.對象數組
定義一個一維數組的格式:
類名 數組名[下標表達式]
數組名[下標].成員名
例:
int mian(){ int i; float x; Circle A[2]; x.A[1].area(2); cout<<"圓1的面積:"<<x<<endl; Circle A[2]; x.A[1].area(2); cout<<"圓2的面積:"<<x<<endl; }
2.拷貝構造函數
例:
類中: private: int length,width,heigth; public: Block(Block & p){ length=p.length; width=p.width; height=p.height; cout<<"拷貝構造函數被調用"<<endl; } 類外: Block ::Block(Block & p)
{ length=p.length; width=p.width; height=p.height; cout<<"拷貝構造函數被調用"<<endl; }
3.new 和delete 的使用
new/delete 是c++中的運算符,類似於malloc/free,程序運行得開辟內存空間(堆)
new 可以為內置類型的變量開辟空間,數組變量,類的對象開辟空間。這是在堆上開辟內存,返回一個指向該內存空間的地址。
//類對象開辟內存 class Crectangle{ ... void setvalue(int a,int,b){ ... } } int main{ ... Crectangle *Ptr=new Crectangle(); Ptr->setvalue(l,w); delete Ptr; return 0; }
4.const的使用
//修飾函數 void Print() const{...} //修飾成函數參數 void getx(const int x){...} //修飾函數返回值 const int *a=malloca(); //修飾成員變量 const int a1=a2;
//修飾指針變量 //const修飾指針指向的內容,則內容為不可變量 const int *a=1; //const修飾指針,則指針為不可變量 int a=8; int * const p=&a; *p=9; //const修飾指針和指針指向的內容,則指針和指針指向的內容都是不可變量 int a=8; const int* const p=&a;
5.數組的輸入
//主函數定義數組與初始化 int a[5],i; ArrayDate X; cout<<"input data"<<endl; for(i=0;i<5;i++){ cin>>a[i]; } X.setdata(a,5); //類的成員函數 void setdata(int ar[],int m){ int i; count=m; arr=new int[count]; for(i=0;i<count;i++){ arr[i]=ar[i]; } }
6.
7.動態分配內存,為數組字符串賦值的方法
private: char* msg; public: Base(){ msg=NULL; } void setvalue(char* str){ msg=new char[strlen(str)]; strcpy(msg,str); cout<<"Base:"<<msg<<endl; } ~Base(){ if(msg!=NULL){ delete[] msg; } }
8.多繼承派生類構造函數的初始化;在派生類中通過基類的成員函數為基類的私有成員賦值
class A{ private: int a; ... } class B{ private: int b; ... void setB(int m){ b=m; } } class C:public A,public B{ private: int c; public: C(int a,int b,int c1):A(a),B(b){ c=c1; } void setC(int x,int y){ c=x; setB(y); } }
9.
(1) 如果是數組則用strcmp,如果是string,則直接用等於號
(2) 非成員函數需要用友元函數
Strcmp()如果兩個數相等,則返回0,所以,if(非0),則不相等,返回false
例:設某個類中有name,id兩個成員,比較如果兩個對象的id,判斷是否id相同
bool operator ==(people &a){ if(strcmp(a.id,id)) return false; else return true; }
bool operator ==(people & a){ if(a.id==id) return true; else return false; }
10.單元運算符++的重載
class Point{ private: int x,y; public: Point(){} Point(int a=0,int y=0){ x=a; y=b; } Point& operator ++();//前綴形式 Point operator ++(int);//后綴形式 }; Point& Point::operator ++(){ ++x; ++y; return *this; } Point Point::operator ++(int c){ Point temp=*this; ++x; ++y; return temp; }
11.基類與派生類有同名函數時 ,如何在派生類中調用基類的同名函數
class A{ ... void show(){ cout<<"基類A="<<a<<endl; } }; class C{ ... void show(){ cout<<"派生類C="<<c<<endl; } void showC(){ A::show(); cout<<"派生類C="<<c<<endl; } };
12.基類定義一個指針*a,派生類定義一個對象b,基類定義&c是b的引用名,指針指向b的引用名,即&c,即可用指針調用派生類與基類的同名函數(這種調用方式的基類在定義同名函數時,必須加virtual)
Base *pb,*pa,ta(a); Triangle tr(2,2,4); Base &ya=tr; pa=&tr; pa->area();
13.