1. Trang chủ
  2. » Giáo án - Bài giảng

Bài giảng lập trình hướng đối tượng operator và others trần phước tuấn

10 144 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 227,19 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

class Matrix Matrix { public: Matrix const short rows, const short cols; ~Matrix void {delete elems;} double& operator const short row, const short col; friend ostream& operator = 1 &&

Trang 1

L P TRÌNH

tuantp@hcmup.edu.vn http://giaotrinh.tranphuoctuan.com

8/30/2009

Tái nh ngh a hàm.

Tái nh ngh a toán t Chuy n i ki u.

Tái nh ngh a toán t xu t (<<)– nh p (>>) Tái nh ngh a toán t [], toán t ()

Kh i t o ng m nh - Gán ng m nh.

Tái nh ngh a toán t ++ và Tái nh ngh a new và delete

nh ngh a các hàm cùng tên

i s ph i khác nhau:

class Time Time {

//

long GetTime (void); // s giây tính t a êm

void GetTime (int &hours,

int &minutes, int &seconds);

};

ng Th

Ki u

Có th dùng i s c nh.

void main() { int h, m, s;

long t = GetTime(); // G i hàm ???

GetTime(h, m, s); // G i hàm ???

}

nh ngh a các phép toán trên i t ng Các phép toán có th tái nh ngh a:

, () []

||

&&

>=

<=

>

<

!=

==

>>=

<<=

^=

|=

&=

%=

/=

-=

+=

=

>>

<<

^

|

&

% /

* -+ Nh ng

delete new

->* -> () ++

&

~

!

* -+ n ng

Các phép toán không th tái nh ngh a:

.* :: ?: sizeof

Trang 2

TPT - LTH T 5

8/30/2009

ng hàm thành viên:

class Point Point {

public:

Point (int x, int y) { Point::x = x; Point::y = y; }

Point operator + (Point &p) { return Point(x + p.x,y + p.y); }

Point operator - (Point &p) { return Point(x - p.x, y - p.y); }

private:

int x, y;

};

void main() {

Point p1(10,20), p2(10,20);

Point p3 = p1 + p2; Point p4 = p1 - p2;

Point p5 = p3.operator + (p4); Point p6 = p3.operator – (p4);

};

Có 1 tham s (N u là toán t nh ng)

8/30/2009

ng hàm c l p: th ng khai báo friend

class Point Point { public:

Point (int x, int y) { Point::x = x; Point::y = y; } friend Point operator + (Point &p, Point &q)

{return Point(p.x + q.x,p.y + q.y); } friend Point operator - (Point &p, Point &q)

{return Point(p.x - q.x,p.y - q.y); } private:

int x, y;

};

void main() { Point p1(10,20), p2(10,20);

Point p3 = p1 + p2; Point p4 = p1 - p2;

Point p5 =operator + (p3, p4); Point p6 = operator – (p3, p4);

};

Có 2 tham s (N u là toán t nh ng)

i ti n l p t p h p (Set):

#include <iostream.h>

const maxCard = 100;

enum Bool {false, true};

class Set Set {

public:

Set(void) { card = 0; }

friend Bool operator & (const int, Set&);// thanh vien ?

friend Bool operator == (Set&, Set&); // bang ?

friend Bool operator != (Set&, Set&); // khong bang ?

friend Set operator * (Set&, Set&); // giao

friend Set operator + (Set&, Set&); // hop

//

void AddElem(const int elem);

void Copy (Set &set);

void Print (void);

private:

int elems[maxCard];

int card;

};

// nh ngh a các toán t

……….

……….

int main (void) { Set s1, s2, s3;

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();

if (20 & s1) cout << "20 thuoc s1\n";

cout << "s1 giao s2 = "; (s1 * s2).Print();

cout << "s1 hop s2 = "; (s1 + s2).Print();

if (s1 != s2) cout << "s1 /= s2\n";

return 0;

}

Mu n th c hi n các phép c ng:

void main() { Point p1(10,20), p2(30,40), p3, p4, p5;

p3 = p1 + p2;

p4 = p1 + 5; p5 = 5 + p1;

};

Có th nh ngh a thêm 2 toán t :

class Point Point {

//

friend Point operator + (Point, Point);

friend Point operator + (int, Point);

friend Point operator + (Point, int);

};

Trang 3

TPT - LTH T 9

8/30/2009

void main() { Point p1(10,20), p2(30,40), p3, p4, p5;

p3 = p1 + p2;

p4 = p1 + 5; // ng ng p1 + Point(5) p5 = 5 + p1; // ng ng Point(5) + p1 }

class Point Point { //

Point (int x) { Point::x = Point::y = x; } friend Point operator + (Point, Point);

};

Chuy n ki u

5 Point(5)

Chuy n i ki u: ngôn ng nh ngh a s n.

nh ngh a phép chuy n i ki u

8/30/2009

Tái nh ngh a toán t xu t <<

nh ngh a hàm toàn c c:

ostream& operator << (ostream&, Class&);

class Point Point { public:

Point (int x=0, int y=0) { Point::x = x; Point::y = y; } friend ostream& operator <<

(ostream& os, Point& p) { os<< “(“ << p.x << “,” << p.y << “)”; } // …

private:

int x, y;

};

void main() { Point p1(10,20), p2;

cout<<“Diem P1: “<< p1 << endl; cout<<“Diem P2: “<< p2 << endl; }

t qu trên màn hình ?

nh ngh a hàm toàn c c:

istream& operator >> (istream&, Class&);

class Point Point {

public:

Point (int x=0, int y=0)

{ Point::x = x; Point::y = y; }

friend istream& operator >>

(istream& is, Point& p)

{ cout<<“Nhap x: “; is>>p.x;

cout<<“Nhap y: “; is>>p.y;

}

// …

private:

int x, y;

};

void main() { Point p1, p2;

cout<<“Nhap thong tin cho P1: \n“;

cin>>p1;

cout<<“Nhap thong tin cho P2: \n“;

cin>>p2;

}

Thông th ng xu t ra giá tr a 1 ph n t i trí cho tr c trong i t ng.

nh ngh a là hàm thành viên.

class StringVec StringVec { public:

StringVec (const int dim);

~StringVec ();

char* operator [] (int);

int add(char* );

// ………

private:

char **elems; // cac phan tu int dim; // kich thuoc cua vecto int used; // vi tri hien tai };

char* StringVec::operator [] (int i) {

if ( i>=0 && i<used) return elems[i]; return “”;

}

void main() { StringVec sv1(100);

sv1.add(“PTPhi”);sv1.add(“BQThai”); sv1.add(“LVLam”); sv1.add(“NCHuy”); cout<< sv1[2]<<endl;

cout<<sv1[0];

}

Trang 4

TPT - LTH T 13

8/30/2009

nh ngh a là hàm thành viên.

class Matrix Matrix {

public:

Matrix (const short rows, const short cols);

~Matrix (void) {delete elems;}

double& operator () (const short row,

const short col);

friend ostream& operator << (ostream&, Matrix&);

friend Matrix operator + (Matrix&, Matrix&);

friend Matrix operator - (Matrix&, Matrix&);

friend Matrix operator * (Matrix&, Matrix&);

private:

const short rows; // s hàng

const short cols; // s t

double *elems; // các ph n t

};

double& Matrix::operator () (const short row, const short col) {

static double dummy = 0.0;

return (row >= 1 && row <= rows

&& col >= 1 && col <= cols)

? elems[(row - 1)*cols + (col - 1)]

: dummy;

} void main() { Matrix m(3,2);

m(1,1) = 10; m(1,2) = 20;

m(2,1) = 30; m(2,2) = 40;

m(3,1) = 50; m(3,2) = 60;

cout<<m<<endl;

}

8/30/2009

c nh ngh a s n trong ngôn ng :

VD: Point p1(10,20); Point p2 = p1;

gây ra l i (k t qu SAI) khi bên trong i t ng

VD: Matrix m(5,6); Matrix n = m;

i s y ra do

kh i t o ng m

ng cách gán

ng ng t ng thành ph n.

Khi l p có th th ành ph n d li u con tr ,

ph i nh ngh a hàm xây d ng sao chép

class Point Point {

int x, y;

public:

Point (int =0; int =0 );

// Khong can thiet DN

Point (const Point& p) {

x= p.x;

y = p.y;

}

// ………

};

// ………

class Matrix Matrix { //….

Matrix(const Matrix&);

};

Matrix::Matrix (const Matrix &m) : rows(m.rows), cols(m.cols) {

int n = rows * cols;

elems = new double[n]; // cùng kích th c for (register i = 0; i < n; ++i) // sao chép ph n t elems[i] = m.elems[i];

}

c nh ngh a s n trong ngôn ng :

Gán t ng ng t ng thành ph n.

úng khi i t ng không có d li u con tr

VD: Point p1(10,20); Point p2; p2 = p1;

Khi thành ph n d li u có con tr , b t bu c ph i

nh ngh a phép gán = cho l p.

class Matrix Matrix { //….

Matrix& operator = (const Matrix &m) {

if (rows == m.rows && cols == m.cols) { // ph i kh p int n = rows * cols;

for (register i = 0; i < n; ++i) // sao chép các ph n t elems[i] = m.elems[i];

} return *this;

} };

Hàm thành viên

Trang 5

TPT - LTH T 17

8/30/2009

u Ý

u Ý

ng có nhu c u c p phát tài nguyên.

i Ph ng th c thi t l p

ii Ph ng th c thi t l p sao chép

iii Ph ng th c hu

iv Phép gán

8/30/2009

Toán t ++ (ho c toán t ) có 2 lo i:

Ti n t : ++n

u t : n++

class PhanSo PhanSo { int tuso, mau so;

public:

// …

PhanSo(int=0 , int =1);

friend PhanSo operator ++ (PhanSo&);

friend PhanSo operator ++ (PhanSo&, int);

};

PhanSo operator ++ (PhanSo& p) { return (p = PhanSo(tuso+mauso, mauso));

} PhanSo operator ++ (PhanSo& p, int x) { PhanSo p2 = PhanSo(tuso+mauso, mauso);

return p2;

}

void main() { PhanSo p1(3,4), p2;

cout<< p1++;

cout<<++p2;

cout<<++(p1++) + (++p2)++; }

t qu trên màn hình ?

Hàm new và delete c nh c a ngôn ng :

u i t ng kích th c nh , có th gây ra quá

nhi u kh i nh => ch m.

Không áng k khi i t ng có kích th c l n.

=> Toán t new và delete ít c tái nh ngh a.

nh ngh a theo d ng hàm thành viên:

class Point Point {

public:

//

void* operator new (size_t bytes);

void operator delete (void *ptr, size_t bytes);

private:

int xVal, yVal;

};

void main() { Point *p = new Point(10,20);

Point *ds = new Point[30];

//………

delete p;

delete []ds;

}

i s thành viên n Toán t ph m vi Danh sách kh i t o thành viên Thành viên h ng

Thành viên t nh Thành viên tham chi u Thành viên là i t ng c a 1 l p

ng các i t ng

Ph m vi l p

u trúc và h p Các tr ng bit

Trang 6

TPT - LTH T 21

8/30/2009

i s c nh tính t bên ph i.

class Point 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 Point { int xVal, yVal;

public:

Point (int x = 0, int y = 0);

Point (float x=0, float y=0);

//

};

void main() { Point p2(1.6, 5.0); // nh là ???

Point p3(10,20); // nh là ???

Point p4; // ?????

}

i ngh a h

8/30/2009

Là 1 thành viên n, có thu c tính là private.

Tr i chính b n thân i t ng.

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ó nh ng tr ng h p s ng *this là th a (Ví d trên)

• Tuy nhiên, có nh ng tr ng h p ph i s ng con tr *this *this

Toán t :: dùng xác nh chính xác hàm

(thu c tính) c truy xu t thu c l p nào.

Câu l nh: pt.OffsetPt(2,2);

<=> pt.Point::OffsetPt(2,2);

n thi t trong m t s tr ng h p:

Cách g i hàm trong th a k

Tên thành viên b che b i bi n c c b

Ví d : Point(int xVal, int yVal) {

Point::xVal = xVal;

Point::yVal = yVal;

}

ng ng vi c gán giá tr li u thành viên.

class Image 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)

{ // }

class Point {

int xVal, yVal;

public:

Point (int x, int y) { xVal = x;

yVal = y;

} // ………

};

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

{ }

Trang 7

TPT - LTH T 25

8/30/2009

ng d li u thành viên:

class Image Image {

public:

Image(const int w, const int h);

private:

const int const int width;

const int const int height;

//

};

Image::Image (const int w, const int h)

: width(w), height(h) { // }

Khai báo bình th ng

nh d li u thành viên

class Image Image {

const int width = 256;

const int height = 168;

//

};

Kh i t o

SAI

Kh i t o ÚNG thông qua danh sách

kh i t o thành viên

8/30/2009

ng i t ng: không c thay i giá tr

Hàm thành viên h ng:

c phép g i trên h ng i t ng.

Không c thay i giá tr li u thành viên.

class Set Set { public:

Set(void){ card = 0; } Bool Member(const int) const;

void AddElem(const int);

//

};

Bool Set::Member (const int elem) const { //

}

void main() { const Set s;

s.AddElem(10); // SAI s.Member(10); // ok

}

li u thành viên t nh:

Dùng chung 1 b n sao chép (1 vùng nh ) chia s

cho t t c i t ng c a l p ó.

ng: <TênL p>::<TênD Li uThànhViên>

Th ng dùng m s ng i t ng.

class Window Window {

// danh sách liên k t t t c Window static Window *first;

// con tr i window k ti p Window *next;

//

};

Window *Window:: Window:: first = &myWindow;

// ……….

Kh i t o

li u thành viên nh Khai báo

Hàm thành viên t nh:

ng ng v i hàm toàn c c.

i thông qua: <TênL p>::<TênHàm>

class Window Window { // ……….

static void PaintProc () { … } // ………

};

void main() { // ……….

Window::PainProc();

}

Truy xu t hàm thành viên t nh

Khai báo

nh ngh a hàm thành viên t nh

Trang 8

TPT - LTH T 29

8/30/2009

class Image {

int width;

int height;

int &widthRef = width;

//

};

Tham chi u d li u thành viên:

class Image {

int width;

int height;

int &widthRef;

//

};

Image::Image (const int w, const int h)

: widthRef(width) { //……… }

Khai báo bình th ng

nh d li u thành viên

Kh i t o

SAI

Kh i t o ÚNG thông qua danh sách

kh i t o thành viên

8/30/2009

li u thành viên có th có ki u:

li u (l p) chu n c a ngôn ng

p do ng i dùng nh ngh a (có th là chính l p ó).

class Point { …… };

class Rectangle 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) { }

Kh i t o cho các

li u thành viên qua danh sách

kh i t o thành viên

ng hàm xây d ng không i s (hàm

xây d ng m c nhiên - default constructor).

VD: Point pentagon[5];

ng b kh i t o m ng:

VD: Point triangle[3] =

{ Point(4,8), Point(10,20), Point(35,15) };

Ng n g n:

Set s[4] = { 10, 20, 30, 40 };

Set s[4] = { Set(10), Set(20), Set(30), Set(40) };

ng d ng con tr :

p vùng nh :

VD: Point *pentagon = new Point[5];

Thu h i vùng nh :

delete[] pentagon;

delete pentagon; // Thu h i vùng nh u

class Polygon Polygon { public:

//

private:

Point *vertices; // các nh int nVertices; // s các nh };

Không c n bi t kích th c m ng.

Trang 9

TPT - LTH T 33

8/30/2009

Thành viên trong 1 l p:

Che các th c th trùng tên trong ph m vi.

// ………

int fork (void); // fork h th ng

class Process Process {

int fork (void); // fork thành viên //

};

// ………

int Process::func1 (void)

{ int x = fork(); // g i fork c c b

int pid = :: fork(); // g i hàm fork h th ng

//

}

fork thành viên che i fork toàn c c trong ph m vi l p Process

8/30/2009

p toàn c c: i a s p trong C++.

p l ng nhau: p ch a ng l p.

p c c b : trong 1 hàm ho c 1 kh i.

class Rectangle Rectangle { // L p l ng 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 ngoài

void Render (Image &i) {

class ColorTable ColorTable { public:

ColorTable () { /* */ } AddEntry (int r, int g, int b) { /* */ }

//

};

ColorTable colors;

//

} ColorTable ct; // SAI

u trúc (structure):

t ngu n t ngôn ng C.

ng ng v i class i các thu c tính là public.

ng nh class.

struct Point Point {

Point (int, int);

void OffsetPt(int, int);

int x, y;

};

class Point Point { public:

Point(int, int);

void OffsetPt(int, int);

int x, y;

};

Point p = { 10, 20 }; Có th kh i t o d ng này

u không có nh ngh a hàm xây d ng

p (union):

t c thành viên ánh x n cùng 1 a ch bên trong i t ng chính nó (không liên ti p).

Kích th c = kích th c c a d li u l n nh t.

union Value Value {

long integer;

double real;

char *string;

Pair list;

//

};

Kích th c c a Value là

8 bytes = sizeof(double)

class Pair Pair {

Value *head;

Value *tail;

//

};

class Object Object { private:

enum ObjType {intObj, realObj,

strObj, listObj}; ObjType type; // ki u i t ng Value val; // giá tr a i t ng //

};

Trang 10

TPT - LTH T 37

8/30/2009

u khi n i t ng c bit.

VD: Truy xu t các bit trong header c a gói tin.

typedef unsigned int Bit Bit ;

class Packet Packet {

Bit type : 2; // r ng 2 bit

Bit acknowledge : 1; // r ng 1 bit

Bit channel : 4; // r ng 4 bit

Bit sequenceNo : 4; // r ng 4 bit

Bit moreData : 1; // r ng 1 bit

//

};

enum PacketType { dataPack, controlPack,

supervisoryPack };

enum Bool { false, true };

// …………

Packet p;

p.type = controlPack;

p.acknowledge = true;

8/30/2009

Ngày đăng: 03/01/2016, 10:22

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm