1
Các khái nim c s
Ni dung
Các khái nim
i tng, lp
Thuc tính và phng thc
Thông ip và truyn thông ip
Tính bao gói, tính k tha, tính a hình
2
i Tng (Object)
i tng: là mt
thc th mà chúng ta
quan sát, bao gm
các trng thái, các
c im, hành vi.
Trong h thng
hng i tng, mi
th u là i tng
i Tng Th Gii Thc
(Real Object)
Mt i tng th gii thc là mt thc th
c th mà thông thng bn có th s, nhìn
thy hay cm nhn c.
Tt c có trng
thái (state) và
hành ng
(behaviour)
3
i Tng Phn Mm
(Software Object)
Các i tng phn mm có th c dùng
biu din các i tng th gii thc.
Cng có trng thái và
hành ng
Trng thái: thuc tính
(attribute; property)
Hành ng: phng thc
(method)
i Tng
i tng (object) là mt
thc th phn mm bao
gm các
thuc tính và
các phng thc liên
quan.
i tng phn mm i tng phn mm Sinh Viên
Thuc tính c xác nh
bi giá tr c th gi là
thuc tính th hin.
Mt i tng c th
c gi là mt th hin.
I TNG = THUC TÍNH + PHNG THC
C:8
Nguyn
Vn Tráng
MSSV:1234
Tên: Tèo
Gii tính:
Nam
Hc
bài
KMH
Kim tra
Ng
4
Lp (Class)
Trong th gii thc có nhiu i tng cùng loi.
Chng trình hng i tng có nhiu i tng
cùng loi chia s nhng c im chung.
Ví d
Lp Là Gì?
Mt lp là mt thit k hay m u (prototype) cho các i tng
cùng kiu
Ví d: lp SinhVien là mt thit k chung cho nhiu i tng
sinh viên c to ra
Lp nh ngh!a các thuc tính và các phng thc chung cho
tt c các i tng ca cùng mt loi nào ó
Mt i tng là mt th hin c th ca mt lp.
Ví d: m∀i i tng sinh viên là mt th hin ca lp SinhVien
M∀i th hin có th có nhng thuc tính th hin khác nhau
Ví d: mt sinh viên có th ang hc bài trong khi mt sinh viên
khác có th là ang ng.
5
Lp SinhVien
Khai báo cho lp
SinhVien
i tng ca lp
SinhVien
a ch#
MSSV
Tên
Gii tính
Hc
bài
KMH
Kim tra
Ng
C:8 Nguyn
V∃n Tráng
MSSV:1234
Tên: Tí
Gii tính: Nam
Hc bài
KMH
Kim tra
ang hc bài
Ng
C:10
Phm Ngc
Thch
MSSV:0000
Tên: Tèo
Gii tính: Nam
Hc bài
KMH
Kim tra
ang ng
Ng
Lp & Th hin ca Lp
a ch#
MSSV
Tên
Gii tính
Hc
bài
KMH
Kim tra
Ng
C:8 Nguyn
V∃n Tráng
MSSV:1234
Tên: Tí
Gii tính: Nam
Hc bài
KMH
Kim tra
ang hc bài
Ng
Class
Instance of class
6
Thuc Tính Lp
& Phng Thc Lp
Thuc tính lp (class attribute) là mt th
ành phn
d
liu liên kt vi mt lp c th. Nó c nh ngh!a bên
trong nh ngh!a lp và c s% dng bi tt c các th
hin ca lp.
Phng thc lp (class method) là mt th hin cách
thc thc thi hành vi nào ó ca i tng. Tt c các
phng thc lp nh hng n toàn b lp ch không
nh hng n mt lp riêng r& nào.
Thuc Tính
& Phng Thc
Thuc tính (attribute) là d liu trình bày các
c im v mt i tng.
Phng thc (method) có liên quan ti
nhng th mà i tng có th làm. Mt
phng thc áp ng mt chc n∃ng tác
ng lên d liu ca i tng (thuc tính).
7
Thông ip
& Truyn Thông ip
Thông ip (message) là mt li yêu cu
mt hot ng. Gm có:
i tng nh∋n thông ip
Tên ca phng thc thc hin
Các tham s mà phng thc cn
Truyn thông ip: mt i tng triu gi
mt hay nhiu phng thc ca i tng
khác yêu cu thông tin.
Tru tng hoá (Abstraction)
Là quá trình loi b( 1 s chi tit không quan
trng t∋p trung vào c tính ct lõi.
Chú ý n nhng gì (WHAT) phng
thc/i tng thc hin, không quan tâm
n cách thc hin (HOW).
8
Tính Bao Gói
(Encapsulation)
óng gói (encapsulation) là tin trình che
giu vic thc thi chi tit ca mt i tng.
n Thông Tin
(Information Hiding)
óng gói Thuc tính c lu tr hay
phng thc c cài t nh th nào
c che giu i t các i tng khác
Vic che giu nhng chi
tit thit k và cài t t
nhng i tng khác
c gi là
n thông tin
9
Tính K Tha
(Inheritance)
H thng hng i tng cho phép các lp
c nh ngh!a k tha t các lp khác
Ví d, lp
SinhVien
SinhVien và lp
GiangVien
GiangVien là nhng
lp con (subclass) ca lp
ConNguoi
ConNguoi.
Tha k ngh!a là các phng thc và các
thuc tính c nh ngh!a trong mt lp có
th c tha k hoc c s% dng li bi
lp khác.
Tính a Hình
(Polymorphism)
a hình: “nhiu hình thc”, hành ng cùng
tên có th c thc hin khác nhau i vi
các i tng/các lp khác nhau.
Ng cnh khác kt qu khác
ng Th)ng Hình Trònim Hình Vuông
V&
10
Bài tp
T∋p phân tích mt i tng xác nh
thuc tính và hành vi: Viên gch trong trò
chi xp gch, phân s, ma tr∋n…
11
Lp
Lp
Khai báo, nh ngh!a 1 lp n gin
Hàm xây dng (constructor)
Hàm hy (destructor)
Hàm bn (friend) – Lp bn
i s mc nh
i s thành viên ∗n (con tr( this)
Khái nim lp
Lp: kiu d liu tru tng.
TÊN L
TÊN L
P
P
D liu
thành viên
Hàm
thành viên
c t
i
tng
T∋p các
thao tác
class
TÊNL
TÊNL
P
P
[
: <Quyn truy xut>
L
L
PCHA
PCHA ]
{ <Quyn truy xut > :
DataType1 memberdata1;
DataType2 memberdata2;
…………….
<
Quyn truy xut > :
memberFunction1();
memberFunction2();
…………
};
private
protected
public
12
Lp 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 liu
thành viên
Hàm
thành viên
Ví d lp
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);
……
}
Gi hàm
trên
i tng
To ra
i tng
thuc lp
Point
Khai báo
Lp
nh ngh!a
các hàm
thành viên
13
Phm vi lp và truy xut các thành viên
lp
Trong phm vi lp các thành viên có th c trc
tip bi tt c các hàm thành viên ca lp ó.
Ngoài phm vi lp các thành viên c tham chiu
thông qua tên ca i tng, tham chiu i tng,
hoc con tr( i tng.
Bin c khai báo trong hàm thành viên c xem
nh là bin cc b ca hàm thành viên ó.
Nu trong hàm thành viên, bin c khai báo trùng
vi tên thuc tính (bin thành viên ca lp) thì bin
thành viên b che i và c truy xut bi toán t%
nh v.
Toán t phm vi
Toán t
::
::
dùng xác nh chính xác hàm
(thuc tính) c truy xut thuc lp nào.
Câu lnh: pt.OffsetPt(2,2);
<=> pt.Point::OffsetPt(2,2);
Cn thit trong mt s trng hp:
Cách gi hàm trong tha k.
Tên thành viên b che bi bin cc 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; // to i tng point
Point *pointPtr = &point; // con tr( tr( ti point
Point &pointRef = point; // tham chiu ti 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
Phm vi lp
Lp toàn cc:
i a s lp trong C++.
Lp lng nhau:
lp cha ng lp.
Lp cc b:
trong 1 hàm hoc 1 khi.
class
Rectangle
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 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 khi to (Contructor)
Có tên trùng vi tên lp, không có kiu tr v.
Không gi trc tip, s& c t ng gi khi khi to 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 khi to mc nh t ng to ra nu trong lp
cha có hàm khi to
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 khi to
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 hy
Dn d+p 1 i tng
tr
tr
c
c
khi
khi nó c thu hi.
Cú pháp: ~TenLop() { …… }
Không gi trc tip, s& c t ng gi khi hy 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 cng
có
bao
bao
nhiêu
nhiêu
l
l
n
n hàm hy
c gi ?
i s mc nh tính t bên phi.
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 khi to thành viên
Tng ng vic gán giá tr d liu 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 tp
Vit lp Stack
19
Hàm khi to 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 khi to 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 khi to 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 khi to 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 ©) : size(copy.size), data(copy.data) {}
//t ng to
};
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 khi to 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 ©)
: 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;
}
Phng thc chng(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 chiu
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 liu 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 thng
nh d liu thành viên
class
Image
Image {
const int width = 256;
const int height = 168;
//
};
Khi to
SAI
Khi to ÚNG
24
H6ng i tng:
không c thay ,i giá tr.
Hàm thành viên h6ng:
c phép gi trên h6ng i tng.
Không c thay ,i giá tr d liu 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 tp
Vit 1 class qun lý t∋p hp các s nguyên. T∋p
hp này có th thc hin các chc n∃ng sau:
Khi to t∋p hp
Kim tra 1 s nguyên có phi là phn t% ca t∋p hp không
Thêm mt phn t% vào t∋p hp
Xoá 1 mt t% ra kh(i t∋p hp
Sao chép các pt% t t∋p hp này sang t∋p hp khác. (1
pthc truyn 1 tham s, 1 pthc truyn 2 tham s)
To mt phng thc sao chép constructor
Giao 2 t∋p hp
Hi 2 t∋p hp
Xut t∋p hp ra màn hình (khai báo hàm h6ng)
Thc hin to ra b s liu test các chc n∃ng trên.
/>25
Ví d: Tp 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: Tp các s thc
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;
}
…….