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

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

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 (6.51 MB, 6 trang )

1
Chương 6:
PHÉP TOÁN
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
• Biết cách thức viết hàm phép toán trong lớp của ngôn ngữ
C++
• Hoàn thiện kiểu dữ liệu lớp sao cho có các hành vi:
– Truy cập dữ liệu (nhập/xuất; nhận biết/thay đổi giá trị của dữ liệu)
– Các phép toán liên quan
– Các hành vi đặc thù
2
OOP-CHƯƠNG 6-PHÉP TOÁN
NỘI DUNG CHI TIẾTNỘI DUNG CHI TIẾT
• ĐẶT VẤN ĐỀ
• HÀM TOÁN TỬ
• CÁC KÝ HiỆU KHÔNG SỬ DỤNG
• PHÉP TOÁN LÀ THÀNH VIÊN CỦA LỚP
• PHÉP TOÁN LÀ HÀM FRIEND CỦA LỚP
• PHÉP TOÁN 2 NGÔI
• PHÉP TOÁN 1 NGÔI
3
OOP-CHƯƠNG 6-PHÉP TOÁN
ĐẶT VẤN ĐỀĐẶT VẤN ĐỀ
Báo lỗi
Tại sao?
Không
báo lỗi


Vì phép toán + chỉ được C
định nghĩa cho các kiểu cơ
sở như int, float, …chưa
định nghĩa cho kiểu
phanso
Muốn sử dụng phép toán +
cho kiểu phanso thì phải định
nghĩa lại phép toán +
4
OOP-CHƯƠNG 6-PHÉP TOÁN
2
HÀM TỐN TỬHÀM TỐN TỬ
• Ngơn ngữ C++ cho phép cài đặt các phép tốn một cách
tiện lợi và tự nhiên.
• Tên gọi của phép tốn được đặt theo quy ước gồm hai
phần,
– Phần bắt buộc - sử dụng từ khóa operator
– Phần do người lập trình chọn lựa trong tập hợp các ký hiệu phép
tốn của ngơn ngữ.
5
OOP-CHƯƠNG 6-PHÉP TỐN
VÍ DỤVÍ DỤ
• Cộng hai phanso với nhau
phanso operator+ (phanso a){
//
}
Từ khóa bắt buộc
phải có
Phép tốn được
định nghĩa lại là

phép +
Kiểu trả về
6
OOP-CHƯƠNG 6-PHÉP TỐN
Các ký hiệu khơng sử dụngCác ký hiệu khơng sử dụng
Phép toán
Ý nghóa
::
Truy cập đến thành phần của lớp
.*
Truy cập đến con trỏ là thành phần đối tượng
hay struct
.
Truy cập đến thành phần của đối tượng hay của
struct
?:
Phép toán điều kiện
sizeof()
Lấy kích thước của kiểu dữ liệu
7
OOP-CHƯƠNG 6-PHÉP TỐN
Phép tốn là thành viên của lớpPhép tốn là thành viên của lớp
• Phép tốn là hành vi, nên có thể hiện thực như thành phần
thuộc lớp.
• Hàm tốn tử operator phải có thuộc tính public vì nếu
khơng thì trình dịch khơng thể thực hiện được nó ở ngồi
phạm vi lớp.
• Với phép tốn hai ngơi phải có hai tham số hình thức, khi
trở thành phương thức của lớp chỉ còn một tham số.
8

OOP-CHƯƠNG 6-PHÉP TỐN
3
PHÉP TOÁN 2 NGÔIPHÉP TOÁN 2 NGÔI
• Giả sử có kiểu dữ liệu phanso v = (t,m), trong đó t, m là 2 số
nguyên.
• Khi đó, phép toán cộng 2 vector được định nghĩa như sau,
cho u = (t,m), v = (t,m), thì w = (t,m),
w = u + v <=> w.t = u.t*v.m+ v.t*u.m
w.m = u.m * v.m
9
OOP-CHƯƠNG 6-PHÉP TOÁN
c=a+b trong ví dụ trên có thể hiểu là c=a.operator+(b)
c.t=a.t*b.m+b.t*a.m
c.m=a.m*b.m
return c
c.t=t*b.m+b.t*m
c.m=m*b.m
return c;
Tương tự cho các
phép toán 2 ngôi
khác
Kết quả trả về operator phép toán (các tham số)
{

return ….;
}
10
OOP-CHƯƠNG 6-PHÉP TOÁN
LƯU ÝLƯU Ý
 Trong lời gọi a.operator +(b), a đóng vai trò tham số ngầm

định của hàm thành phần và b là tham số tường minh. Số
tham số tường minh cho hàm toán tử thành phần luôn ít
hơn số ngôi của phép toán là 1 vì có một tham số ngầm
định là đối tượng gọi hàm toán tử.
 Chương trình dịch sẽ không thể hiểu được biểu thức 3+b vì
cách viết tương ứng 3.operator (b) không có ý nghĩa. Để
giải quyết tình trạng này ta dùng hàm friend để định nghĩa
hàm toán tử (bài tập tự nghiên cứu). Gợi ý: hàm toán tử này
sẽ là hàm tự do, và là friend của hàm phanso. Lời gọi cho
nó là 3+b tương tự operator+(3,b)
11
OOP-CHƯƠNG 6-PHÉP TOÁN
BÀI TẬP TẠI LỚPBÀI TẬP TẠI LỚP
• 1)Định nghĩa lại phép toán -, *, / cho lớp phân số trên
• 2) Giả sử có khai báo sau:
• PhanSo a,b;
• a=b+3 //báo lỗi.
• Giải thích tại sao báo lỗi. Sửa lại sao cho không báo lỗi
nữa.
• 3)Xây dựng lớp Diem gồm 2 thành phần hoành độ và tung
độ. Viết phép toán + cho 2 Diem.
12
OOP-CHƯƠNG 6-PHÉP TOÁN
4
PHÉP GÁNPHÉP GÁN
• a=b
• Tương đương a.operator=(b)
• Ví dụ a và b thuộc lớp phân số
a.t=b.t
a.m=b.m

return a;
t=b.t
m=b.m
return *this
13
OOP-CHƯƠNG 6-PHÉP TOÁN
PHÉP TOÁN LÀ HÀM FRIENDPHÉP TOÁN LÀ HÀM FRIEND
• VẤN ĐỀ: Cộng 3 với phân số a: 3+a
• Không thể dùng phép cộng (+) như hàm thành phần vì tham
số thứ nhất của hàm toán tử (số 3) không còn là đối
tượng.
• PhanSo a,b;
• b=3+a  b=3.operator(a) => sai
• operator + (3,a) => đúng //chú ý: không có đối tượng gọi
phép toán +, nghĩa là phép toán + không phải thành phần
của lớp phân số.
• Muốn gọi phép toán + của lớp phân số thì phải là bạn của
lớp phân số.
14
OOP-CHƯƠNG 6-PHÉP TOÁN
class PhanSo{
int t,m;
public:
PhanSo(int ts=0,int ms=1){t=ts;m=ms;}
void XuatPS(){cout<<t<<"/"<<m<<endl;}
//hàm tự do operator + định nghĩa phép
toán +
//giữa 1 số nguyên và 1 đối tượng phân số
friend PhanSo operator + (int x, PhanSo
a);

};
//hàm toàn cục, là friend của lớp phân số
PhanSo operator + (int x, PhanSo a){
PhanSo b;
b.t=x+a.t;
b.m=a.m;
return b;
}
void main()
{
PhanSo a(1,2), b(1,3);
b.XuatPS();
b=3+a;
cout<<"Ket qua:"<<endl;
b.XuatPS();
}
Kết quả:?
15
OOP-CHƯƠNG 6-PHÉP TOÁN
PHÉP TOÁN << và >>PHÉP TOÁN << và >>
 Phép toán <<
Để định nghĩa phép toán << theo nghĩa xuất ra dòng dữ liệu xuất
cho kiểu dữ liệu đang định nghĩa, ta định nghĩa phép toán như hàm
toàn cục với tham số thứ nhất tham chiếu đến đối tượng thuộc lớp
ostream, kết quả trả về là tham chiếu đến chính ostream đó. Toán
hạng thứ hai thuộc lớp đang định nghĩa.
 Phép toán >>
Để định nghĩa phép toán >> theo nghĩa nhập từ dòng dữ liệu nhập
cho kiểu dữ liệu đang định nghĩa, ta định nghĩa phép toán >> như
hàm toàn cục với tham số thứ nhất là tham chiếu đến một đối tượng

thuộc lớp istream, kết quả trả về là tham chiếu đến chính istream
đó. Toán hạng thứ hai là tham chiếu đến đối tượng thuộc lớp đang
định nghĩa.
16
OOP-CHƯƠNG 6-PHÉP TOÁN
5
class PhanSo
{

friend istream& operator >> (istream &is, PhanSo &p);
friend ostream& operator << (ostream &os, PhanSo p);

};
17
OOP-CHƯƠNG 6-PHÉP TOÁN
istream & operator >> (istream &is, PhanSo &p){
is >> p.t >> p.m;
while (!p.m)
{
cout << “Nhap lai mau so: ”;
is >> p.m;
}
return is;
}
ostream & operator << (ostream &os, PhanSo p){
os << p.t;
if (p.t != 0 && p.m!= 1)
os << "/" << p.m;
return os;
}

void main()
{
PhanSo a, b;
cout << “Nhap phan so a: ”; cin >> a;
cout << “Nhap phan so b: ”; cin >> b;
cout << a<<endl;
cout<<b<<endl;
}
18
OOP-CHƯƠNG 6-PHÉP TOÁN
LƯU ÝLƯU Ý
• Số tham số trong hàm toán tử tự do operator phép + ( )
đúng bằng số ngôi của phép toán mà nó định nghĩa.
• Trong định nghĩa hàm toán tử tự do, tham số thứ nhất có
thể có kiểu bất kỳ chứ không nhất thiết phải có kiểu lớp
nào đó.
• Khi định nghĩa lại phép toán phải tuân theo nguyên tắc: một
trong những toán hạng phải là đối tượng.
19
OOP-CHƯƠNG 6-PHÉP TOÁN
BÀI TẬP TỰ HỌCBÀI TẬP TỰ HỌC
• Tìm hiểu thêm các phép toán khác như (), ++, , []
• Xây dựng một class hoàn chỉnh có dùng các phép toán
trên, ví dụ class ma trận.
20
OOP-CHƯƠNG 6-PHÉP TOÁN
6
TÓM TẮTTÓM TẮT
• Toán tử có thể được định nghĩa lại (chồng hàm)
• Dùng từ khóa operator và ký hiệu toán tử được định nghĩa

lại.
• Không thể định ra phép toán mới
• Hàm toán tử có thể là hàm thành phần hoặc hàm friend của
lớp
• Khi hàm toán tử là hàm thành phần, toán hạng bên trái luôn
là đối tượng thuộc lớp.
• Khi hàm toán tử là hàm friend, toán hạng bên trái là đối
tượng của lớp khác.
21
OOP-CHƯƠNG 6-PHÉP TOÁN
THANH YOU
22
OOP-CHƯƠNG 6-PHÉP TOÁN

×