C định nghĩa cho các kiểu cơ sở như int, float, …chưa định nghĩa cho 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 + ị g Tại sao?. ầ phần, { Phần bắt buộc
Trang 1CHƯƠNG 6 PHÉP TOÁN
1
Trang 2MỤC TIÊU
2
ngữ C++
{ 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 phép toán liên quan
{ Các hành vi đặc thù
Trang 3NỘI DUNG CHI TIẾT
3
Ặ
Trang 4ĐẶT VẤN ĐỀ
4
Không báo lỗi
Vì phép toán + chỉ được
ể
Báo lỗi Tại sao?
C định nghĩa cho các kiểu
cơ sở như int, float,
…chưa định nghĩa cho
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 + ị g Tại sao?
kiểu phanso định nghĩa lại phép toán +
Trang 5HÀM TOÁN TỬ
5
cách tiện lợi và tự nhiên
ầ
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ần do người lập trình chọn lựa trong tập hợp các ký hiệu
phép toán của ngôn ngữ
Trang 6VÍ DỤ
6
phanso operator+ (phanso a){
//
}
Kiểu trả về
Từ khóa bắt buộc phải có
Phép toán được định nghĩa lại là buộc phải có
phép +
Trang 7Các ký hiệu khơng sử dụng
7
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
Trang 8Phép toán là thành viên của lớp
8
phần thuộc lớp
nếu không thì trình dịch không thể thực hiện được nó
số
số
Trang 9PHÉP TOÁN 2 NGÔI
9
là 2 số nguyên
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
Trang 10Tương tự cho các phép toán 2 ngôi
khác
10
khác
Kết quả trả về operator phép toán (các tham số)
{
…
return ….;
}
b t í d t ê ó thể hiể là t (b)
}
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
c.t=t*b.m+b.t*m
c m=m*b m
Trang 11LƯU Ý
y Trong lời gọi a.operator +(b), a đóng vai trò tham số
11
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
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ử.
y Chương trình dịch sẽ không thể hiểu được biểu thức 3+b g g 3
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)
Trang 12BÀI TẬP TẠI LỚP
12
tung độ Viết phép toán + cho 2 Diem
Trang 13PHÉP GÁN
13
a.t=b.t
a m=b m
t=b.t m=b.m
a.m=b.m
return a;
m b.m return *this
Trang 14PHÉP TOÁN << và >>
14
{ Để đị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.
y Phép toán >>p
{ Để đị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 ụ ộ ợ g 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.
Trang 15class PhanSo
15
{
friend istream& operator >> (istream &is, PhanSo &p);
friend ostream& operator << (ostream &os, PhanSo p); p ( , p);
};
Trang 16istream & operator >> (istream &is, PhanSo &p)
{
16
{
is >> p.t >> p.m;
while (!p.m)
{{
cout << “Nhap lai mau so: ”;
is >> p.m;
{
return is;
}
ostream & operator << (ostream &os, PhanSo p)
{
{ PhanSo a, b;
cout << “Nhap phan so a: ”; cin >> a; cout << “Nhap phan so b: ”; cin >> b;
{
os << p.t;
if (p.t != 0 && p.m!= 1)
os << "/" << p.m;
cout << a<<endl;
cout<<b<<endl;
}
p ;
return os;
Trang 17BÀI TẬP TỰ HỌC
17
toán trên, ví dụ class ma trận
Trang 18TÓM TẮT
18
nghĩa lại
friend của lớp
trái luôn là đối tượng thuộc lớp
đối tượng của lớp khác
đối tượng của lớp khác
Trang 19THANH YOU