bài 4-nạp chồng toán tử_lập trình hướng đối tượng

48
ĐỨC June 18, 2022 CHƯƠNG II: 2.10 NẠP CHỒNG TOÁN TỬ

Upload: ta-no-bi

Post on 05-Aug-2015

184 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

ĐỨCApril 13, 2023

CHƯƠNG II:

2.10 NẠP CHỒNG TOÁN TỬ

Page 2: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 2

NỘI DUNG:

Định nghĩa Cú pháp khai báo toán tử Phân loại hàm toán tử Toán tử chuyển đổi kiểu

Page 3: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 3

Nạp chồng toán tử là khả năng định nghĩa các hàm thành phần của lớp dưới dạng các hàm toán tử

Các toán tử cùng tên thực hiện được nhiều chức năng khác nhau được gọi là nạp chồng toán tử

Ví du:

PS operator - (PS y );

friend PS operator - ( PS x , PS y );

I. Định nghĩa:

Page 4: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 4

II. Khai báo hàm toán tử

•Hàm toán tử được định nghĩa trong vị trí public của phần khai báo lớp.

trong đó: return-type: kiểu trả lại kết quả của hàm toán tử #: tên toán tử cần định nghĩa (+,-,*,/,…)

* Khai báo tổng quát:

<return-type> operator # (d/s đối số);

* Định nghĩa tổng quát:

<return-type> operator # ( d/s đối số )

{

//Định nghĩa hàm toán tử

}

Page 5: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 5

Toán tử độc lập: Không thuộc lớp nào. Ngôi của toán tử là số tham số truyền vào.

PhanSo operator +(const PhanSo &p1, const PhanSo &p2);

bool operator >(const PhanSo &p1, const PhanSo &p2);

Toán tử thuộc lớp: Là phương thức của lớp. Ngôi của toán tử: đối tượng của lớp + số tham số.

PhanSo PhanSo::operator +(const PhanSo &p);

bool PhanSo::operator >(const PhanSo &p);

Cách sử dụng 2 loại là như nhau!!

III. Phân loại hàm toán tử

Page 6: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 6

Hàm thành phần: hàm này không có đối số cho toán tử một ngôi hay có một đối số cho toán tử hai ngôi tương tự hàm thành phần thông thường Hàm bạn: hàm có một đối số cho toán tử một ngôi và hai đối số cho toán tử hai ngôi. Hàm được khai báo thêm từ khóa friend trước tên hàm tương tự hàm bạn

III. Phân loại hàm toán tử

Page 7: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 7

* Quy tắc sử dụng toán tử

Loại Khai báo Sử dụng

Thành phần

type operator #();a.operator #();

hoặc #a;

type operator #(type b);a.operator #(b);

hoặc a#b;

Hàm bạn

friend type operator #(type a); #a

friend type operator #(type a, type b); a#b

Trong đó: # là toán tử cần định nghĩa

Page 8: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 8

* Ví dụ:

Loại Khai báo Sử dụng

Thành phần

PS operator -();kq = a.operator-();

hoặc kq = -a;

PS operator -( PS b);kq = a.operator -(b);

hoặc kq = a-b;

Hàm bạn

friend PS operator -(PS a); kq = -a

friend PS operator - (PS a, PS b); kq = a - b

Trong đó: # là toán tử cần định nghĩa

Page 9: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 9

Ưu điểm: Thực hiện toán tử trên kiểu dữ liệu tự định nghĩa.

PhanSo p1, p2; HocSinh h1, h2;

PhanSo p3 = p1 + p2; if (h1 > h2)

h1++;

Hạn chế: Không thể tạo toán tử mới. Không thể định nghĩa lại toán tử trên kiểu cơ bản. Ngôi của toán tử giữ nguyên. Độ ưu tiên của toán tử không đổi.

Ưu nhược điểm

Page 10: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

10

Hàm toán tử

Toán tử có thể định nghĩa lại:NgôiNgôi NhómNhóm Toán tửToán tử

1 Ngôi (Unary)1 Ngôi (Unary) Tăng giảmTăng giảm ++, --++, --

Dấu số họcDấu số học +, -+, -

LogicLogic !!

Con trỏCon trỏ *, &*, &

Ép kiểuÉp kiểu int, float, double, …int, float, double, …

2 Ngôi (Binary)2 Ngôi (Binary) Số họcSố học +, -, *, /, %, +=, -=, *=, /=, %=+, -, *, /, %, +=, -=, *=, /=, %=

So sánhSo sánh >, <, ==, >=, <=, !=>, <, ==, >=, <=, !=

LogicLogic &&, ||&&, ||

Nhập xuấtNhập xuất <<, >><<, >>

GánGán ==

Lấy chỉ số mảngLấy chỉ số mảng [ ][ ]

Page 11: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

11

Hàm toán tử

Toán tử không thể định nghĩa lại:

Toán tửToán tử Ý nghĩaÝ nghĩa

.. Truy xuất phần tửTruy xuất phần tử

:::: Toán tử ::Toán tử ::

? :? : Toán tử điều kiệnToán tử điều kiện

## Chỉ thị tiền xử lýChỉ thị tiền xử lý

# ## # Chỉ thị tiền xử lýChỉ thị tiền xử lý

Page 12: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 12

* Ví dụ áp dụng:

Viết chương trình xây dựng lớp Phân số. Yêu cầu định nghĩa các hàm:

-Nhập và xuất phân số

-Hàm toán tử + để tính tổng hai phân số

-Hàm toán tử - để tính hiệu hai phân số (friend)

-Áp dụng nhập vào hai phân số và in ra kết quả

Page 13: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 13

#include…class ps{

int ts, ms;public:

//dinh nghia ham nhap xuatvoid nhap();void in();//dinh nghia toan tu +, -ps operator+(ps b);

friend ps operator-(ps a, ps b);};

Page 14: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 14

void ps::in(){

if(ms==1) cout<<ts;else {

if(ts==0) cout<<"0";else cout<<ts<<"/"<<ms;

}}

Page 15: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 15

void ps::nhap(){

cout<<"\n";cout<<"Nhap tu so:"; cin>>ts;cout<<"Nhap mau so:"; cin>>ms;if (ms<0){

ts=-ts;ms=-ms;

}}

Page 16: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 16

ps ps::operator+(ps b){

ps kq;kq.ts = ts*b.ms+b.ts*ms;kq.ms = ms*b.ms;return kq;

}

Page 17: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 17

ps operator-(ps a,ps b){

ps kq;kq.ts = a.ts*b.ms-b.ts*a.ms;kq.ms = a.ms*b.ms;return kq;

}

Page 18: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 18

void main(){

ps x,y,kq;cout<<"Nhap phan so thu nhat: \n";x.nhap();cout<<"\n\n Nhap phan so thu hai:\n";y.nhap();kq = x+y;cout<<"\n Tong:"; kq.in();kq = x-y;cout<<"\n Hieu:"; kq.in();getch();

}

Page 19: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 19

IV. Định nghĩa toán tử >> và <<

Cho phép định nghĩa hai toán tử nhập (>>) và xuất(<<) cho các đối tượng của lớp

Khi đó có thể sử dụng dòng cin>> và cout<< để nhập và xuất dữ liệu cho đối tượng lớp

Page 20: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 20

1. Định nghĩa toán tử xuất (<<)

Khai báo: friend ostream & operator << (ostream &out, class-name c);

Định nghĩa:ostream & operator << (ostream &out, class-name c){ //định nghĩa thao tác in các giá trị của “c” ra màn hình. Lưu ý dùng dòng out<< để xuất thay vì dùng cout<<

return out;}

Page 21: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 21

Trong đó: ostream: tham chiếu chỉ đến dòng xuất, out: tên dòng xuất tạm thời sử dụng thay cho cout class-name: là tên của lớp đối tượng cần định nghĩa toán tử xuất

Page 22: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 22

class phanso{public: int mau, tu; …. friend ostream& operator<<(ostream &out, phanso a); ….};ostream& operator<<(ostream &out, phanso a){

out<<“Phan so:”<<a.tu<<“/”<<a.mau;return out;

}

Ví dụ:

Page 23: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 23

Khai báo:friend istream & operator >> (istream &in, class-name &c);

Định nghĩa:istream & operator >> (istream &in, class-name &c){ //định nghĩa thao tác nhập các giá trị cho đối tượng “c”. Lưu ý dùng dòng in>> để nhập thay vì dùng cin>>

return in;}

2. Định nghĩa toán tử nhập (>>)

Page 24: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 24

Trong đó: istream: tham chiếu chỉ đến dòng nhập, in: tên dòng nhập tạm thời sử dụng thay cho cin class-name: là tên của lớp đối tượng cần định nghĩa toán tử nhập

Page 25: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 25

class phanso{public: int mau, tu; …. friend istream& operator>>(istream &in, phanso &a); ….};

istream& operator>>(istream &in, phanso &a){

cout<<“Nhap tu:”; in>>a.tu;cout<<“Nhap mau:”; in>>a.mau;return in;

}

Ví dụ:

Page 26: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 26

Viết chương trình xây dựng lớp số phức. Yêu cầu:-Định nghĩa toán tử nhập >> và xuất <<-Định nghĩa toán tử +, - để cộng, trừ hai số phức-Định nghĩa toán tử *, / để nhân, chia hai số phức(friend)-Định nghĩa toán tử == để so sánh hai số phức(friend)-Áp dụng nhập vào hai số phức và in ra màn hình các kết quả

* Ví dụ áp dụng:

Page 27: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 27

#include …

class sophuc

{

private:

float t; //phan thuc

float a; //phan ao

public:

friend ostream& operator<<( ostream &os , sophuc x );

friend istream& operator>>( istream &is , sophuc &x );

sophuc operator+( sophuc y );

sophuc operator-( sophuc y );

friend sophuc operator*( sophuc x, sophuc y );

friend sophuc operator/( sophuc x, sophuc y );

friend int operator==( sophuc x, sophuc y );

};

Page 28: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 28

ostream& operator<<( ostream &os , sophuc x )

{

os<<x.t;

if(x.a<0) os<<x.a<<"i";

else os<<"+"<<x.a<<"i";

return os;

}

Page 29: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 29

istream& operator>>( istream &is, sophuc &x )

{

cout<<"Nhap phan thuc:";

is>>x.t;

cout<<"Nhap phan ao:";

is>>x.a;

return is;

}

Page 30: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 30

sophuc sophuc::operator+(sophuc y )

{

sophuc kq;

kq.t = t + y.t;

kq.a = a + y.a;

return kq;

}

Page 31: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 31

sophuc sophuc::operator-(sophuc y )

{

sophuc kq;

kq.t = t - y.t;

kq.a = a - y.a;

return kq;

}

Page 32: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 32

sophuc operator*(sophuc x,sophuc y )

{

sophuc kq;

kq.t = x.t*y.t - x.a*y.a;

kq.a = x.t*y.a + x.a*y.t;

return kq;

}

Page 33: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 33

sophuc operator/(sophuc x, sophuc y )

{

sophuc kq;

kq.t = x.t*y.t + x.a*y.a;

kq.a = x.a*y.t - x.t*y.a;

return kq;

}

Page 34: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 34

int operator==( sophuc x, sophuc y )

{

float dd1,dd2;

dd1 = x.t*x.t + x.a*x.a;

dd2 = y.t*y.t + y.a*y.a;

if (dd1==dd2) return 1;

else return 0;

}

Page 35: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 35

void main()

{

sophuc a,b;

sophuc kq;

cout<<"Nhap so phuc thu nhat \n"; cin>>a;

cout<<"\n Nhap so phuc thu hai:\n"; cin>>b;

//kq=a+b;

kq=a.operator+(b);

cout<<"\n\nTong:"<<kq;

kq=a-b;

cout<<"\n\nHieu:"<<kq;

getch();

}

Page 36: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 36

V. Định nghĩa toán tử chuyển đổi kiểu

Toán tử chuyển đổi kiểu được dùng để chuyển đổi một đối tượng của lớp thành đối tượng lớp khác hoặc thành đối tượng của một kiểu dữ liệu đã có sẵn

Hàm chuyển đổi kiểu phải là hàm thành viên không tĩnh (không static) và không hàm bạn (friend)

Page 37: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 37

cú pháp:

operator <kiểu-cần-chuyển>(); ví dụ:

class date { …. public:

operator int(); //chuyển kiểu date về kiểu int

};

Page 38: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 38

* ví dụ áp dụng:

Xây dựng lớp Date. Yêu cầu:- Định nghĩa hàm toán tử nhập và xuất- Định nghĩa toán tử chuyển đổi để chuyển một giá

trị Date thành kiểu số nguyên- Áp dụng nhập vào một ngày bất kỳ và in ra số

nguyên tương ứng của ngày đó

Page 39: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 39

//Dinh nghia kieu du lieu moi co ten la Stringtypedef char *string;//Dinh nghia mang chua so ngay int ngay[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//Mo ta lopclass N_Date{int d,m,y; //Ngay - Thang - Nam

public://Toan tu chuyen doi kieu, operator long();//Dinh nghia phuogn thuc nhap va xuatfriend ostream& operator<<(ostream &out, N_Date x);friend istream& operator>>(istream &in, N_Date &x);

};

Page 40: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 40

istream& operator>>(istream &in, N_Date &x){

cout<<"Ngay:"; in>>x.d;cout<<"Thang:"; in>>x.m;cout<<"Nam:"; in>>x.y;return in;

}

Page 41: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 41

ostream& operator<<(ostream &out, N_Date x){

out<<x.d<<"/"<<x.m<<"/"<<x.y;return out;

}

Page 42: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 42

N_Date::operator long(){

int s=0,i;if( y== 1900){

s=s+d;for(i=0;i<m;i++) s = s + ngay[i];

}else{

s=s+d;s=s+(y-1)*365;for(i=1900;i<y;i++)

if((i%4==0)&&(i%100!=0)) s=s+1;for(i=0;i<m;i++){

s=s+ngay[i];if((i%4==0)&&(i%100!=0)&&(i==2)) s=s+1;

}}return s;

}

Page 43: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

April 13, 2023 43

void main(){

N_Date x;long n;cout<<"Nhap ngay x: \n";cin>>x;n = long(x);cout<<"\n Ngay x = "<<x;cout<<"\n So nguyen tuong ung:"<<n;getch();

}

Page 44: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

Bài tập 1

Viết chương trình xây dựng lớp phân số, nạp chồng các toán tử sau:

Tạo lớp Phân số có các thành phần sau:

     -    Các thuộc tính: ts,ms;

     -     Hàm tạo có sử dụng tham số mặc định

     -      Nạp chồng các toán tử sau:

         + Toán tử cộng (+)

         + Toán tử trừ (-)

         + Toán tử nhân (*)

         + Toán tử chia (/)

         + Toán tử nhập (>>)

         + Toán tử xuất (<<)

+ Toán tử so sánh hai phân số

Yêu cầu các phân số ở dạng tối giản

April 13, 2023 44

Page 45: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

Bài tập 2

Xây dựng lớp số phức có các thành phần sau:Thành phần dữ liệu gồm: real , image

Nạp chồng các toán tử sau:

Hàm tạo có sử dụng tham số mặc định

Toán tử nhập số phức >>

Toán tử hiển thị số phức <<

Toán tử cộng hai số phức +

Toán tử cộng hai số phức -

Toán tử nhân hai số phức *

Toán tử nhân hai số phức/

Toán tử so sánh hai số phức

Viết chương trình chính nhập vào hai số phức bất kỳ để kiểm tra các hàm vừa viết và nhập vào một dãy gồm n số phức và hiển thị ra màn hình dãy số đó.

April 13, 2023 45

Page 46: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

Bài tập 3

Viết chương trình xây dựng lớp vector

Tạo một lớp vector gồm có các thành phần sau:

       -    Các thuộc tính : float * v; int n, static int count;

-   Cấu tử không tham số // vector();

-  Cấu tử hai tham số // vector(int size,int * a);

- Cấu tử sao chép // vector(vector &a);

Hàm huỷ

Nạp chồng toán tử gán

Nạp chồng toán tử []

Nạp chồng toán tử so sánh ==

Nạp chồng toán tử so sánh !=

Nạp chồng toán tử nhập >>

Nạp chồng toán tử xuất <<

Hàm lấy độ dài của vector

Hàm static đếm số vector được tạo ra // getcount();

Viết chương trình kiểm tra hàm vừa viết.April 13, 2023 46

Page 47: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

Bài tập 4

Viết chương trình xây dựng lớp string

Thành phần dữ liệu :

+ char * str, int length;

Các phương thức:

+ Cấu tử có tham số mặc định // string( char * s1=" ");

+ Cấu tử sao chép //string(string &s1);

+ Hủy tử

+ Nạp chồng toán tử gán =

+ Nạp chồng toán tử nối xâu +=

+ Nạp chồng toán tử so sánh ==, !=

+ Nạp chồng toán tử so sanh <, >

+ Nạp chồng toán tử so sanh >=, <=

+ Nạp chồng toán tử [ ]

+ Nạp chồng toán tử <<, >> bằng hàm bạn

Viết chương trình kiểm tra các phương thức vừa xây dựng.

April 13, 2023 47

Page 48: Bài 4-Nạp chồng toán tử_Lập trình hướng đối tượng

Bài tập 5

Xây dựng lớp đa thức dưới dang: 1 + 2x + 3x2

Thuộc tính : float *a; int n;

Phương thức:

+ Nạp chồng toán tử nhập >>

+ Nạp chồng toán tử xuất <<

+ Nạp chồng toán tử cộng hai đa thức

April 13, 2023 48