freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

c程序設計實踐教程(下)ppt(編輯修改稿)

2024-11-13 00:26 本頁面
 

【文章內容簡介】 }。 單參數 構造函數 void main( ) { Money m1(25,5,7),m2()。 ( )。 ( )。 Money m3=。 ( )。 m3= 。 ( )。 } 隱式類型轉換:調用單參數構造函數,創(chuàng)建 Money類型的臨時對象。 并不做隱式類型轉換,等價于: Money m3()。 拷貝構造函數 ? 拷貝構造函數:特殊的構造函數,其形參是本類的對象的引用,其作用是使用一個已經存在的對象 (由拷貝構造函數的參數指定的對象 )去初始化一個新的同類的對象。 ? 定義一個拷貝構造函數的一般形式為: ClassName::ClassName(ClassName amp。c) { ... } //函數體完成對應數據成員的賦值 ? 例 使用完成拷貝功能的構造函數。 include include class Point{ int x,y。 public: Point(int a=0,int b=0){ x=a。y=b。 } Point(Pointamp。 t) //拷貝構造函數 { x=。 y=。 cout調用了拷貝構造函數 !\n。 } int GetX( ){ return x。 } int GetY( ){ return y。 } void Show( ){ coutx=x,y=y39。\n39。 } }。 double Distance(Point p1,Point p2) { int dx=()()。 int dy=()()。 return sqrt(dx*dx+dy*dy)。 } Point Mid(Pointamp。 p1,Pointamp。 p2) { int x=(()+())/2。 int y=(()+())/2。 return Point(x,y)。 } void main( ) { Point p0,p1(8,15)。 Point p2(p1)。//調用拷貝構造函數 Point p3=p1。 //等價: Point p3(p1)。 ()。 ()。 ()。 p3=Mid(p0,p3)。 coutDistance(p0,p3)endl。 } ? 函數Distance(Point,Point)的形參為類的對象,當執(zhí)行函數調用 distance(p0,p3)時,實參初始化形參,兩次調用拷貝構造函數,分別用實參對象 p0和 p3初始化形參對象 p1和 p2。 ? 若函數形參是對象的引用,則調用該函數時,不調用拷貝構造函數,如本例的Mid函數所示。 ?結果 (VC6 with sp6): 調用了拷貝構造函數 ! 調用了拷貝構造函數 ! x=8,y=15 x=8,y=15 x=8,y=15 調用了拷貝構造函數 ! 調用了拷貝構造函數 ! ? 默認拷貝構造函數: – 若定義類時未顯式定義該類的拷貝構造函數,則編譯系統(tǒng)會在編譯該類時自動生成一個默認拷貝構造函數。 – 默認拷貝構造函數的功能是把一個已經存在的對象的每個數據成員的值逐個復制到新建立對象對應的數據成員中。 – 例 Point的拷貝構造函數與默認的拷貝構造函數功能一樣,不必顯式定義。 – 何時顯式定義拷貝構造函數? 若類中包含指向動態(tài)內存的指針時,用默認的拷貝構造函數初始化對象,將帶來嚴重問題,如例 。 ? 例 默認拷貝的構造函數。 include include class String{ char *p。 public: String(char*c=0) { if(c) { p=new char[strlen(c)+1]。 strcpy(p,c)。} else p=NULL。 } ~String( ){ delete []p。 } void Show( ){ coutstring=p39。\n39。 } }。 void main( ) { String s1(student)。 String s2(s1)。//A ( )。 ( )。 } s1 堆內存 s2 – 執(zhí)行 A行語句:調用默認拷貝構造函數,用 s1對象初始化 s2對象,使 s2對象的成員指針 p與 s1對象的成員指針 p指向同一片內存。 – 主函數結束:先撤消 s2, s2對象釋放其所指動態(tài)內存;其后撤銷 s1對象,但因s1對象所指動態(tài)內存已被 s2對象釋放,造成重復釋放同一塊動態(tài)內存,出現運行錯誤。 – 定義拷貝構造函數,避免上述錯誤: String(Stringamp。s) { if(){ p=new char[strlen()+1]。 strcpy(p,)。 }else p=0。 } s t u d e n \0 t 對象成員與構造函數 ? 對象成員:一個類的對象可做另一個類的數據成員。 ? 例如: class Date{ int year,month,day。 public: Date(int y,int m,int d){ year=y。month=m。day=d。 } }。 class Person{ char name[12]。 char sex[4]。 Date birthday。 //對象成員 public: Person(char*, char*,int,int,int)。 … }。 ? 對象成員的初始化 –通過初始化表進行,如: Person::Person(char*n,char*s,int y,int m,int d) :birthday(y,m,d) { strcpy(name,n)。 strcpy(sex,s)。 } –若未在初始化表中初始化對象成員,則系統(tǒng)自動調用該對象成員的缺省的構造函數來初始化。 – 若類中包含對象成員,則在創(chuàng)建該類的對象時,先調用對象成員的構造函數,初始化相應的對象成員,后執(zhí)行該類的構造函數,初始化該類的其他成員。 – 如果一個類包含多個對象成員,對象成員的構造函數的調用順序由它們在該類中的說明順序決定,而與它們在初始化表中的順序無關。 ? 例 初始化對象成員。 include class Point{ int x,y。 public: Point(int a,int b) { x=a。 y=b。 coutConstructor of class Point is called.\n。 } void Show( ) { coutx=x,y=yendl。 } }。 class Rectangle{ Point p。 int length,width。 public: Rectangle(int l,int w,int a,int b):p(a,b) { length=l。 width=w。 coutConstructor of class Rectangle is called.\n。 } void Show( ) { ( )。 coutlength=length,width=widthendl。 } }。 void main( ){ Rectangle r(5,4,45,55)。 ( )。 } 程序運行結果: Constructor of class Point is called. Constructor of class Rectangle is called. x=45,y=55 length=5,width=4 友元 ? 有時需要在對象外部頻繁訪問對象私有的或保護的數據成員,若通過調用公有成員函數間接訪問,由于參數傳遞、類型檢查等都需占用時間,必然降低程序的運行效率。 ? 使用友元可在對象外部直接訪問對象私有的和保護的數據成員。 ? 友元以類的封裝性的有限破壞為代價來提高程序的運行效率,應謹慎使用。 ? 友元分為:友元函數和友元類。 友元函數 ? 友元函數的說明格式: friend type FuncName(args)。 ? 例 用友元函數的方法計算兩點距離。 include include class Point{ int x,y。 public: Point(int i=0,int j=0){ x=i。y=j。 } int GetX( ){ return x。 } int GetY( ){ return y。 } friend double distance(Pointamp。,Pointamp。)。 }。 普通函數 distance( )聲明為 Point類的友元函數。 double distance(Pointamp。 p1,Pointamp。 p2) { int dx=,dy=。 return sqrt(dx*dx+dy*dy)。 } void main( ) { Point a(8,15),b(3,7)。 coutThe distance is:distance(a,b)endl。 } 程序運行結果: The distance is: 友元函數 distance( )可通過對象名直接訪問 Point類的對象 p1和 p2的私有數據成員 x和 y,提高了程序的效率。 ? 友元函數說明: – 友元函數應在類中說明,可放在類的私有、公有或保護部分,效果一樣。友元函數體可在類內或類外定義。 – 友元函數不是類的成員,不帶 this指針,因此必須將對象名或對象的引用作為友元函數的參數,并在函數體中用運算符 “ .”來訪問對象的成員。如上例中的 。 – 友元函數可直接訪問相關類中的所有成員。 – 一個類的成員函數也可作為另一個類的友元函數,例如: class A{ … int f(… )。 }。 class B{ … //成員定義 friend int A::f(… )。//聲明類 A的成員函數 f( ) }。 // 是類 B的友元 在聲明這個友元函數時需要在函數名前面加上它的類名和作用域運算符 “ ::”。 友元類 ? 若聲明 A類為 B類的友元,則 A類的所有成員函數都成為 B類的友元函數。有時友元類的使用也是必要的選擇。 ? 例 友元類。 include include class Date{ int year,month,day。 public: Date(int y=0,int m=0,int d=0){ year=y。month=m。day=d。} void display(){ coutyearmonthday。 } friend class Person。 }。 class Person{ char name[12]。 char sex[4]。 Date birthday。 public: Person(char*n,int y,int m,int d,char*s) { strcpy(name,n)。 strcpy(sex,s)。 =y。 =m。 =d。 } void display( ) { coutname:name,sex:sex。 cout,birthday:39。.? 39。.39。endl。 } }。 void main( ) { Person p(“張三 ” ,1983,8,20,”男 ” )。 ( )。 } 程序運行結果: name:張三 ,sex:男 ,birthday: 因 Person類為 Date類的友元,在 Person類的成員函數可直接操作 Date類的對象 birthday的數據成員。 ? 友元的其它注意事項: – 友元關系沒有傳遞性。例如,說明類 A是類 B的友元,類 B是類 C的友元時,類 A并不一定是類 C的友元。 – 友元關系不具有交換性,即說明類 A為類 B的友元時,類
點擊復制文檔內容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1