程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 『21天精通C++』第三周學習筆記(3-2)

『21天精通C++』第三周學習筆記(3-2)

編輯:C++入門知識

第十七天:

當一個類包含其他類時用合成。
當一個類是另一個類的擴展,它包含另一個類的一些屬性,另外又增加了一些屬性行為用繼承。

一個由其他對象合成的對象在它的所有成員對象初始化之前不能被初始化。
構造合成類本身之前應該首先用構造函數初始化表構造成員類。
提供構造整個合成類所需的所有參數,包括構造類中的每個成員類的所需參數。
不需調用成員類的析構函數。
不能訪問成員類的私有數據。要想訪問它們必須通過調用公有成員函數。

當一個類和另一個類只有個別成員函數或數據成員不同時使用繼承的方法。當一個類包含另一個或更多的類時使用合成。但合成類並不僅僅是其他類的功能擴展版本。對於繼承構造函數初始化表在建立對象時扮演了重要的角色,當構造一個合成類對象時,則必須肯定所有成員元件都已被構造了。
如果合成類或某個成員元件類包含指針成員,就必須編寫重載賦值函數。



第十八天:

  在大多數程序中不使用虛函數,就使用靜態聯編。除非使用了函數指針或是虛函數,否則C/VC++編譯器都采用靜態聯編方式。
  靜態聯編是指在編譯時而非運行時確定函數調用。此方法效率高。

  動態聯編是指在運行時才能確定函數調用。OOP中需要進行動態聯編的場合是使用一個指向類家族所有類的指針。只要這個指針指向基類,就能指向任何一個派生類,編譯器無法確定指針究竟指向哪個類,直到運行時才能確定。加入Virtual關鍵字是為了告訴編譯器等到運行時在確定哪個函數被調用。基類的還是派生類的函數。

  使用Virtual要求動態聯編時,VC++在函數調用處插入一個間接指針,不是指向函數首址,而是指向虛擬函數調用地址表(指向函數首址是直接指針)這個表叫做VTABLE(Virtual Table 虛擬表)。在運行時,對象指針觸發成員函數在虛擬表中的偏移量調用正確的函數。
  純虛函數不包括任何代碼,可以選擇給純虛函數賦0值,從而使編譯器不能讓用戶試圖實例化一個包含純虛函數的基類。

  任何包含一個或多個純虛函數的基類稱做抽象基類。不能實例化,成員函數是空的,但可以用它作為它的派生類層次的模式,這樣一個基類提供一個所有類家族中類的框架。抽象基類可以列出所有公用數據成員和成員函數,以便派生類繼承。

file://Filename: 1206.CPP
#include
#include
#include
#include
int dispMenu(void);
void addParts(void);
void prParts(void);
class inventoryItem{
char partCode[5];
char descrip[20];
int num;
float price;
public:
void addToInv(char P[],char D[],int N,float PR)
{
num=N;
price=PR;
strcpy(partCode,P);
strcpy(descrip,D);
this->toDisk();
}
void toDisk(void)
{
ofstream invOut;
invOut.open ("INV.DAT",ios::app);
invOut.write ((char *)this,sizeof(*this));
}
void getData(void);
};
void inventoryItem::getData (void)
{
ifstream invIn("INV.DAT");
while(invIn)
{
invIn.read((char *)this,sizeof(*this));
if(invIn.good())
{
cout< cout< cout<<" part code:"< cout<<"description:"< cout<<"Quantitly:"< cout<<"Price:"< }
}
}
main()
{
int menu;
do
{
menu=dispMenu();
switch(menu)
{
case 1:addParts();
break;
case 2:prParts();
break;
case 3:exit(1);
default:
cerr<<" * * * Enter 1,2or3 * * * ";
}
}while(menu!=3);
return 0;
}
int dispMenu(void)
{
int ans;
cout<<" 功能菜單: ";
cout<<"1.增加記錄 ";
cout<<"2.顯示記錄 ";
cout<<"3.退出 ";
cin>>ans;
return ans;
}
void addParts(void)
{
char pc[5];
char de[20];
int q;
float pr;
inventoryItem part;
cin.ignore ();
cout<<"名稱:";
cin.getline(pc,5);
cout<<"說明:";
cin.getline (de,20);
cout<<"數量:";
cin>>q;
cout<<"價格:";
cin>>pr;
part.addToInv (pc,de,q,pr);
}
void prParts(void)
{
inventoryItem part;
part.getData ();
}
 
  『21天精通C++』自學筆記到此就結束了,因是一年多以前的東西了所以不是很完整,當時學的時候只記得雖然書名是21天可雷神共讀了三遍用了半年的時間,自以為還沒有入門?好象明白了但又什麼也不能做,這是怎麼回事?雷神一個勁的 @#%$%$@!@@#~¥#。不過以我的性格既然開始了就不放棄,繼續學下去,我看的下一本書是『VC技術內幕』。我會把筆記補上有時間的話。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved