




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章類與對象P216
?類(Class)是面向?qū)ο蟪绦蛟O(shè)計(OOP)
實現(xiàn)信息封裝的基礎(chǔ)。
-類是用戶定義類型,也稱為類類型。
?每個類包含數(shù)據(jù)說明和一組操作數(shù)據(jù)或傳
遞消息的函數(shù)。
?類的實例稱為對象。
6.1類和對象的定義與訪問P216
?在面向?qū)ο蟪绦蛟O(shè)計中,類是程序基本單位。
-類是數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)的封裝。
?類的對象使用自己的方法完成對數(shù)據(jù)的操作。
-類可以隱藏數(shù)據(jù)和操作細節(jié),對象通過類接口
與外部通信。
例1?2用面向?qū)ο蠓椒ň幊?
求圓的周長和面積P4
圓類
數(shù)據(jù)成員
半徑
成員函數(shù)
置半徑值
求圓的半徑
求周長
求面積
〃例1-2輸入圓的半徑,求圓的周長和面積(用面向?qū)ο蠓椒ň幊?P4
#include<iostream>
usingnamespacestd;
classCircle
{private:
doubleradius;
public:
voidSet_Radius(doubler){radius=r;}
doubleGet_Radius(){returnradius;}
doubleGet_Girth(){return2*3.14f*radius;}
doubleGet_Area(){return3.14f*radius*radius;}
};"
intmain()
{CircleA,B;
A.Set_Radius(6.23);
cout?"A.Radius=H?A.Get_Radius()?endl;
cout?"A.Girth="?A.Get_Girth()?endl;
cout?"A.Area="?A.Get_Area()?endl;
B.Set_Radius(10.5);
cout?"B.radius="?B.Get_Radius()?endl;
cout?"B.Girths'1?B.Get_Girth()?endl;
cout?"B.Area=11?B.Get_Area()?endl;
return(O);
}
例1一2用面向?qū)ο蠓椒ň幊?,求圓的周長和面積
#include<iostream>
數(shù)據(jù)成員
usingnamespacestd
classCircle
{doubleradius;
public:
voidSet_Radius(doubler){radius=r;}
doubleGet_Radius(){returnradius;}
doubleGet_Girth(){return2*3.14*radius;}
doubleGet_Area(){return3.14*radius*radius;}
};
intmain()
{CircleA,B;
A.Set_Radius(6.23);
cout?"A.Radius="vvA.Get_Radius()?endl;
cout?"A.Girth="<vA.Get_Girth()?endl;
cout?"A.Area="?A.Get_Area()?endl;
B.Set_Radius(10.5);
cout?"B.radius="?B.Get_Radius()?endl;
cout?"B.Girth="?B.Get_Girth()?endl;
cout?"B.Area="?B.Get_Area()?endl;
例1一2用面向?qū)ο蠓椒ň幊?,求圓的周長和面積
#include<iostream>
usingnamespacestd;
classCircle成員函數(shù)
{doubleradius;
public:
voidSet_Radius(doubler){radius-r;}
doubleGet_Radius(){returnradius;}
doubleGet_Girth(){return2*3.14*radius;}
doubleGet_Area(){return3.14*radius*radius;}
};
intmain()
{CircleA,B;
A.Set_Radius(6.23);
cout?"A.Radius="?A.Get_Radius()?endl;
cout?"A.Girth="<vA.Get_Girth()?endl;
cout?"A.Area="?A.Get_Area()?endl;
B.Set_Radius(10.5);
cout?nB.radius="?B.Get_Radius()?endl;
cout?”B.Girth="wB.Get_Girth()?endl;
cout?"B.Area="?B.Get_Area()?endl;
例1一2用面向?qū)ο蠓椒ň幊?,求圓的周長和面積
#include<iostream>
usingnamespacestd;
classCircle
{doubleradius;
public:
voidSet_Radius(doubler){radius=r;}
doubleGet_Radius(){returnradius;}
doubleGet_Girth(){retuip2*3.14*radius;,
doubleGet_Area()Ld^turi建立對象is;}
L;main()(類類型變量)
{CircleA,B;
A.Set_Radius(6.23);
cout?"A.Radius="?A.Get_Radius()?endl;
cout?"A.Girth="<vA.Get_Girth()?endl;
cout?"A.Area="?A.Get_Area()?endl;
B.Set_Radius(10.5);
cout?nB.radius="?B.Get_Radius()?endl;
cout?”B.Girth="wB.Get_Girth()?endl;
cout?"B.Area="?B.Get_Area()?endl;
例1一2用面向?qū)ο蠓椒ň幊?,求圓的周長和面積
#include<iostream>
usingnamespacestd;
classCircle
{doubleradius;
public:
voidSet_Radius(doubler){radius=r;}
doubleGet_Radius(){returnradius;}通過對象
doubleGet_Girth(){return2*3.14*qdi;}調(diào)用類的成員函數(shù)
doubleGet_Area(){return3.14*radyls*radius-77
J,
intmain()
{CircleA,B;
A.Set_Radius(6.23);
cout?"A.Radius="?A.GetRadius()?endl;
cout?"A.Girth="?A.Get_Girth()?endl;
cout?"A.Area="v<A.Get_Area()?endl;
B.Set_Radius(10.5);
cout?"B.radius="?B.Get_Radius()?endl;
cout?"B.Girth="?B.Get_Girth()?endl;
cout?"B.Area="?B.Get_Area()?endl;
數(shù)組類型定義與排序操作P217
〃排序函數(shù)原型
voidSort(int[],int);
〃數(shù)組相加函數(shù)原型
voidAdd(int[],int[],int);
//
intmain()
{inta[10],b[10];
II.......
Sort(a,10);
Sort(b,10);
Add(a,b,10);
II.......
)
“數(shù)組類”類型P217
?設(shè)計一個“數(shù)組類”類型,把數(shù)組類型定
義和對數(shù)組排序操作封裝在一起。
?這樣“排序”就成了所有數(shù)組類對象自己
做的操作。
封裝classArray〃定義數(shù)組類
{int*ap;intlen;
數(shù)組與數(shù)組類
public:
〃排序函數(shù)原型Array(intsize)〃建立數(shù)組
voidSort(int[],int);{len=size;ap=newint[size];}
〃數(shù)組相加函數(shù)原型voidSort();//排序
voidAdd(int[],int[],int);〃重載算符中函數(shù)
Arrayoperaor+(constArray&other);
intmain());
{inta[10],b[10];
intmain()
{Arraya(10),b(10);〃聲明對象
Sort(a,10);
Sort(b,10);a.Sort();b.Sort();〃調(diào)用排序方法
Add(a,b,10);a=a+b;〃數(shù)組相加
封裝
classArray〃定義數(shù)組類
finf*ap;intlen;
die:
trray(intsize)〃建立數(shù)組
len=size;ap=newint[size];}
oidSort();〃排序
/重載算符+函數(shù)
rrayoperaor+(constArray&other);
111L
{inta[10],b[10];
intmainQ
{Arraya(10),b(10);〃聲明對象
Sort(a,10);
Sort(b,10);a.Sort();b.Sort();〃調(diào)用排序方法
Add(a,b,10);a=a+b;〃數(shù)組相加
封裝
classArray〃定義數(shù)組類
數(shù)組與數(shù)組類int*ap;intlen;
public:
//排序函數(shù)原型Array(intsize)〃建立數(shù)組
voidSort(int[],int);{len=size;ap=newint[size];}
〃數(shù)組相加函數(shù)原型voidSort();//排序
void戰(zhàn)算符+函數(shù)
operaor+(constArray&other);
intm
{int
:)
a(10),b(10);〃聲明對象
Son
Sona-Sort();b.Sort();//調(diào)用排序方法
Add(a,b,10);a=a+b;〃數(shù)組相加
6.1.1定義類與對象P218
?C++中,類定義的說明語句一般形式為:
class類名
{public:
公有性質(zhì)數(shù)據(jù)成員和成員函數(shù);
protected:
保護性質(zhì)數(shù)據(jù)成員和成員函數(shù);
private:
私有性質(zhì)數(shù)據(jù)成員和成員函數(shù);
};
說明P218
?其中,class是定義類的關(guān)鍵字。
■“類名”是用戶自定義的標(biāo)識符,用于標(biāo)
識類型名字。通常第一個字母大寫。
?一對花括號相括說明類成員,以分號結(jié)束
類定義語句。
*成員的性質(zhì)
-類成員用關(guān)鍵字指定不同訪問特性,決定其在類體系
中或類外的可見性。
?private聲明私有成員:私有性質(zhì)成員僅在類中可見。
不能在類外或派生類中使用。如果私有類成員放在放
在第一段,則可以省略關(guān)鍵字private。(建議不?。?/p>
?protected聲明保護成員:保護性質(zhì)成員在本類和它
的派生類中可見。
?public聲明公有成員:公有性質(zhì)的成員是的接口,在
類中和類外可見。
?各段中既可以包含數(shù)據(jù)成員,也可以包含成員函數(shù)。
成員函數(shù)可在類外定義P219
?成員函數(shù)在類外定義,使用作用域區(qū)分符
進行說明,此時函數(shù)頭形式為:
返回類型類名::函數(shù)名(參數(shù)表)
?簡單的成員函數(shù)實現(xiàn)可以在類中定義,此
時編譯器作內(nèi)聯(lián)函數(shù)處理。
關(guān)鍵字struct也可定義類P218
?除了關(guān)鍵字class外,關(guān)鍵字struct也可
定義類。
?用關(guān)鍵字struct也可定義類時,若不特別
指出,則所有成員都是公有成員。
關(guān)于類聲明的進一步說明
1.允許已定義類名出現(xiàn)在類的說明中
允許已定義類名出現(xiàn)在類的說明中
例:
classX
);
classY
{XdataMember;
);
允許已定義類名出現(xiàn)在類的說明中
例:
classlink
{link*next;
//聲明一個指向link類類型的指針
);
2.類可以無名,用于直接聲明對象
}mydate;
3.類是一個程序包
?可以只有數(shù)據(jù)成員或只有成員函數(shù),或者為空
#include<iostream>
usingnamespacestd;
classempty{};
intmain()
{emptye1;
cout?M&e1="?&e1?endl;
cout?Msizeofe1=M?sizeof(el)?endl;
}
強調(diào)
注:
1.允許已定義類名出現(xiàn)在類的說明中
2.類可以無名,用于直接聲明對象
3.類是一個程序包??梢灾挥袛?shù)據(jù)成員或只有成員函數(shù),或者為空。
//例
#include<iostream>
CAC:\WIND0WS\systefn32\(
usingnamespacestd;*1=0012FF63日
classempty{};sizeofe1=1
intmain()請按任意犍繼續(xù)..
Lil
{emptyel;
cout?n&el="vv&el?endl;
cout?"sizeofel="?sizeofifel)?endl;
“類”類型變量的定義P219
?“類”類型變量的定義,定義方法與普通結(jié)
構(gòu)類型變量定義方法相同。
?說明一個類類型的對象(變量)后,編譯
器為每個對象的數(shù)據(jù)成員分配內(nèi)存。
?對象沒有成員函數(shù)的副本,類成員函數(shù)可
以被對象調(diào)用。
6.1.2訪問對象成員P220
?公有成員是提供給外部的接口。
?類外用”.”和“?>”運算符訪問對象成員。
訪問對象的公有成員P220
〃例6」訪問對象的公有成員P220
#include<iostream>
usingnamespacestd;
classTclass
{public:
intx,y;
voidprint()
{cout?xw"Jwy;};
);
intmain()
{Tclasstest;
test.x=100;test.y=200;
test.print();
)
〃例6?2用指針訪問對象成員
#include<iostream>
usingnamespacestd;
classTclass
{public:
intx,y;
voidprint(){cout?x??y?endl;};
);
intadd(Tclass*ptf){return(ptf->x+ptf->y);}
intmain()
{Tclasstest,*pt=new(Tclass);
pt->x=100;pt->y=200;
pt->print();
test.x=150;test.y=450;
test.print();
cout?"x+y="?add(&test);
)
6.1.3this指針P221
?C++中,同一類的各個對象都有自己的數(shù)據(jù)成員
的存儲空間,系統(tǒng)不為每個類的對象建立成員函
數(shù)副本,但類的成員函數(shù)可以被各個對象調(diào)用。
?C++為成員函數(shù)提供了一個稱為this的隱含指針
參數(shù),所以常常稱成員函數(shù)擁有this指針。
?當(dāng)一個對象調(diào)用類的成員函數(shù)時,對象的地址被
傳遞給this指針,即this指針指向了該對象。
?this指針不能顯式聲明,但可以顯式使用。
說明
?this指針是一個常指針,相當(dāng)于:
?class_Type*constthis;
?其中:
?class_Type是用戶定義的類類型標(biāo)識符。
■這里,this指針一旦初始化(成員函數(shù)被調(diào)用)
之后,獲取了對象地址,指針值就不能再修改
和賦值,以保證不會指向其它對象。
?this指針的顯式使用主要在運算符重載、自引
用等場合。
this指針
#include<iostream>
usingnamespacestd;
classSimple
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?”,?y?endl;};
};
intmain()
{Simpleobjl,obj2,obj3;
objl.setXY(10,15);obj1.xobjl.y
obj1.printXY();
obj2.setXY(20,25);obj2.xobj2.y
obj2.printXY();
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>
usingnamespacestd;
classSimple
{intx,y;
public:
voidsetXY(inta,intb){x=a:y=b;}
voidprintXY(){cout?x?”,?y?endl;};
};
intmain()
{Simpleobjl,obj2,obj3;
objl.setXY(10,15);obj1.xobjl.y
obj1.printXY();
obj2.setXY(20,25);obj2.xobj2.y
obj2.printXY();
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>向哪個對象
usingnamespacestd;的數(shù)據(jù)成員賦值?
classSimple
{intx,y;
public:
voidsetXY(inta,intb){x=a:y=b;}
voidprintXY(){夕out<<x??y?endl;};
);//
??八11
mtmam()//
{Simpleobj1,objQ,obj3;
objl.setXY(10,15,;
obj1.printXY();
obj2.setXY(20,25);
obj2.printXY();
obj3.setXY(30,35);
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
成員函數(shù)隱含定義this指針
usingnamespacestd;
classSimple接受調(diào)用對象的地址
{intx,y;
public:
voidsetXY(inta,intb){x=a;y
voidsetXY(inta,intb,Simple*con){this->x=a;this->y=b;}
intmain()
{Simpleobj1,obj2,,
objl.setXY(10,15Mobjn;
obj1.printXY();
obj2.setXY(20,25);
obj2.printXY();
obj3.setXY(30,35);
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
this指針不能顯式聲明
usingnamespacestd;
classSimple
{intx,y;
public:
voidsetXY(inta,intb){x=a;y:
voidsetXY(inta,intb){this->x=a;this->y=b;}
J,
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.xobjl.y
obj1.printXY();
obj2.setXY(20,25);obj2.xobj2.y
obj2.printXY();
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
this指針不能顯式聲明
usingnamespacestd;
classSimple可以顯式使用
{intx,y;
public:
voidsetXY(inta,intb){x=a;y:
voidsetXY(inta,intb){this->x=a;this->y=b;}
J,
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.xobjl.y
obj1.printXY();
obj2.setXY(20,25);obj2.xobj2.y
obj2.printXY();
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;
classSimple通過調(diào)用函數(shù)的對象
{intx,y;this指針獲取對象地址
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXYQ4cout?x?vvy?endl;};
/
intmain()/
{Simnlgfobjl,obj2,obj3;
objl?>etXY(10,15);obj1.xobjl.y
obj1.printXY();
obj2.setXY(20,25);obj2.xobj2.y
obj2.printXY();
obj3.setXY(30,35);obj3,xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;
classSimple
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.xobj2.y
obj2.printXY();
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;
classSimple
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.xobj2.y
obj2.printXY();
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacest^;在objl上操作10,15
classSimple
{intx,y;
public:
voidsetXX(inta,intb){x=a;y=b;}
voidprintXY(){cout?xvv"J?y?endl;};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);
Cggp.printXY^
obj2.setXY(20,25);
obj2.printXY();
obj3.setXY(30,35);
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;10,15
classSimple
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.y
obj2.printXY();
obj3.setXY(30,35);obj3,xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespaces叱
在obj2上操作10,15
classSimple
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);
obj1.printXY();
之亞.setXY(2U,軍力;
obj2.printXY();
obj3.setXY(30,35);
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
町在上操作
usingnamespaces0bj?10,15
classSimple/_______________
{intx,y;/
public:J
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
COST.setXY(2025^obj2.x20obj2.y25
obj2.printXY();
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;10,15
classSimple
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.x20obj2.y25
obj2.printXY();
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacest^;在obj2上操作10,15
classSimple
{intx,y;
public:
voidsetXX(inta,intb){x=a;y=b;}
voidprintXY(){cout?xvv"J?y?endl;};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.x20obj2.y25
?printXY^
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacest^;在obj2上操作10,15
classSimple20,25
{intx,y;
public:
voidsetXX(inta,intb){x=a;y=b;}
voidprintXY(){cout?xvv"J?y?endl;};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.x20obj2.y25
?printXY^
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;10,15
classSimple20,25
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.x20obj2.y25
obj2.printXY();
obj3.setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;10,15
classSimple20,25
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.x20obj2.y25
obj2.printXY();
obj3,setXY(30,35);obj3.xobj3.y
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;10,15
classSimple20,25
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.x20obj2.y25
obj2.printXY();
obj3,setXY(30,35);obj3.x30obj3.y35
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;10,15
classSimple20,25
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.x20obj2.y25
obj2.printXY();
obj3.setXY(30,35);obj3.x30obj3.y35
obj3.printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;10,15
classSimple20,25
{intx,y;
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?xvv"J?y?endl;};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.x20obj2.y25
obj2.printXY();
obj3.setXY(30,35);obj3.x30obj3.y35
obj3,printXY();
6.1.3this指針
#include<iostream>〃例6-5
usingnamespacestd;10,15
classSimple20,25
{intx,y;30,35
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?xvv"J?y?endl;};
intmain()
{Simpleobj1,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.x20obj2.y25
obj2.printXY();
obj3.setXY(30,35);obj3.x30obj3.y35
obj3,printXY();
6.1.3this指針
#include<iostream'
.一J
usingnamespacesi15
成員函數(shù)擁有this指針
classSimple15
{intx,y;行
public:
voidsetXY(inta,intb){x=a;y=b;}
voidprintXY(){cout?x?n,n?y?endl;};
};
intmain()
{Simpleobjl,obj2,obj3;
objl.setXY(10,15);obj1.x10objl.y15
obj1.printXY();
obj2.setXY(20,25);obj2.x20obj2.y25
obj2.printXY();
obj3.setXY(30,35);obj3.x30obj3.y35
obj3.printXY();
6.2構(gòu)造函數(shù)和析構(gòu)函數(shù)P222
基本概念
■在類中構(gòu)造函數(shù)和析構(gòu)函數(shù)都是特殊函數(shù)。
?構(gòu)造函數(shù)用于建立類的實例;
?析構(gòu)函數(shù)用于撤消類的實例。
■程序并不顯式調(diào)用這些函數(shù),當(dāng)程序創(chuàng)建一個
對象時,系統(tǒng)自動調(diào)用構(gòu)造函數(shù);
?當(dāng)程序撤消一個對象時,系統(tǒng)自動調(diào)用析構(gòu)函
數(shù)。
?這些都是編譯器自動調(diào)用的。
構(gòu)造函數(shù)P222
?構(gòu)造函數(shù)是用于創(chuàng)建對象的特殊成員函數(shù)。
?當(dāng)創(chuàng)建對象時,系統(tǒng)自動調(diào)用構(gòu)造函數(shù)。
?構(gòu)造函數(shù)的作用是:
為對象分配空間;
對數(shù)據(jù)成員賦初值;
請求其他資源。
說明
?構(gòu)造函數(shù)名與類名相同:類名
?構(gòu)造函數(shù)可以有任意類型的參數(shù),但沒有返回
類型。
?構(gòu)造函數(shù)可以由用戶提供,也可使用系統(tǒng)的默
認版本。
?如果沒有用戶定義的構(gòu)造函數(shù)時,系統(tǒng)提供缺
省版本的構(gòu)造函數(shù),只負責(zé)對象的創(chuàng)建,不能
為對象中的數(shù)據(jù)成員賦初值。(不做數(shù)據(jù)成員
初始化工作)
?構(gòu)造函數(shù)可以重載。
何時調(diào)用構(gòu)造函數(shù)
?何時調(diào)用構(gòu)造函數(shù)十分明確:
?定義類的對象時;
?調(diào)用new或者new□運算符動態(tài)開辟內(nèi)存空間時。
?在對象被創(chuàng)建的時候就會調(diào)用構(gòu)造函數(shù),
?比如:聲明一個類classA{?.J,
?當(dāng)你在main函數(shù)中Aa;
?定義一個對象a的時候,就調(diào)用構(gòu)造函數(shù)。
?默認構(gòu)造函數(shù)都是無參數(shù)的。
何時調(diào)用析構(gòu)函數(shù)
?何時調(diào)用構(gòu)造函數(shù)要十分明確:
?當(dāng)函數(shù)調(diào)用結(jié)束的時候,會自動調(diào)用析構(gòu)
函數(shù),析構(gòu)的作用就是釋放對象占用的資
源。
?以為默認析構(gòu)什么也不打印,所以你不會
直觀看出析構(gòu)函數(shù)什么時候執(zhí)行,i己在
析構(gòu)中加上打印的語言你就會看到了。
構(gòu)造函數(shù)和析構(gòu)函數(shù)
例:
classAA
{public:
AA(){……}
?AA(){……}
};
voidtest()
{intx,y;
AAtl,t2;
return;
構(gòu)造函數(shù)和析構(gòu)函教_
構(gòu)造函數(shù)
};
voidtest()
{intx,y;
AAtl,t2;
return;
構(gòu)造函數(shù)和析構(gòu)函數(shù)
例:/析構(gòu)函數(shù)
classAA//
{public://
AA(){…./
);
voidtest()
{intx,y;
AAtl,t2;
return;
構(gòu)造函數(shù)和析構(gòu)函數(shù)
例:
classAA
{public:
AA(){……}
?AA(){.......
};
voidtest()
{intx,y;〃聲明變量時開辟兩個整型存儲空間
AAtl,t2;
return;
構(gòu)造函數(shù)和析構(gòu)函數(shù)
例:
classAA
{public:
AA(){……}
?AA(){.......
};
voidtest()
{intx,y;
〃兩次調(diào)用構(gòu)造函數(shù),對象tl,t2
return;
構(gòu)造函數(shù)和析構(gòu)函數(shù)
例:
classAA
{public:
AX01
?AA(){
};
voidtest()
{intx,y;
AAtl,t2;〃兩次調(diào)用構(gòu)造函數(shù),創(chuàng)建對象
return;
構(gòu)造函數(shù)和析構(gòu)函數(shù)
例:
classAA
{public:
AA(){……}
?AA(){.......
};
voidtest()
{intx,y;
AAtl,t2;
return;
〃兩次調(diào)用析構(gòu)函數(shù),撤消對象tl,t2
構(gòu)造函數(shù)和析構(gòu)函數(shù)
例:
classAA
{public:
AA(){
?AA(){……}
};
voidtest()
{intx,y;
AAtl,t2;
return;//兩次調(diào)用析構(gòu)函數(shù),撤消對象
構(gòu)造函數(shù)和析構(gòu)函數(shù)
例:
classAA
{public:
AA(){……}
?AA(){.......
};
voidtest()
{intx,y;
AAtl,t2;
return;〃兩次調(diào)用析構(gòu)函數(shù),撤消對象
}
〃變量生存期結(jié)束
6.2.1簡單構(gòu)造函數(shù)和析構(gòu)函數(shù)
P222
■構(gòu)造函數(shù)原型
類名::類名(參數(shù)表)、
?析構(gòu)函數(shù)原型
類名~類名()
#include<iostream>//例6-3重寫日期類P223
usingnamespacestd;
classDate
{public:
Date();
-Date();
voidSetDate(inty,intm,intd);
intIsLeapYear();
voidPrintDate();
private:
intyear,month,day;
};
Date::Date(){cout?"DateobjectinitializedAn";}〃無參構(gòu)造函數(shù)
Date::-Date(){cout?nDateobjectdestroyed.\n";}//析構(gòu)函數(shù)
voidDate::SetDate(inty,intm,intd){year=y;month=m;day=d;}
intDate::IsLeapYear(){return(year%4==0&&year%100!=0)||(year%400==0);}
voidDate::PrintDate(){cout?year??month??day?endl;}
intmain()
{Dated;
d.SetDate(2001,10,1);
d.PrintDate();
}
#include<iostream>〃例6?3重寫日期類P223
usingnamespacestd;
classDate
{public:
Date();
~Date();
voidSetDate(inty,intm,intd);
intIsLeapYear();
voidPrintDate();
private:
intyear,month,day;
};
Date::Date(){coutvv"Dateobjectinitialized.、!!'';}〃無參構(gòu)造函數(shù)
Date::~Date()"Dateobjectdestroyed.\n";}//析構(gòu)函
voidDate::SetDate(intintd){year=y;monthday=d;}
intDate::IsLeapYear()
voidDate::PrintDate()
創(chuàng)建對象時
intmain()
調(diào)用構(gòu)造函數(shù)
d.SetDate(2001,10,l);
d.PrintDate();
#include<iostream>〃例重寫日期類P223
usingnamespacestd;
classDate
{public:
Date();
?Date。;
voidSetDate(inty,intm,intd);
intIsLeapYear();
voidPrintDate();
private:
intyear,month,day;
};
Date::Date(){cout?"Dateobjectinitialized.、!!";}//無參構(gòu)造函數(shù)
Date::-Date(){cout?”Dateobjectdestroyed.\nn;}〃析構(gòu)函數(shù)
voidDate::Setinty,intm,intd){year=y;month=m;day=d;}
intDate::IsLeapYear(){reear%4==0&&year%100!=0)||(year%400==0);}
voidDate::PrintDate(){cout?year<?ndl;}
intmain()作用域結(jié)束時
{Dated;調(diào)用析構(gòu)函數(shù)
d.SetDate(2001,10,ll<
d.PrintDate();
)
#include<iostream>〃例6-3重寫日期類P223
usingnamespacestd;
CAC:\VIID0TS\systeB32\cBd.exe
classDate
Dateobjectinitialized.
{public:2001/10/1
Date();Dateobjectdestroyed.
~Date();請按任意鍵繼續(xù).?.
voidSetDate(inty,intm,intd);
intIsLeapYear();
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 15470.3-2025家用直接作用式房間電加熱器性能測試方法第3部分:輻射效率測量的附加規(guī)定
- 棋譜倉庫文員培訓(xùn)總結(jié)
- 三違安全知識培訓(xùn)
- 新生兒紅臀的預(yù)防與護理常規(guī)考核試題
- 城市交通規(guī)劃合同終止咨詢重點基礎(chǔ)知識點
- 軋鋼廠租賃合同協(xié)議
- 輔導(dǎo)機構(gòu)學(xué)員協(xié)議合同
- 暫時離職協(xié)議書
- 智聯(lián)招聘協(xié)議書
- 健康養(yǎng)生服務(wù)提供協(xié)議
- GB/T 12224-2005鋼制閥門一般要求
- GB/T 11022-2020高壓交流開關(guān)設(shè)備和控制設(shè)備標(biāo)準(zhǔn)的共用技術(shù)要求
- 象鼻嶺無蓋重固結(jié)灌漿試驗大綱修定稿
- 硝普鈉臨床應(yīng)用課件
- 2015中石油職稱英語大綱模擬試題及答案解析
- 2022年中原工學(xué)院輔導(dǎo)員招聘考試筆試試題及答案解析
- 公司戰(zhàn)略規(guī)劃和落地方法之:五看三定工具解析課件
- 酒店住宿水單模板word酒店流水單
- 調(diào)機品管理規(guī)定
- 2022年重慶中考數(shù)學(xué)試題及答案(A卷)
- 國家最新煤的發(fā)熱量測定方法
評論
0/150
提交評論