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

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 5 docx

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 (13.23 MB, 10 trang )

1
Chương 5:
TẠO ĐỐI TƯỢNG
Giáo viên: Võ Hồng Bảo Châu
Khoa CNTT trường ĐH Lạc Hồng
LẬP TRÌNH
HƯỚNG ĐỐI TƯỢNG
MỤC TIÊUMỤC TIÊU
• Nắm rõ hơn về các trường hợp tạo đối tượng.
• Hiểu và sử dụng con trỏ this
• Hiểu được khái niệm static, viết một vài chương trình
sử dụng biến và phương thức static.
• Nắm vững khái niệm và cách sử dụng hàm friend
2
OOP-CHƯƠNG 5-TAO DOI TUONG
NỘI DUNG CHI TIẾTNỘI DUNG CHI TIẾT
• CÁCH KHAI BÁO BIẾN
• CÁCH CẤP PHÁT BỘ NHỚ
• ĐỐI TƯỢNG LÀ THÀNH PHẦN CỦA LỚP
• CON TRỎ THIS
• LỚP CÓ DỮ LIỆU STATIC
• HÀM FRIEND
• CON TRỎ THIS
3
OOP-CHƯƠNG 5-TAO DOI TUONG
TẠO 1 ĐỐI TƯỢNG BẰNG CÁCH KHAI BÁO BIẾNTẠO 1 ĐỐI TƯỢNG BẰNG CÁCH KHAI BÁO BIẾN
• Dùng phương thức thiết lập chuẩn
Ví dụ:
VECTOR a;
• Sử dụng phương thức thiết lập có tham số
Ví dụ:


VECTOR a(10), b(10,3.5);
• Tạo đối tượng từ đối tượng đã có – Tạo bản sao
Ví dụ:
VECTOR a;
VECTER b(a)
VECTOR a;
VECTOR b = a;
4
OOP-CHƯƠNG 5-TAO DOI TUONG
2
TẠO NHIỀU ĐỐI TƯỢNG BẰNG CÁCH KHAI BÁO BIẾNTẠO NHIỀU ĐỐI TƯỢNG BẰNG CÁCH KHAI BÁO BIẾN
• Sử dụng phương thức thiết lập chuẩn
Ví dụ:
VECTOR a[5];
• Sử dụng phương thức thiết lập có một tham số
Ví dụ:
VECTOR a[2]={10,20};
• Sử dụng phương thức thiết lập nhiều tham số
Ví dụ:
VECTOR a[2]={VECTOR(10,3.5),VECTOR(20,1.6};
5
OOP-CHƯƠNG 5-TAO DOI TUONG
Đối tượng là thành phần của lớpĐối tượng là thành phần của lớp
• Đối tượng có thể là thành phần của đối tượng khác, khi
một đối tượng thuộc lớp “lớn” được tạo ra, các thành phần
của nó cũng được tạo ra. Phương thức thiết lập (nếu có) sẽ
được tự động gọi cho các đối tượng thành phần.
• Nếu đối tượng thành phần phải được cung cấp tham số khi
thiết lập thì đối tượng kết hợp (đối tượng lớn) phải có
phương thức thiết lập để cung cấp tham số thiết lập cho

các đối tượng thành phần.
6
OOP-CHƯƠNG 5-TAO DOI TUONG
VÍ DỤVÍ DỤ
class Diem{
double x,y;
public:
Diem(double xx, double yy) {x = xx; y = yy;}
//
};
class TamGiac{
Diem A,B,C;
public:
//
};
void main(){
TamGiac t; // Bao sai
7
OOP-CHƯƠNG 5-TAO DOI TUONG
Đối tượng là thành phần của lớpĐối tượng là thành phần của lớp
• Cú pháp để khởi tạo đối tượng thành phần là dùng dấu hai
chấm (:) theo sau bởi tên thành phần và tham số khởi tạo.
• Khi đối tượng kết hợp bị huỷ đi thì các đối tượng thành
phần của nó cũng bị huỷ đi, nghĩa là phương thức huỷ bỏ
sẽ được gọi cho các đối tượng thành phần, sau khi
phương thức huỷ bỏ của đối tượng kết hợp được gọi.
8
OOP-CHƯƠNG 5-TAO DOI TUONG
3
class Diem

{
double x,y;
public:
Diem(double xx, double yy {x = xx; y = yy;}
//
};
class TamGiac
{
Diem A,B,C;
public:
TamGiac(double xA, double yA, double xB, double yB, double xC, double
yC):A(xA,yA),B(xB,yB),C(xC,yC){}
void Ve() const;
//
};
void main(){
TamGiac t(100,100,200, 400,300,300);
}
VÍ DỤ
KHỞI TẠO ĐỐI
TƯỢNG THÀNH
PHẦN, DÙNG DẤU
HAI CHẤM
Đối tượng thành
phần
9
OOP-CHƯƠNG 5-TAO DOI TUONG
Đối tượng là thành phần của lớpĐối tượng là thành phần của lớp
• Khi đó trình tự thực hiện của các phương thức thiết lập và
phương thức hủy bỏ theo quy tắc sau:

– Phương thức thiết lập của các lớp thành phần được thực hiện
trước phương thức thiết lập của lớp
– Phương thức hủy bỏ của lớp thành phần thực hiện sau phương
thức hủy bỏ của lớp,
– Trong các thành phần của lớp, thành phần nào được khai báo
trước, phương thức thiết lập sẽ thực hiện trước.
– Trong các thành phần của lớp, thành phần nào được khai báo
trước, phương thức hủy bỏ sẽ thực hiện sau.
10
OOP-CHƯƠNG 5-TAO DOI TUONG
ĐỐI TƯỢNG LÀ THÀNH PHẦN CỦA MẢNGĐỐI TƯỢNG LÀ THÀNH PHẦN CỦA MẢNG
• Sử dụng mảng các đối tượng là một cách tiếp cận truyền
thống.
• Tuy nhiên,
– Có thể sử dụng mảng các đối tượng của lớp ngay chính trong lớp
11
OOP-CHƯƠNG 5-TAO DOI TUONG
Ví dụVí dụ
class SEQUENCE{
double data;
public:
SEQUENCE();
SEQUENCE( SEQUENCE*, int );
void reorder( SEQUENCE*, int );
void out( SEQUENCE*, int );
};
12
OOP-CHƯƠNG 5-TAO DOI TUONG
4
Từ đóTừ đó

class MAIN{
SEQUENCE *u;
public:
MAIN( int = 2 );
~MAIN();
};
MAIN::MAIN( int size ){
u = new SEQUENCE[size];
SEQUENCE a(u,size);
a.reorder( u, size );
a.out( u, size );
}
MAIN::~MAIN(){
delete []u;
}
13
OOP-CHƯƠNG 5-TAO DOI TUONG
void main()
{
MAIN object(5);
}
14
OOP-CHƯƠNG 5-TAO DOI TUONG
TẠO MẢNG
TẠO PTỬ 1 TẠO PTỬ 2 …TẠO PTỬ 3
Gọi
PHƯƠNG THỨC
THIẾT LẬP
Gọi Gọi
Gọi

PHƯƠNG THỨC
THIẾT LẬP
PHƯƠNG THỨC
THIẾT LẬP
PHƯƠNG THỨC
THIẾT LẬP
CÁC PHẦN TỬ PHẢI CÓ KHẢ NĂNG TỰ
KHỞI TẠO
- Lớp không có phương
thức thiết lập.
– Lớp có phương thức
thiết lập không tham số.
– Lớp có phương thức
thiết lập mà mọi tham số
đều có giá trị mặc nhiên
15
OOP-CHƯƠNG 5-TAO DOI TUONG
class Diem {
double x,y;
public:
Diem(double xx, double yy): x(xx),
y(yy) {}
void Set(double xx, double yy) {x =
xx, y = yy;}
//
};
class String {
char *p;
public:
String(char *s) {p = strdup(s);}

String(const String &s) {p = strdup(s.p);}
~String() {
cout << "delete "<< (void *)p << "\n";
delete [] p;
}
//
class SinhVien
{
String MaSo;
String HoTen;
int NamSinh;
public:
SinhVien(char *ht, char *ms, int ns):HoTen(ht), MaSo(ms), NamSinh(ns){}
//
};
String as[3]; // Bao sai
Diem ad[5]; // Bao sai
SinhVien asv[7]; // Bao sai
16
OOP-CHƯƠNG 5-TAO DOI TUONG
5
class Diem
{
double x,y;
public:
Diem(double xx = 0, double yy =
0):x(xx), y(yy){}
void Set(double xx, double yy) {x =
xx, y = yy;}
//

};
class String
{
char *p;
public:
String(char *s = “”) {p = strdup(s);}
String(const String &s) {p = strdup(s.p);}
~String() {cout << "delete "<< (void *)p << "\n";
delete [] p;
}
class SinhVien{
String MaSo;
String HoTen;
int NamSinh;
public:
SinhVien(char *ht = “Nguyen Van A”, char *ms =“19920014”, int ns = 1982):HoTen(ht),
MaSo(ms), NamSinh(ns){}
//
};
String as[3]; // Ok: Ca ba phan tu deu la chuoi rong
Diem ad[5]; // Ok: ca 5 diem deu la (0,0)
SinhVien asv[7]; // Ok: Het sai ca 7 sinh vien deu co cung ten, ma so, nam sinh
Dùng phương thức thiết lập với
tham số có giá trị mặc định
17
OOP-CHƯƠNG 5-TAO DOI TUONG
class Diem
{
double x,y;
public:

Diem(double xx, double yy): x(xx),
y(yy){}
Diem():x(0), y(0){}
//
};
class String
{
char *p;
public:
String(char *s) {p = strdup(s);}
String() {p = strdup(“”);}
~String() {cout << "delete "<< (void *)p << "\n";
delete [] p;
}
class SinhVien {
String MaSo;
String HoTen;
int NamSinh;
public:
SinhVien(char *ht, char *ms, int ns):HoTen(ht),MaSo(ms), NamSinh(ns){}
SinhVien():HoTen(“Nguyen Van A”), MaSo(“19920014”),NamSinh(1982){}
//
};
String as[3]; // Ca ba phan tu deu la chuoi rong
Diem ad[5]; // ca 5 diem deu la (0,0)
SinhVien asv[7];// Ca 7 sinh vien deu co cung hoten,maso, namsinh
Dùng phương thức thiết lập
không tham số
18
OOP-CHƯƠNG 5-TAO DOI TUONG

ĐỐI TƯỢNG ĐƯỢC CẤP PHÁT ĐỘNGĐỐI TƯỢNG ĐƯỢC CẤP PHÁT ĐỘNG
• Đối tượng được cấp phát động là các đối tượng được tạo
ra bằng phép toán new và bị huỷ đi bằng phép toán delete
• Phép toán new cấp đối tượng trong vùng heap (hay vùng
free store) và gọi phương thức thiết lập cho đối tượng
được cấp.
• Dùng new có thể cấp một đối tượng và dùng delete để huỷ
một đối tượng.
• Dùng new và delete cũng có thể cấp nhiều đối tượng và
huỷ nhiều đối tượng
19
OOP-CHƯƠNG 5-TAO DOI TUONG
CẤP VÀ HỦY 1 ĐỐI TƯỢNGCẤP VÀ HỦY 1 ĐỐI TƯỢNG
class Diem {
double x,y;
public:
Diem(double xx, double
yy):x(xx),y(yy){};
//
};
class String {
char *p;
public:
String(char *s) {p = strdup(s);}
String(const String &s) {p = strdup(s.p);}
~String() {delete [] p;}
//
};
int *pi = new int;
int *pj = new int(15);

Diem *pd = new Diem(20,40);
String *pa = new String("Nguyen Van A");
//
delete pa;
delete pd;
delete pj;
delete pi;
Cấp và hủy một đối tượng
20
OOP-CHƯƠNG 5-TAO DOI TUONG
6
CẤP VÀ HỦY NHIỀU ĐỐI TƯỢNGCẤP VÀ HỦY NHIỀU ĐỐI TƯỢNG
• Trong trường hợp cấp nhiều đối tượng, ta không thể cung
cấp tham số cho từng phần tử được cấp:
• int *pai = new int[10];
• Diem *pad = new Diem[5]; // Bao sai
• String *pas = new String[5]; // Bao sai
• Lỗi trên được khắc phục bằng cách cung cấp phương thức
thiết lập để đối tượng có khả năng tự khởi tạo.
21
OOP-CHƯƠNG 5-TAO DOI TUONG
CẤP VÀ HỦY NHIỀU ĐỐI TƯỢNGCẤP VÀ HỦY NHIỀU ĐỐI TƯỢNG
class String
{
char *p;
public:
String(char *s = "Alibaba") {p = strdup(s);}
String(const String &s) {p = strdup(s.p);}
~String() {delete [] p;}
//

};
class Diem
{
double x,y;
public:
Diem(double xx, double yy):x(xx),y(yy){};
Diem():x(0),y(0){};
//
}
Khi đó mọi phần tử được cấp đều được
khởi động với cùng giá trị
int *pai = new int[10];
Diem *pad = new Diem[5];
// ca 5 diem co cung toa do (0,0)
String *pas = new String[5];
// Ca 5 chuoi cung duoc khoi dong bang
“Alibaba”
• Việc huỷ nhiều đối tượng được thực hiện
bằng cách dùng
delete và có thêm dấu [] ở trước.
– delete [] pas;
– delete [] pad;
– delete [] pai;
22
OOP-CHƯƠNG 5-TAO DOI TUONG
CON TRỎ THISCON TRỎ THIS
• Mỗi đối tượng có một con trỏ chỉ đến bản thân nó gọi là
con trỏ this.
• Lưu trữ địa chỉ của đối tượng đang tác động.
• Tham chiếu đến đối tượng đang gọi hàm thành phần.

• Khi viết y=1 tương đương this->y=1 hoặc (*this).y=1
Class VIDU{
int n;
public:
int PhuongThuc(int);
};
Int VIDU::PhuongThuc(int n){
this->n=n //chẳng lẽ viết n=n;
return (*this).n+n+5;
} //(*this).n là dữ liệu thành viên của lớp
23
OOP-CHƯƠNG 5-TAO DOI TUONG
VÍ DỤVÍ DỤ
t=?
24
OOP-CHƯƠNG 5-TAO DOI TUONG
7
Lớp có dữ liệu staticLớp có dữ liệu static
• Nhằm để các đối tượng của lớp cùng chia sẻ vùng bộ nhớ
• Dữ liệu static còn gọi là thành viên tĩnh của lớp.
• Trong ngôn ngữ lập trình hướng đối tượng, loại thành viên
này thường được gọi là biến lớp (class variables)
• Từ đó có thể sử dụng nó mà không cần tạo đối tượng
thuộc lớp.
• Do các đối tượng cùng nhau chia sẻ biến static này, nên nó
phải được khai báo như biến toàn cục
• Giống như 2 người (2 đối tượng) hùn tiền mua 1 món đồ
nên 2 người có thể xài chung món đồ đó
25
OOP-CHƯƠNG 5-TAO DOI TUONG

Biến count được khai báo static để liên hệ các đối tượng
với nhau. Mỗi lần tạo 1 đối tượng thì biến count tăng 1,
hủy 1 đối tượng thì biến count giảm 1.
Thay a bằng bất
kỳ đối tượng nào,
kết quả cũng như
nhau
26
OOP-CHƯƠNG 5-TAO DOI TUONG
Lớp có phương thức staticLớp có phương thức static
• Phương thức static là phương thức có thể gọi thực hiện
ngay cả khi chưa tạo đối tượng thuộc lớp.
• Phương thức static là phương thức để cho các đối tượng
của lớp cùng chia sẻ.
• Chẳng hạn, như trong ví dụ trên, phương thức
numberPerson().
27
OOP-CHƯƠNG 5-TAO DOI TUONG
Phương thức
static, các đối
tượng của lớp
cùng chia sẻ
Không cần chỉ
định đối tượng
cũng có thể gọi
được hàm static
28
OOP-CHƯƠNG 5-TAO DOI TUONG
8
BÀI TẬP TẠI LỚPBÀI TẬP TẠI LỚP

 Xem chương trình sau, cho biết những gì sẽ xuất ra màn hình khi chạy chương
trình:
int a=1, b=2;
class test{
int count;
public:
test(){
count++;}
static int GetCount(){
return a+b;
}
};
void main(){
cout<<test::GetCount()<<endl;}
29
OOP-CHƯƠNG 5-TAO DOI TUONG
BÀI TẬP TẠI LỚPBÀI TẬP TẠI LỚP
Cho đoạn chương trình sau:
main(){
cout<<“Xin chao cac ban”;
getch();
}
Hãy sửa lại chương trình trên sao cho chương trình in ra màn
hình:
Bat dau in cau thong bao…
Xin chao cac ban
Ket thuc in thong bao…
Nhưng không được sửa chữa gì hàm main
30
OOP-CHƯƠNG 5-TAO DOI TUONG

HÀM FRIENDHÀM FRIEND
Mai
Trúc
Lan
Nhà của tôi là
tài sản riêng
(private), không
ai được vào.
Trúc là bạn
tôi
Vậy là tôi
được vào
nhà của
Mai
Tôi không
được vào
nhà của
Mai
Friend
31
OOP-CHƯƠNG 5-TAO DOI TUONG
CÁC KIỂU FRIENDCÁC KIỂU FRIEND
• Hàm tự do là friend của 1 lớp
• Hàm thành phần của một lớp là bạn của một lớp khác
• Hàm bạn của nhiều lớp
• Tất cả các hàm thành phần của một lớp là bạn của một lớp
khác
32
OOP-CHƯƠNG 5-TAO DOI TUONG
9

Hàm tự do là friend của 1 lớpHàm tự do là friend của 1 lớp
Hàm kt_trung là hàm tự do (không
thuộc class nào) nên không thể truy
cập vào thành phần private (x và y)
của class point
33
OOP-CHƯƠNG 5-TAO DOI TUONG
Hàm kt_trung là hàm tự do (không
thuộc class nào) nhưng là bạn
(friend) của class point nên có thể
truy cập vào thành phần private (x
và y) của class point
34
OOP-CHƯƠNG 5-TAO DOI TUONG
Hàm thành phần của một lớp là bạn của một lớp khácHàm thành phần của một lớp là bạn của một lớp khác
class A
{

}
class B
{

int f(….);

}
Hàm f muốn
truy xuất thành
phần private
và protect của
class A

Vậy hàm f của
B phải được A
coi như bạn
(friend)
class A;
class B
{
….
int f(….)
….
};
class A
{

friend int B::f(…);

};
int B::f(….)
{
…….
}
35
OOP-CHƯƠNG 5-TAO DOI TUONG
Hàm bạn của nhiều lớpHàm bạn của nhiều lớp
class A{
….
friend void f(A,B)
….
};
class B{


friend void B f(A,B);

};
void f(A,B){
…….
//truy xuất thành phần
riêng của 2 lớp A và B
}
class A
{

}
class B
{

}
Hàm f muốn
truy xuất thành
phần private
và protect của
class A và B
void f(A,B)
36
OOP-CHƯƠNG 5-TAO DOI TUONG
10
Tất cả các hàm thành phần của một lớp là bạn của một lớp khácTất cả các hàm thành phần của một lớp là bạn của một lớp khác
• Khi không những chỉ một hàm nào đó, mà các hành vi của
lớp được quyền truy cập đến những thành viên có thuộc
tính private, protected của một lớp khác

• Chẳng hạn, các hành vi của lớp A, muốn truy cập những
thành viên private, protected của lớp B, thì trong lớp B phải
mô tả lớp A có thuộc tính là friend.
37
OOP-CHƯƠNG 5-TAO DOI TUONG
class A{
//
public:
friend class B;
//
};
class B{
//
};
38
OOP-CHƯƠNG 5-TAO DOI TUONG
TÓM TẮTTÓM TẮT
• Tạo đối tượng giống như khai báo biến. Đối tượng có thể là
thành phần của lớp hoặc thành phần của mảng.
• Cú pháp để khởi tạo đối tượng thành phần là dùng dấu hai
chấm (:) theo sau bởi tên thành phần và tham số khởi tạo.
• Mỗi đối tượng có một con trỏ chỉ đến bản thân nó gọi là
con trỏ this. Con trỏ này có thể sử dụng tường minh hoặc
ngầm định.
• Thành phần dữ liệu tĩnh thể hiện các thông tin dùng chung trong
tất cả các đối tượng thuộc lớp. Khai báo thành phần tĩnh bắt đầu
bằng từ khóa static.
• Hàm friend của một lớp là hàm không thuộc lớp nhưng có quyền
truy cập đến các thành phần private của lớp. Khai báo friend có
thể đặt bất kỳ nơi nào trong khai báo lớp.

39
OOP-CHƯƠNG 5-TAO DOI TUONG
THANK YOU
40
OOP-CHƯƠNG 5-TAO DOI TUONG

×