1. Trang chủ
  2. » Công Nghệ Thông Tin

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

6 210 0
Tài liệu đã được kiểm tra trùng lặp

Đ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 6
Dung lượng 6,51 MB

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

Nội dung

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Ê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ệ

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Ê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ù

NỘ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

ĐẶ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 +

Trang 2

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ữ

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ề

Cá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

sizeof() Lấy kích thước của kiểu dữ liệu

Phé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ố.

Trang 3

PHÉ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

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 ….;

}

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)

BÀ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.

Trang 4

PHÉP GÁN

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

PHÉ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ố

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;

void main() {

PhanSo a(1,2), b(1,3);

b.XuatPS();

b=3+a;

cout<<"Ket qua:"<<endl;

b.XuatPS();

}

Kết quả:?

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

Trang 5

class PhanSo

{

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

friend ostream& operator << (ostream &os, 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;

}

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.

BÀ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.

Trang 6

TÓ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.

THANH YOU

Ngày đăng: 11/07/2014, 20:20

TỪ KHÓA LIÊN QUAN

w