Tải bản đầy đủ (.pdf) (80 trang)

Bài giảng: Lập trình hướng đối tượng pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (736.3 KB, 80 trang )

1
 
Các khái nim c s


Ni dung
Các khái nim

i tng, lp

Thuc tính và phng thc

Thông ip và truyn thông ip

Tính bao gói, tính k tha, tính a hình
2


i Tng (Object)

i tng: là mt
thc th mà chúng ta
quan sát, bao gm
các trng thái, các
c im, hành vi.

Trong h thng
hng i tng, mi
th u là i tng



i Tng Th Gii Thc
(Real Object)

Mt i tng th gii thc là mt thc th
c th mà thông thng bn có th s, nhìn
thy hay cm nhn c.

Tt c có trng
thái (state) và
hành ng
(behaviour)
3


i Tng Phn Mm
(Software Object)

Các i tng phn mm có th c dùng
 biu din các i tng th gii thc.

Cng có trng thái và
hành ng

Trng thái: thuc tính
(attribute; property)

Hành ng: phng thc
(method)



i Tng
i tng (object) là mt
thc th phn mm bao
gm các
thuc tính và
các phng thc liên
quan.
i tng phn mm i tng phn mm Sinh Viên
Thuc tính c xác nh
bi giá tr c th gi là
thuc tính th hin.
Mt i tng c th
c gi là mt th hin.
I TNG = THUC TÍNH + PHNG THC
C:8
Nguyn
Vn Tráng
MSSV:1234
Tên: Tèo
Gii tính:
Nam
Hc
bài
KMH
Kim tra
Ng
4


Lp (Class)


Trong th gii thc có nhiu i tng cùng loi.

Chng trình hng i tng có nhiu i tng
cùng loi chia s nhng c im chung.

Ví d


Lp Là Gì?

Mt lp là mt thit k hay m u (prototype) cho các i tng
cùng kiu

Ví d: lp SinhVien là mt thit k chung cho nhiu i tng
sinh viên c to ra

Lp nh ngh!a các thuc tính và các phng thc chung cho
tt c các i tng ca cùng mt loi nào ó

Mt i tng là mt th hin c th ca mt lp.

Ví d: m∀i i tng sinh viên là mt th hin ca lp SinhVien

M∀i th hin có th có nhng thuc tính th hin khác nhau

Ví d: mt sinh viên có th ang hc bài trong khi mt sinh viên
khác có th là ang ng.
5



Lp SinhVien
Khai báo cho lp
SinhVien
i tng ca lp
SinhVien
a ch#
MSSV
Tên
Gii tính
Hc
bài
KMH
Kim tra
Ng
C:8 Nguyn
V∃n Tráng
MSSV:1234
Tên: Tí
Gii tính: Nam
Hc bài
KMH
Kim tra
ang hc bài
Ng
C:10
Phm Ngc
Thch
MSSV:0000
Tên: Tèo

Gii tính: Nam
Hc bài
KMH
Kim tra
ang ng
Ng


Lp & Th hin ca Lp
a ch#
MSSV
Tên
Gii tính
Hc
bài
KMH
Kim tra
Ng
C:8 Nguyn
V∃n Tráng
MSSV:1234
Tên: Tí
Gii tính: Nam
Hc bài
KMH
Kim tra
ang hc bài
Ng
Class
Instance of class

6


Thuc Tính Lp
& Phng Thc Lp

Thuc tính lp (class attribute) là mt th
ành phn
d
liu liên kt vi mt lp c th. Nó c nh ngh!a bên
trong nh ngh!a lp và c s% dng bi tt c các th
hin ca lp.

Phng thc lp (class method) là mt th hin cách
thc thc thi hành vi nào ó ca i tng. Tt c các
phng thc lp nh hng n toàn b lp ch không
nh hng n mt lp riêng r& nào.


Thuc Tính
& Phng Thc

Thuc tính (attribute) là d liu trình bày các
c im v mt i tng.

Phng thc (method) có liên quan ti
nhng th mà i tng có th làm. Mt
phng thc áp ng mt chc n∃ng tác
ng lên d liu ca i tng (thuc tính).
7



Thông ip
& Truyn Thông ip

Thông ip (message) là mt li yêu cu
mt hot ng. Gm có:

i tng nh∋n thông ip

Tên ca phng thc thc hin

Các tham s mà phng thc cn

Truyn thông ip: mt i tng triu gi
mt hay nhiu phng thc ca i tng
khác  yêu cu thông tin.


Tru tng hoá (Abstraction)

Là quá trình loi b( 1 s chi tit không quan
trng  t∋p trung vào c tính ct lõi.

Chú ý n nhng gì (WHAT) phng
thc/i tng thc hin, không quan tâm
n cách thc hin (HOW).
8



Tính Bao Gói
(Encapsulation)

óng gói (encapsulation) là tin trình che
giu vic thc thi chi tit ca mt i tng.


n Thông Tin
(Information Hiding)

óng gói  Thuc tính c lu tr hay
phng thc c cài t nh th nào 
c che giu i t các i tng khác
Vic che giu nhng chi
tit thit k và cài t t
nhng i tng khác
c gi là
n thông tin
9


Tính K Tha
(Inheritance)

H thng hng i tng cho phép các lp
c nh ngh!a k tha t các lp khác

Ví d, lp
SinhVien
SinhVien và lp

GiangVien
GiangVien là nhng
lp con (subclass) ca lp
ConNguoi
ConNguoi.

Tha k ngh!a là các phng thc và các
thuc tính c nh ngh!a trong mt lp có
th c tha k hoc c s% dng li bi
lp khác.


Tính a Hình
(Polymorphism)

a hình: “nhiu hình thc”, hành ng cùng
tên có th c thc hin khác nhau i vi
các i tng/các lp khác nhau.

Ng cnh khác  kt qu khác
ng Th)ng Hình Trònim Hình Vuông
V&
10


Bài tp

T∋p phân tích mt i tng  xác nh
thuc tính và hành vi: Viên gch trong trò
chi xp gch, phân s, ma tr∋n…



11


Lp

Lp

Khai báo, nh ngh!a 1 lp n gin

Hàm xây dng (constructor)

Hàm hy (destructor)

Hàm bn (friend) – Lp bn

i s mc nh

i s thành viên ∗n (con tr( this)


Khái nim lp

Lp: kiu d liu tru tng.
TÊN L
TÊN L


P

P
D liu
thành viên
Hàm
thành viên
c t
i
tng
T∋p các
thao tác
class
TÊNL
TÊNL


P
P
[
: <Quyn truy xut>
L
L


PCHA
PCHA ]
{ <Quyn truy xut > :
DataType1 memberdata1;
DataType2 memberdata2;
…………….
<

Quyn truy xut > :
memberFunction1();
memberFunction2();
…………
};
private
protected
public
12


Lp Point
Point
Point
Int xVal, yVal;
setPoint(int x, int y);
MovePt(int x, int y)
TÊN L
TÊN L


P
P
D liu
thành viên
Hàm
thành viên


Ví d lp

class
Point
Point {
int xVal, yVal;
public:
void SetPt (int, int);
void Move (int, int);
};
void
Point
Point::SetPt (int x, int y) {
xVal = x;
yVal = y;
}
void
Point
Point::Move (int x, int y) {
xVal += x;
yVal += y;
}
void main() {
Point pt;
pt.SetPt(10,20);
pt.Move(2,2);
……
}
Gi hàm
trên
i tng
To ra

i tng
thuc lp
Point
Khai báo
Lp
nh ngh!a
các hàm
thành viên
13


Phm vi lp và truy xut các thành viên
lp

Trong phm vi lp các thành viên có th c trc
tip bi tt c các hàm thành viên ca lp ó.

Ngoài phm vi lp các thành viên c tham chiu
thông qua tên ca i tng, tham chiu i tng,
hoc con tr( i tng.

Bin c khai báo trong hàm thành viên c xem
nh là bin cc b ca hàm thành viên ó.

Nu trong hàm thành viên, bin c khai báo trùng
vi tên thuc tính (bin thành viên ca lp) thì bin
thành viên b che i và c truy xut bi toán t%
nh v.



Toán t phm vi

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

C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;
}
14


Ví d
#include <iostream.h>
class Point{
public:
int x, y;

void setPt(int x, int y);
void MovePt(int x, int y);
void Print(){
cout<< “(” << x << “,” << y<< “)” << endl;
}
};
void Point::setPt(int x, int y){
Point::x = x;
Point::y = y;
}
void Point::setPt(int x, int y){
Point::x = Point::x + x;
Point::y = Point::y + y;
}


void main(){
Point point; // to i tng point
Point *pointPtr = &point; // con tr( tr( ti point
Point &pointRef = point; // tham chiu ti point
cout<<“Su dung ten doi tuong de truy xuat”;
point.setPt(1,4);
point.Print();
cout<<“Su dung con tr
( doi tuong de truy xuat”;
pointPtr->setPt(3,5);
pointPtr->Print();
cout<<“Su dung tham chieu de truy xuat”;
pointRef.setPt(4,2);
pointRef.Print();

}
 
15


Phm vi lp

Lp toàn cc:
i a s lp trong C++.

Lp lng nhau:
lp cha ng lp.

L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


Các t khoá modifier

public:

protected:

private:
16


Hàm khi to (Contructor)


Có tên trùng vi tên lp, không có kiu tr v.

Không gi trc tip, s& c t ng gi khi khi to t.


G
G
á
á
n
n
gi
gi
á
á
tr
tr


,
,
c
c


p
p
v
v
ù

ù
ng
ng
nh
nh

 cho các
d
d


li
li


u
u
th
th
à
à
nh
nh
viên
viên.

Hàm khi to mc nh t ng to ra nu trong lp
cha có hàm khi to
class
Point

Point {
int xVal, yVal;
public:
Point (int x, int y) {
xVal = x; yVal = y;
}
void MovePt (int x, int y) {
xVal += x; yVal += y;
}
};
void main() {
Point pt1(10,20);
pt1.MovePt(2,2);
……
// Khai báo nào là sai ?
Point pt2;
Point pt3();
Point pt4 = Point(5,5);
Point pt5 = new Point(5,5);
……….
}


Hàm khi to
class
Point
Point {
int xVal, yVal;
public:
Point (){

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 Move (int x, int y){….}
};
void main() {
Point p1;
Point p2(10,20);
Point p3(60.3, 3.14);
}
17


Hàm hy

Dn d+p 1 i tng
tr
tr


c
c
khi
khi nó c thu hi.


Cú pháp: ~TenLop() { …… }

Không gi trc tip, s& c t ng gi khi hy b( t.


Thu
Thu
h
h


i
i
v
v
ù
ù
ng
ng
nh
nh

 cho các
d
d


li
li



u
u
th
th
à
à
nh
nh
viên
viên là
con
con
tr
tr

.
class
Set
Set {
private:
int *elems;
int maxCard;
int card;
public:
Set(const int size) { …… }
~Set() { delete elems; }
….
};

void TestFunct1(Set s1) {
Set *s = new Set(50);
}
void main() {
Set s1(40), s2(50);
TestFunct1(s1);
}
T,ng cng

bao
bao
nhiêu
nhiêu
l
l


n
n hàm hy
c gi ?


   

i s m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() {
−−−−−./012 p1; // nh là−333
−−−−−./012 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() {
−−−−−./012 p2(1.6, 5.0); −−−−44−nh là−333
−−−−−./012−−−53(10,20); −−−−−−−44−nh là ???
Point p4; // ?????

}
18


Danh sách khi to thành viên


Tng ng vic gán giá tr d 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
Point {
int xVal, yVal;
public:
Point (int x, int y) {
xVal = x;
yVal = y;
}
// ……………………

};
Point::Point (int x, int y)
:
xVal(x), yVal(y)
{ }


Bài tp

Vit lp Stack
19


Hàm khi to sao chép
#include <iostream>
class Person {
public: int age;
Person(int age) : age(age) {}
};
void main() {
Person timmy(10);
Person sally(15);
Person timmy_clone = timmy;
cout << timmy.age << " " << sally.age << " " << timmy_clone.age << endl;
timmy.age = 23;
cout << timmy.age << " " << sally.age << " " << timmy_clone.age << endl;
}
10 15 10
23 15 10



Hàm khi to sao chép
#include <iostream>
class Person {
public: int age;
Person(int age) : age(age) {}
Person(Person const& copy) : age(copy.age) {}
};
void main() {
Person timmy(10);
Person sally(15);
Person timmy_clone = timmy;
cout << timmy.age << " " << sally.age << " " << timmy_clone.age << endl;
timmy.age = 23;
cout << timmy.age << " " << sally.age << " " << timmy_clone.age << endl;
}
20


Hàm khi to sao chép
#include <iostream.h>
class Array {
public: int size;
int* data;
Array(int size) : size(size), data(new int[size]) {}
~Array() { delete data; }
};
int main() {
Array first(20);
first.data[0] = 25;

Array copy = first;
cout << first.data[0] << " " << copy.data[0] << endl;
first.data[0] = 10;
cout << first.data[0] << " " << copy.data[0] << endl;
}


Hàm khi to sao chép
#include <iostream.h>
class Array {
public: int size;
int* data;
Array(int size) : size(size), data(new int[size]) {}
~Array() { delete data; }
Array(const Array &copy) : size(copy.size), data(copy.data) {}
//t ng to
};
int main() {
Array first(20);
first.data[0] = 25;
Array copy = first;
cout << first.data[0] << " " << copy.data[0] << endl;
first.data[0] = 10;
cout << first.data[0] << " " << copy.data[0] << endl;
}
21


Hàm khi to sao chép
#include <iostream.h>

#include <string.h>
class Array {
public: int size;
int* data;
Array(int size) : size(size), data(new int[size]) {}
~Array() { delete data; }
Array(const Array &copy)
: size(copy.size), data(new int[copy.size]) {
memcpy((void*)data, copy.data, sizeof(copy.data));
}
};
int main() {
Array first(20);
first.data[0] = 25;
Array copy = first;
cout << first.data[0] << " " << copy.data[0] << endl;
first.data[0] = 10;
cout << first.data[0] << " " << copy.data[0] << endl;
}


Phng thc chng(Overloading)
class PhanSo {
private:
int tuso, mauso;
public :
PhanSo(int t=0, int m=1) : tuso(t), mauso(m){}
PhanSo Cong(PhanSo);
PhanSo Cong(PhanSo , PhanSo);
float layGiatri();

void gianUoc();
void Print();
};
22


#include "PhanSo.h"
#include <iostream.h>
PhanSo PhanSo::Cong(PhanSo p){
PhanSo q;
q.tuso = tuso*p.mauso+mauso*p.tuso;
q.mauso = mauso*p.mauso;
q.gianUoc();
return q;
}
PhanSo PhanSo::Cong(PhanSo p, PhanSo q){
PhanSo res;
res.tuso = q.tuso*p.mauso+q.mauso*p.tuso;
res.mauso = q.mauso*p.mauso;
res.gianUoc();
return res;
}
float PhanSo::layGiatri(){
return (float)tuso/mauso;
}
void PhanSo::Print(){
cout<<tuso<<"/"<<mauso<<"="<<
this->layGiatri()<<endl;
}
void PhanSo::gianUoc(){

if(tuso==mauso){
tuso=1; mauso=1;
}else{
int tu = tuso, mau=mauso;
do{
if(tu>mau) tu=tu-mau;
else mau = mau-tu;
}while(tu!=mau);
tuso = tuso/tu;
mauso = mauso/mau;
}
}
void main()
{
PhanSo p(4,5), p1(1,3);
p.Print();
p1.Print();
PhanSo res =
p.Cong(p,p1);
res.Print();
p.Cong(p1);
p.Print()
}


Tham tr
class Point
{
int xVal, yVal;
public:

Point(){xVal = 0; yVal = 0;}
Point(int, int){
xVal = x; yVal = y;
}
void PrintPt();
void InputPoint(Point p);
~Point(){}
};
void Point::PrintPt(){
cout<<“(”<<xVal<<“,”
<<yVal<<“)”endl;
}
void Point::InputPoint(
Point p){
cout<<"Nhap x"; cin>>p.xVal;
cout<<"Nhap y"; cin>>p.yVal;
}
void main(){
Point p1,p2;
p1.InputPoint(p2);
}
23


Tham chiu
class Point
{
int xVal, yVal;
public:
Point(){xVal = 0; yVal = 0;}

Point(int, int){
xVal = x; yVal = y;
}
void PrintPt();
void InputPoint(Point &p);
~Point(){}
};
void Point::PrintPt(){
cout<<“(”<<xVal<<“,”
<<yVal<<“)”endl;
}
void Point::InputPoint(
Point &p){
cout<<"Nhap x"; cin>>p.xVal;
cout<<"Nhap y"; cin>>p.yVal;
}
void main(){
Point p1,p2;
p1.InputPoint(p2);
}


  

H6ng d liu thành viên:
class
Image
Image {
public:
Image(const int w, const int h);

private:
const
const
int
int width;
const
const
int
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
24


  


H6ng i tng:
không c thay ,i giá tr.

Hàm thành viên h6ng:

c phép gi trên h6ng i tng.

Không c thay ,i giá tr d liu thành viên.
class
Point
Point {
private:
int xVal, yVal;
public:
Point(int x, int y):
xVal(x), yVal(y){}
void PrintPt() const;
void SetPt(int x, int y){
xVal = x; yVal = y;
}
};
void Point::PrintPt () const
{ //
}
void main() {
const Point p(10,13);
p.SetPt(10,14); // SAI
p.PrintPt(); // úng
}



Bài tp

Vit 1 class qun lý t∋p hp các s nguyên. T∋p
hp này có th thc hin các chc n∃ng sau:

Khi to t∋p hp

Kim tra 1 s nguyên có phi là phn t% ca t∋p hp không

Thêm mt phn t% vào t∋p hp

Xoá 1 mt t% ra kh(i t∋p hp

Sao chép các pt% t t∋p hp này sang t∋p hp khác. (1
pthc truyn 1 tham s, 1 pthc truyn 2 tham s)

To mt phng thc sao chép constructor

Giao 2 t∋p hp

Hi 2 t∋p hp

Xut t∋p hp ra màn hình (khai báo hàm h6ng)

Thc hin to ra b s liu  test các chc n∃ng trên.
/>25



Ví d: Tp các s nguyên
class IntSet{
private: int *elems;
int num,max;
public:
IntSet();
IntSet(int);
int IsMember(const int);
void AddElem(const int);
void RmvElem(const int);
void Copy(IntSet&);
int Equal(IntSet&);
void Interset(IntSet&, IntSet&);
void Union(IntSet&, IntSet&);
void Print();
void IntSet::SetToReal(RealSet &set);
~IntSet(){ }
};
IntSet::IntSet(int size){
max = size; num=0;
elems = new int[size];
}
IntSet::IntSet(){
elems = new int[100];
num = 100;
}
int IntSet::IsMember(const int e){
for(int i=0; i<num; i++)
if(elems[i]==e)
return 1;

return 0;
}
…….


Ví d: Tp các s thc
class RealSet{
private: int *elems;
int num, max;
public:
RealSet();
RealSet(int);
void EmptySet(){num =0;}
int IsMember(const float);
void AddElem(const float);
void RmvElem(const float);
void Copy(RealSet&);
int Equal(RealSet&);
void Interset(RealSet&, RealSet&);
void Union(RealSet&, RealSet&);
void Print();
~RealSet(){ }
};
RealSet::RealSet(int size){
max = size; num=0
elems = new float[size];
}
RealSet::RealSet(){
num = 100;
elems = new float[100];

}
int RealSet::IsMember(const float e){
for(int i=0; i<num; i++)
if(elems[i]==e)
return 1;
return 0;
}
…….

×