You are on page 1of 32

CHNG 7:

LP

(CLASS)
B mn H Thng My Tnh v Truyn Thng Khoa Cng Ngh Thng Tin v Truyn Thng i hc Cn Th

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Chng 7

Ni dung

Lp Quyn truy xut

Khai bo, nh ngha 1 lp n gin


Hm thnh vin ni tuyn (inline) Hm xy dng (constructor)

Hm hy (destructor)
Hm bn (friend) Lp bn i s mc nh i s thnh vin n (con tr this)
2

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Chng 7

Ni dung (tt)

Ton t phm vi Danh sch khi to thnh vin Thnh vin hng - Thnh vin tnh Thnh vin tham chiu Thnh vin l i tng ca 1 lp Mng cc i tng Phm vi lp Cu trc (structure) v hp (union) Cc trng bit
3

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Chng 7

Khi nim lp

Lp: kiu d liu tru tng.


TN LP

private protected public

c t i tng

D liu thnh vin

Tp cc thao tc

Hm thnh vin

class TNLP [: <Quyn truy xut> LPCHA ] { <Quyn truy xut > : DataType1 memberdata1; DataType2 memberdata2; . < Quyn truy xut > : memberFunction1(); memberFunction2(); .. };
4

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Chng 7

Lp n gin

V d:
class Point { int xVal, yVal; public: void SetPt (int, int); void OffsetPt (int, int); }; void Point::SetPt (int x, int y) { xVal = x; yVal = y; } void Point::OffsetPt (int x, int y) { xVal += x; yVal += y; } void main() { Point pt; pt.SetPt(10,20); pt.OffsetPt(2,2); ..

To ra i tng thuc lp Point

Khai bo Lp

Gi hm trn i tng

nh ngha cc hm thnh vin

pt.xVal = 10; // ng hay sai? Point pt1, pt2, pt3; . }


5

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Chng 7

Hm thnh vin ni tuyn

Hm inline:
Ci thin tc thc thi Tn b nh (dnh cho m lnh) khi thc thi.

Cch 1:

thm T kha inline

class Point { int xVal, yVal; public: void SetPt (int, int); void OffsetPt (int, int); };

inline void Point::SetPt (int x, int y) { xVal = x; yVal = y; }


Khoa Cng Ngh Thng Tin - i Hc Cn Th

class Point { int xVal, yVal; Cch 2: public: void SetPt (int x, int y) { nh xVal = x; ngha yVal = y; bn } trong void OffsetPt (int x, int y) { xVal += x; lp yVal += y; }

};
6

Chng 7

V d - Lp Set (tp hp)


#include <iostream.h> const maxCard = 100; enum Bool {false, true}; class Set { private: int elems[maxCard]; int card; public: void EmptySet(){ card = 0; } Bool IsMember (const int); void AddElem (const int); void RmvElem (const int); void Copy (Set&); Bool Equal (Set&); void Intersect (Set&, Set&); void Union (Set&, Set&); void Print (); };
Khoa Cng Ngh Thng Tin - i Hc Cn Th

Bool Set::IsMember (const int elem) { for (register i = 0; i < card; ++i) if (elems[i] == elem) return true; return false; } void Set::AddElem (const int elem) { if (IsMember(elem)) return; if (card < maxCard) elems[card++] = elem; else cout << "Set overflow<<endl; } void Set::RmvElem (const int elem) { for (register i = 0; i < card; ++i) if (elems[i] == elem) { for (; i < card-1; ++i) // Dch elems[i] = elems[i+1]; --card; } }
7

Chng 7

V d - Lp Set (tt)
void Set::Copy (Set &set) { for (register i = 0; i < card; ++i) set.elems[i] = elems[i]; set.card = card; } Bool Set::Equal (Set &set) { if (card != set.card) return false; for (register i = 0; i < card; ++i) if (!set.IsMember(elems[i])) return false; return true; } void Set::Print (void) { cout << "{"; for (int i = 0; i < card-1; ++i) cout << elems[i] << ","; if (card > 0) cout << elems[card-1]; cout << "}<<endl; }
Khoa Cng Ngh Thng Tin - i Hc Cn Th

int main (void) { Set s1, s2; s1.EmptySet(); s2.EmptySet(); s1.AddElem(10); s1.AddElem(20); s1.AddElem(30); s1.AddElem(40); s2.AddElem(30); s2.AddElem(50); s2.AddElem(10); s2.AddElem(60); cout << "s1 = "; s1.Print(); cout << "s2 = "; s2.Print(); s2.RmvElem(50); cout << "s2 - {50} = "; s2.Print(); if (s1.IsMember(20)) cout << "20 is in s1\n"; if (!s1.Equal(s2)) cout << "s1 <> s2\n"; return 0; }

Kt qu ?

Chng 7

Hm xy dng

Dng nh ngha v khi to i tng cng 1 lc. C tn trng vi tn lp, khng c kiu tr v. Khng gi trc tip, s c t ng gi khi khi to t. Gn gi tr, cp vng nh cho cc d liu thnh vin.
class Point { int xVal, yVal; public: Point (int x, int y) { xVal = x; yVal = y; } void OffsetPt (int x, int y) { xVal += x; yVal += y; } void main() { Point pt1(10,20); pt1.OffsetPt(2,2); .. // Khai bo no l sai ? Point pt2; Point pt3(); Point pt4 = Point(5,5); Point pt5 = new Point(5,5); . }
9

};
Khoa Cng Ngh Thng Tin - i Hc Cn Th

Chng 7

Hm xy dng (tt)
class Point { int xVal, yVal; public: Point () // Hm xy dng mc nhin { xVal = 0; yVal = 0; } Point (int x, int y) { xVal = x; yVal = y; } Point (float len, float angle) {
xVal = (int) (len * cos(angle)); yVal = (int) (len * sin(angle));

} void OffsetPt (int , int );

};
void main() {
Point p1; Point p2(10,20); Point p3(60.3, 3.14);

class Set { private: int *elems; int maxCard; int card; public: Set(const int size) { elems = new int[size]; maxCard = size; card = 0; } }; void main() { Set s1(100); Set s2(20); Set s3(1000); }

Mm do hn

Khng cn phi nh gi hm EmptySet() khi khi to

}
Khoa Cng Ngh Thng Tin - i Hc Cn Th 10

Chng 7

Hm hy

Dn dp 1 i tng trc khi n c thu hi. C php: ~TenLop() { ... } Khng gi trc tip, s c t ng gi khi hy b t. Thu hi vng nh cho cc d liu thnh vin l con tr.
class Set { private: int *elems; int maxCard; int card; public: Set(const int size) { } ~Set() { delete[] elems; } . };
Set TestFunct1(Set s1) { Set *s = new Set(50); return *s; } void main() { Set s1(40), s2(50); s2 = TestFunct1(s1); }

Tng cng c bao nhiu ln hm hy c gi ?

Khoa Cng Ngh Thng Tin - i Hc Cn Th

11

Bn (Friend) t vn
Tp Cc S Nguyn class IntSet { public: //... private: int elems[maxCard]; int card; }; class RealSet { public: //... Tp Cc private: S Thc float elems[maxCard]; int card; }; Hm SetToReal dng chuyn tp s nguyn thnh tp s thc void IntSet::SetToReal (RealSet &set) { set.card = card; for (register i = 0; i < card; ++i) set.elems[i] = (float) elems[i]; }

Lm th no thc hin c vic truy xut n thnh vin Private ?

Khoa Cng Ngh Thng Tin - i Hc Cn Th

12

Hm bn (Friend)

Cch 1: Khai bo hm thnh vin ca lp


IntSet l bn (friend) ca lp RealSet.
Gi nguyn nh ngha ca lp IntSet class IntSet { public: //... private: int elems[maxCard]; int card; }; class RealSet { public: //... friend void IntSet::SetToReal (RealSet&); private: float elems[maxCard]; int card; };
13

Thm dng khai bo Friend cho hm thnh vin SetToReal

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Hm bn (Friend)

Cch 2:
Chuyn hm SetToReal ra ngoi (c lp). Khai bo hm l bn ca c 2 lp.

class IntSet { public: //... friend void SetToReal (IntSet &, RealSet&); private: int elems[maxCard]; int card; }; class RealSet { public: //... friend void SetToReal (IntSet &, RealSet&); private: float elems[maxCard]; int card; };
Khoa Cng Ngh Thng Tin - i Hc Cn Th

void SetToReal (IntSet& iSet, RealSet& rSet ) { rSet.card = iSet.card; for (int i = 0; i < iSet.card; ++i) rSet.elems[i] = (float) iSet.elems[i]; } Hm c lp l bn(friend) ca c 2 lp.
14

Bn (Friend)

Hm bn:
C quyn truy xut n tt c cc d liu v hm thnh vin (protected + private) ca 1 lp. L do:

Cch nh ngha hm chnh xc. Hm ci t khng hiu qu.

Lp bn:

Tt c cc hm trong lp bn: l hm bn.


class A; class B { // . friend class A; }; class IntSet { .. } class RealSet { // . friend class IntSet; };
15

Khoa Cng Ngh Thng Tin - i Hc Cn Th

i s mc nh

i s mc nh tnh t bn phi.
class Point { int xVal, yVal; public: Point (int x = 0, int y = 0); //... }; void main() { Point p1; // nh l ??? Point p2(10); // nh l ??? Point p3(10,20); Point p4(, 20); // ????? .. } class Point { int xVal, yVal; public: Point (int x = 0, int y = 0); Point (float x=0, float y=0); //... }; Ti ngha M h void main() { Point p2(1.6, 5.0); // nh l ??? Point p3(10,20); // nh l ??? Point p4; // ????? .. }
16

Khoa Cng Ngh Thng Tin - i Hc Cn Th

i s thnh vin n

Con tr *this:
L 1 thnh vin n, c thuc tnh l private. Tr ti chnh bn thn i tng.

void Point::OffsetPt (int x, int y) { xVal += x; yVal += y; }

void Point::OffsetPt (int x, int y) { this->xVal += x; this->yVal += y; }

C nhng trng hp s dng *this l d tha (V d trn)

Tuy nhin, c nhng trng hp phi s dng con tr *this


17

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Ton t phm vi

Ton t :: dng xc nh chnh xc hm


(thuc tnh) c truy xut thuc lp no. Cu lnh: pt.OffsetPt(2,2); <=> pt.Point::OffsetPt(2,2); Cn thit trong mt s trng hp:
Cch gi hm trong tha k. Tn thnh vin b che bi bin cc b. V d: Point(int xVal, int yVal) {

Point::xVal = xVal; Point::yVal = yVal; }


Khoa Cng Ngh Thng Tin - i Hc Cn Th 18

Danh sch khi to thnh vin

Tng ng vic gn gi tr d liu thnh vin.


class Point { int xVal, yVal; public: Point (int x, int y) { xVal = x; yVal = y; } // }; class Image { public: Image(const int w, const int h); private: int width; int height; //... }; Image::Image(const int w, const int h) { width = w; height = h; //..................... } Image::Image (const int w, const int h) : width(w), height(h) { //............... }
19

Point::Point (int x, int y) : xVal(x), yVal(y) { }

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Thnh vin hng

Hng d liu thnh vin:


class Image { public: Image(const int w, const int h); private: const int width; const int height; //... };
Khai bo bnh thng nh d liu thnh vin

Khi to SAI

class Image { const int width = 256; const int height = 168; //... }; Khi to NG thng qua danh sch khi to thnh vin
20

Image::Image (const int w, const int h) : width(w), height(h) { //................ }


Khoa Cng Ngh Thng Tin - i Hc Cn Th

Thnh vin hng


Hng i tng: khng c thay i gi tr. Hm thnh vin hng:

c php gi trn hng i tng. Khng c thay i gi tr d liu thnh vin.

class Set { public: Set(void){ card = 0; } Bool Member(const int) const; void AddElem(const int); //... }; Bool Set::Member (const int elem) const { //... }
Khoa Cng Ngh Thng Tin - i Hc Cn Th

void main() { const Set s; s.AddElem(10); // SAI s.Member(10); // ok }

21

Thnh vin tnh

D liu thnh vin tnh:


Dng chung 1 bn sao chp (1 vng nh) chia s cho tt c i tng ca lp . S dng: <TnLp>::<TnDLiuThnhVin> Thng dng m s lng i tng.

class Window { // danh sch lin kt tt c Window static Window *first; // con tr ti window k tip Window *next; //... }; Window *Window::first = &myWindow; // .

Khai bo

Khi to d liu thnh vin tnh


22

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Thnh vin tnh

Hm thnh vin tnh:


Tng ng vi hm ton cc. Gi thng qua: <TnLp>::<TnHm>

class Window { // . static void PaintProc () { .. } // }; Khai bo nh ngha hm thnh vin tnh

void main() { // . Window::PainProc();


}
Khoa Cng Ngh Thng Tin - i Hc Cn Th

Truy xut hm thnh vin tnh


23

Thnh vin tham chiu

Tham chiu d liu thnh vin:


class Image { int width; int height; int &widthRef; //... };
class Image { int width; int height; int &widthRef = width; //... }; Khi to NG thng qua danh sch khi to thnh vin
24

Khai bo bnh thng nh d liu thnh vin

Khi to SAI

Image::Image (const int w, const int h) : widthRef(width) { //... }


Khoa Cng Ngh Thng Tin - i Hc Cn Th

Thnh vin l i tng ca 1 lp

D liu thnh vin c th c kiu:


D liu (lp) chun ca ngn ng. Lp do ngi dng nh ngha (c th l chnh lp ).

class Point { . }; class Rectangle { public: Rectangle (int left, int top, int right, int bottom); //... private: Point topLeft; Point botRight; }; Rectangle::Rectangle (int left, int top, int right, int bottom) : topLeft(left,top), botRight(right,bottom) {}

Khi to cho cc d liu thnh vin qua danh sch khi to thnh vin

Khoa Cng Ngh Thng Tin - i Hc Cn Th

25

Mng cc i tng

S dng hm xy dng khng i s (hm xy dng mc nhin - default constructor).


VD: Point pentagon[5];

S dng b khi to mng:


VD: Point triangle[3] = { Point(4,8), Point(10,20), Point(35,15) }; Ngn gn: Set s[4] = { 10, 20, 30, 40 }; tng ng vi: Set s[4] = { Set(10), Set(20), Set(30), Set(40) };
26

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Mng cc i tng

S dng dng con tr:


Cp vng nh: VD: Point *pentagon = new Point[5]; Thu hi vng nh: delete[] pentagon; delete pentagon; // Thu hi vng nh u
class Polygon { public: //... private: Point *vertices; int nVertices; }; Khng cn bit kch thc mng. // cc nh // s cc nh

Khoa Cng Ngh Thng Tin - i Hc Cn Th

27

Phm vi lp

Thnh vin trong 1 lp:

Che cc thc th trng tn trong phm vi.


// int fork (void); // fork h thng class Process { int fork (void); // fork thnh vin //... }; // int Process::func1 (void) { int x = fork(); // gi fork cc b int pid = ::fork(); // gi hm fork h thng //... }

fork thnh vin che i fork ton cc trong phm vi lp Process

Khoa Cng Ngh Thng Tin - i Hc Cn Th

28

Phm vi lp
Lp ton cc: i a s lp trong C++. Lp lng nhau: lp cha ng lp. Lp cc b: trong 1 hm hoc 1 khi.

class Rectangle { // Lp lng nhau public: Rectangle (int, int, int, int); //.. private:
class Point { public: Point(int a, int b) { } private: int x, y; };

Point topLeft, botRight; }; Rectangle::Point pt(1,1); // sd ngoi


Khoa Cng Ngh Thng Tin - i Hc Cn Th

void Render (Image &i) { class ColorTable { public: ColorTable () { /* ... */ } AddEntry (int r, int g, int b) { /* ... */ } //... }; ColorTable colors; //... } ColorTable ct; // SAI
29

Cu trc v hp

Cu trc (structure):

Bt ngun t ngn ng C. Tng ng vi class vi cc thuc tnh l public. S dng nh class.


class Point { public: Point(int, int); void OffsetPt(int, int); int x, y; };

struct Point { Point (int, int); void OffsetPt(int, int); int x, y; };

Point p = { 10, 20 };

C th khi to dng ny nu khng c nh ngha hm xy dng


30

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Cu trc v hp

Hp (union):
Tt c thnh vin nh x n cng 1 a ch bn trong i tng chnh n (khng lin tip). Kch thc = kch thc ca d liu ln nht.

union Value { long double char Pair //... }; class Pair { Value Value //... };

integer; real; *string; list;

class Object { private: enum ObjType {intObj, realObj, strObj, listObj}; ObjType type; // kiu i tng Value val; // gi tr ca i tng //... };

*head; *tail;

Kch thc ca Value l 8 bytes = sizeof(double)


31

Khoa Cng Ngh Thng Tin - i Hc Cn Th

Cc trng bit

iu khin i tng mc bit. VD: Truy xut cc bit trong header ca gi tin.

typedef unsigned int Bit; class Packet { Bit type : 2; // rng 2 bit Bit acknowledge : 1; // rng 1 bit Bit channel : 4; // rng 4 bit Bit sequenceNo : 4; // rng 4 bit Bit moreData : 1; // rng 1 bit //... }; enum PacketType { dataPack, controlPack, supervisoryPack }; enum Bool { false, true };

// Packet p; p.type = controlPack; p.acknowledge = true;

Khoa Cng Ngh Thng Tin - i Hc Cn Th

32

You might also like