SlideShare a Scribd company logo
Lập trình hướng đối
tượng C++
Giảng viên giảng dạy: Nguyễn Hữu Vân Long
BM MTT&TT 2
Chương 7
Tái định nghĩa các tác tử
BM MTT&TT 3
 Giới thiệu
 Tái định nghĩa các tác tử
 Tái định nghĩa bằng hàm độc lập
 Tái định nghĩa bằng hàm thành viên
 Tái định nghĩa phép gán
 Tái định nghĩa tác tử nhập - xuất
Nội dung bài giảng
BM MTT&TT 4
 Các toán tử trong C++ chỉ thao tác trên các
kiểu dữ liệu cơ bản.
 Tái định nghĩa toán tử: Định nghĩa lại chức năng
của một toán tử để nó có thể thực hiện trên
các kiểu dữ liệu lớp (hay có đối số là đối
tượng).
 Mục đích: Viết các biểu thức dưới dạng “thân
thuộc” hơn.
Giới thiệuGiới thiệuGiới thiệu
BM MTT&TT 5
 Tại sao cần tái định nghĩa tác tử?
Giới thiệu
class PhanSo {
int tu, mau;
public:
PhanSo(int=0, int=1){…}
void InPs() {…}
int LonHon (PhanSo x) {
return (tu*x.mau>mau*x.tu);
}
PhanSo Cong(PhanSo x) {…}
};
void main() {
PhanSo a(4,9), b(3,7);
if(b.LonHon(a))
cout<<“PS b lon hon a”;
PhanSo c = b.Cong(a);
a.InPs(); cout<< “ + ”;
b.InPs(); cout<< “ = ”;
c.InPs();
}
if ( b > a )
Tái định nghĩa tác tử để có thể
viết biểu thức một cách “thân
thuộc” hơn (dùng toán tử thay vì
dùng hàm)
Phan So c = b + a
cout << a << “ + ” << b
<< “ = ” << c;
BM MTT&TT 6
 Chức năng của một toán tử được định nghĩa bằng một hàm
(với tên hàm là ký hiệu của toán tử) => Tái định nghĩa
toán tử chính là tái định nghĩa hàm.
 Cú pháp:
<kiểu dl trả về> operator <toán tử>(<đối số>);
 Có 2 cách tái định nghĩa toán tử:
 Dùng hàm đ c l pộ ậ
 Dùng hàm thành viên
Giới thiệu
Một số toán tử chỉ
được TĐN bằng 1 cách
Các toán tử có thể tái ĐN
BM MTT&TT 7

Cú pháp:
<kiểu dl trả về> operator <toán tử>(<đối số>);

Chú ý:

Số đối số của hàm chính là số toán hạng của toán tử

Toán tử hai ngôi: đối số thứ nhất là toán hạng bên trái, đối
số thứ hai là toán hạng bên phải toán tử.

Toán tử một ngôi: đối số là toán hạng duy nhất của toán
tử (qui tắc này không áp dụng đối với toán tử tăng/ giảm
sau, postfix [in/des]crement).

Thông thường các hàm tái ĐN toán tử được khai báo là hàm
bạn của lớp là kiểu của toán hạng của toán tử này.
Các toán hạng của toán tử
???
Tái định nghĩa bằng hàm độc lập
BM MTT&TT 8
class Phanso {
int tu, mau;
public:
Phanso(int t=0, int m=1) {
tuso = t; mauso = m;
}
void in() {
cout << tu << "/"
<< mau;
}
friend Phanso operator+(
Phanso, Phanso);
friend Phanso operator+(
Phanso, int);
friend Phanso operator-(
Phanso); //unary ‘-’
};
Phanso operator+(Phanso p,
Phanso q)
{
Phanso kq;
kq.tu = p.tu*q.mau+p.mau*q.tu;
kq.mau = p.mau*q.mau;
return kq;
}
Phanso operator+(Phanso p, int n)
{
Phanso kq(p.tu+p.mau*n, p.mau);
return kq;
}
Phanso operator-(Phanso p) {
return Phanso(-p.tu, p.mau);
} //unary ‘-’
Tái định nghĩa bằng hàm độc lập
BM MTT&TT 9
 Chú ý:
 Toán tử tái định nghĩa
không có tính giao hoán
 Muốn toán tử có tính giao
hoán, ta phải khai báo
thêm hàm tái ĐN toán tử
với đối số giao hoán.
Thông thường: Phanso operator+(const Phanso&, const Phanso&);
void main()
{
Phanso a(1,2), b(2,3);
Phanso c = a + b;
//c = operator+(a, b);
Phanso d = a + 10;
//d = operator+(a, 10);
Phanso e = -a;
//e = operator-(a);
Phanso f = 10 + a; //Error
}
Phanso operator+(int n,
Phanso p)
{
return (p + n);
}
Tái định nghĩa bằng hàm độc lập
BM MTT&TT 10
 Cú pháp:
<kiểu dl trả về> operator <toán tử>(<đối số>);
 Chú ý:
 Chỉ sử dụng cho các toán tử có toán hạng đầu tiên (bên trái)
là đối tượng của lớp đó.
 Mặc nhiên, toán hạng đầu tiên là đối tượng của lớp
=> Có ít hơn 1 đối số so với tái ĐN bằng hàm độc lập.
Tái định nghĩa bằng hàm thành viên
BM MTT&TT 11
class Phanso {
int tu, mau;
public:
Phanso(int t=0, int m=1) {
tu = t; mau = m;
}
void in() {
cout << tu << "/" << mau;
}
Phanso operator+(Phanso);
//Phanso + Phanso
Phanso operator+(int);
//Phanso + int
Phanso operator-();
//unary ‘-’: -Phanso
int operator==(Phanso);
};
Phanso Phanso::operator+(Phanso p){
Phanso kq;
kq.tu = tu*p.mau + mau*p.tu;
kq.mau = mau*p.mau;
return kq;
}
Phanso Phanso::operator+(int n)
{
Phanso kq(tu + mau*n, mau);
return kq;
}
Phanso Phanso::operator-() {
return Phanso(-tu, mau);
} //unary ‘-’
int Phanso::operator==(Phanso p) {
return ((float)tu/mau ==
(float)p.tu/p.mau);
}
Tái định nghĩa bằng hàm thành viên
BM MTT&TT 12
 Chú ý:
 Tương tự như tái ĐN toán tử
bằng hàm độc lập, tái ĐN
toán tử bằng hàm thành
viên không có tính giao
hoán.
 Trong một số trường hợp,
không thể định nghĩa toán
tử có tính chất giao hoán
bằng hàm thành viên được
void main()
{
Phanso a(1,2), b(2,3);
Phanso c = a + b;
//c = a.operator+(b);
Phanso d = a + 10;
//d = a.operator+(10);
Phanso e = -a;
//e = a.operator-();
if (a==b)
cout << "a bang b";
else
cout << "a khong bang b";
}
Không ĐN toán tử int + Phanso được!
Tái định nghĩa bằng hàm thành viên
BM MTT&TT 13
 Các toán tử số học: -(unary), +, -, *, /, %
 Một số chú ý:
 Các toán tử này đều có thể tái định nghĩa bằng hàm thành
viên hoặc hàm độc lập.
 Thông thường, kiểu trả chính là lớp của đối tượng là toán
hạng.
 Các toán tử này không làm thay đổi giá trị của t.hạng
Phanso operator-();
Phanso operator+(const Phanso&);
Phanso operator-(const Phanso&);
Phanso operator*(const Phanso&);
Phanso operator/(const Phanso&);
Phanso operator-(const Phanso&);
Phanso operator+(const Phanso&,
const Phanso&);
Phanso operator*(const Phanso&,
const Phanso&);
//t ng t cho các toán t khácươ ự ử
Tái định nghĩa bằng thành viên Tái định nghĩa bằng độc lập
Tái định nghĩa toán tử số học
BM MTT&TT 14
 Các toán tử so sánh: >, <, >=, <=, ==, !=
 Một số chú ý:
 Các toán tử so sánh có thể tái ĐN bằng hàm thành viên hoặc
hàm độc lập.
 Kiểu trả về luôn là kiểu int (1: true, 0: false).
 Toán tử không làm thay đổi giá trị của toán hạng.
int operator>(const Phanso&);
int operator<(const Phanso&);
int operator>=(const Phanso&);
int operator<=(const Phanso&);
int operator==(const Phanso&);
int operator!=(const Phanso&);
int operator>(const Phanso&,
const Phanso&);
int operator<(const Phanso&,
const Phanso&);
int operator==(const Phanso&,
const Phanso&);
//t ng t cho các toán t khácươ ự ử
Tái định nghĩa bằng thành viên Tái định nghĩa bằng độc lập
Tái định nghĩa toán tử so sánh
BM MTT&TT 15
 Phép gán mặc nhiên:
 Nếu ta không tái định nghĩa thì trình biên dịch sẽ tự động thực
hiện phép gán bằng cách gán bằng tương ứng thuộc tính hai
đối tượng.
 Phép gán bằng này chỉ đúng khi đối tượng không có dữ liệu
thành viên là con trỏ (xem lại hàm XDSC).
=> Nếu lớp không có dữ liệu thành viên là con trỏ thì không
cần tái ĐN phép gán.
 Phép gán này chỉ thực hiện khi hai toán hạng cùng kiểu.
Tái định nghĩa toán tử gán
class Stack {
float *ds;
int soluong , vitri;
public :
...
void operator = ( const Stack& s) {
soluong = s.soluong;
vitri = s.vitri;
delete[] ds;
ds = new float[soluong];
for(int i=0; i<vitri; i++)
ds[i]= s.ds[i];
} };
void main() {
Stack s1(100);
…
Stack s2(20);
…
s2 = s1;
…
s1 = s2; }
BM MTT&TT 16
 Một số chú ý:
 Phép gán chỉ được tái ĐN bằng hàm thành viên.
 Có thể ĐN phép gán giữa các toán hạng khác kiểu.
 Cần phân biệt giữa phép gán và hàm XDSC.
 Trị trả về của phép gán có thể là chính đối tượng vừa được
gán hoặc void.
class Phanso {
int tu, mau;
public:
//các hàm thành viên
...
void operator=(int n) {
tu = n; mau = 1;
}
};
void main() {
Phanso p1(1,2), p2, p3;
//không c n tái đ nh nghĩaầ ị
//toán t gán gi a hai phân sử ữ ố
p2 = p1;
p1 = 5;
p2 = p3 = 5; //L iỗ
}
Tái định nghĩa toán tử gán
BM MTT&TT 17
class Stack {
float *ds;
int sluong, vtri;
public:
//các hàm thành viên
...
Stack operator=(const Stack& s)
{
sluong = s.sluong;
vtri = s.vtri;
delete[] ds;
ds = new float[sluong];
for (int i=0; i<vtri; i++)
ds[i] = s.ds[i];
return *this;
}
};
Stack s1(30), s2(10), s3(20);
...
s2 = s3; //phép gán
...
s1 = s2 = s3; //OK, phép gán
...
Stack s4 = s1; //XDSC
//ho c Stack s4(s1);ặ
Tái định nghĩa toán tử gán
BM MTT&TT 18
 Phân biệt giữa phép gán và hàm xây dựng sao chép:
 Phép gán: đối tượng đã tồn tại (có vùng nhớ)
 Hàm xây dựng sao chép: đối tượng chưa có
 Trị trả về của phép gán có thể là chính đối tượng đó.
class SinhVien {
char mssv[9];
char* hoten;
int namsinh;
float diemtb;
public:
...
SinhVien& operator=(const SinhVien& a){
strcpy(mssv,a.mssv);
delete[] hoten;
hoten = strdup(a.hoten);
namsinh = a.namsinh;
diemtb = a.diemtb;
return *this;
}
};
Phải copy dữ liệu
Xóa vùng nhớ cũ, cấp vùng
nhớ mới và copy dữ liệu
void main(){
SinhVien a, b, c;
a.Nhap();
c = b = a; //phép gán
SinhVien d=a; // hxdsc
}
Tái định nghĩa toán tử gán
BM MTT&TT 19
 Toán tử tăng/giảm: ++, --
 Một số chú ý:
 Có thể tái ĐN bằng hàm TV hoặc hàm độc lập.
 Phép toán tăng/giảm gồm tăng giảm trước (prefix, tăng/giảm
giá trị toán hạng trước khi trả kết quả trả về) và tăng giảm
sau (postfix, tăng/giảm giá trị sau khi trả kết quả trả về).
 Toán tử này làm thay đổi giá trị của toán hạng.
 Phép tăng/giảm trước: Tái định nghĩa giống như toán tử trừ
một ngôi (hàm TV: 0 đối số, hàm ĐL: 1 đối số)
 Phép tăng giảm sau: Thêm vào 1 đối số giả kiểu int.
Tái định nghĩa toán tử tăng giảm
BM MTT&TT 20
class Phanso {
int tu, mau;
public:
//Các hàm thành viên
...
//Tái đ nh nghĩa b ng hàm thành viênị ằ
Phanso& operator ++() {
tu += mau; return *this;
} //tăng tr c (prefix)ướ
Phanso& operator ++(int n){
Phanso oldVal(*this);
tu += mau; return oldVal;
} //tăng sau (postfix)
//Tái đ nh nghĩa b ng hàm đ c l pị ằ ộ ậ
friend Phanso& operator --(
Phanso&); //gi m tr cả ướ
friend Phanso& operator --(
Phanso&, int); //gi m sauả
};
Phanso& operator --(Phanso& p) {
p.tu -= p.mau;
return p;
}
Phanso& operator --(Phanso& p,
int n) {
Phanso oldVal(p);
p.tu -= p.mau;
return oldVal;
}
void main() {
Phanso a(1,2), b, c;
b = a++;
c = ++a;
++++a; //ph c t p, nên tránhứ ạ
}
const Phanso& operator ...
Giải pháp
Tái định nghĩa toán tử tăng giảm
BM MTT&TT 21
 Các phép toán nhập (>>), xuất (<<) phải được định nghĩa theo dạng
hàm độc lập và thường khai báo là friend.
 Thao tác với các dòng (stream) xuất/nhập chuẩn như:
 Bàn phím, tập tin dùng để đọc, … (istream)
 Màn hình, tập tin dủng để ghi, … (ostream)
 Xuất:
ostream& operator<<(ostream&, const ClassType&);
 Nhập:
istream& operator>>(istream&, ClassType&);
class PhanSo {
int tu, mau;
public :
…
friend ostream& operator << (ostream& os, PhanSo p);
friend istream& operator >> (istream& is, PhanSo& p);
};
Tái định nghĩa toán tử xuất nhập
BM MTT&TT 22
 Ví d  1ụ
class Diem {
int x, y;
public :
…
friend ostream& operator << (ostream& os, Diem p);
friend istream& operator >> (istream& is, Diem& p);
};
ostream& operator << (ostream& os, Diem p)
{ os << “(” << p.x << “,” << p.y <<“)”; return os; }
istream& operator >> (istream& is, Diem& p) {
cout << “Nhap hoanh do: ”; is >> p.x;
cout << “Nhap tung do: ”; is >> p.y;
return is;
}
void main() {
Diem a(2,10), b;
cout<< “Gia tri diem A la: ” << a <<endl;
cout<< “Nhap gia tri cho diem B: ”<<endl; cin>>b;
cout<< “Gia tri diem B la: ” << b <<endl;
}
Tái định nghĩa toán tử xuất nhập
BM MTT&TT 23
 Ví d  2ụ
class SinhVien {
char mssv[10], *hoten;
float diemtb;
public :
…
friend ostream& operator <<
(ostream& os, SinhVien s) {
os<<s.mssv<<endl;
os<<s.hoten<<endl;
os<< s.diemtb<<endl;
return os;
}
friend istream& operator >>
(istream& is, SinhVien& s) {
is.getline(s.mssv,9);
is.getline(s.hoten,49);
is >> s.diemtb;
return is;
}
};
void main() {
SinhVien ptcang;
cout<<“Nhap thong tin: ”;
cin >> ptcang;
cout << “Sinh vien A: ”;
cout << ptcang ;
ofstream f1(“MyFile.txt”);
f1<<ptcang;
f1.close();
ifstream f2(“MyFile.txt”);
SinhVien a1;
f2>>a1;
cout << “Trong file: ”;
cout <<a1;
f2.close();
}
#include <fstream.h>
Tái định nghĩa toán tử xuất nhập
BM MTT&TT 24
 Không được thay đổi số “ngôi” (số toán hạng) của một toán
tử.
 Toán tử được tái định nghĩa không có tính giao hoán.
 Toán tử được tái định nghĩa phải có ít nhất một toán hạng
có kiểu là lớp (là một đối tượng).
 Toán tử gán: chỉ được định nghĩa bằng hàm TV.
 Toán tử nhập xuất: chỉ được định nghĩa bằng hàm độc lập
(vì toán hạng trái không phải là đối tượng).
 Chú ý kiểu trả về của hàm tái ĐN toán tử và sự liên quan
của nó đến cú pháp của các biểu thức.
 Còn các toán tử khác ([ ], (), …) SV tự tìm hiểu thêm.
Tóm tắt

More Related Content

What's hot

Định luật Coulomb
Định luật CoulombĐịnh luật Coulomb
Định luật Coulomb
Nathan Herbert
 
Tài liệu tham khảo trường điện từ
Tài liệu tham khảo trường điện từTài liệu tham khảo trường điện từ
Tài liệu tham khảo trường điện từ
Cửa Hàng Vật Tư
 
Bài tập vật lý nguyên tử và hạt nhân www.mientayvn.com
Bài tập vật lý nguyên tử và hạt nhân www.mientayvn.comBài tập vật lý nguyên tử và hạt nhân www.mientayvn.com
Bài tập vật lý nguyên tử và hạt nhân www.mientayvn.com
www. mientayvn.com
 
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
quanglocbp
 
2 matlab ly-thuyet_laptrinh_hamtoanhoc_
2 matlab ly-thuyet_laptrinh_hamtoanhoc_2 matlab ly-thuyet_laptrinh_hamtoanhoc_
2 matlab ly-thuyet_laptrinh_hamtoanhoc_
Thân Văn Ngọc
 
KTMT Số Nguyên - Số Chấm Động
KTMT Số Nguyên - Số Chấm ĐộngKTMT Số Nguyên - Số Chấm Động
KTMT Số Nguyên - Số Chấm ĐộngDavid Nguyen
 
PHƯƠNG TRÌNH SÓNG SCHRÖDINGER
PHƯƠNG TRÌNH SÓNG SCHRÖDINGER PHƯƠNG TRÌNH SÓNG SCHRÖDINGER
PHƯƠNG TRÌNH SÓNG SCHRÖDINGER
www. mientayvn.com
 
Tóm tắt thuyết tương đối hẹp của Einstein
Tóm tắt thuyết tương đối hẹp của EinsteinTóm tắt thuyết tương đối hẹp của Einstein
Tóm tắt thuyết tương đối hẹp của Einstein
Lam Nguyen
 
Bài tập lý thuyết mạch điện - Tập 1, Đoàn Đức Tùng.pdf
Bài tập lý thuyết mạch điện - Tập 1, Đoàn Đức Tùng.pdfBài tập lý thuyết mạch điện - Tập 1, Đoàn Đức Tùng.pdf
Bài tập lý thuyết mạch điện - Tập 1, Đoàn Đức Tùng.pdf
Man_Ebook
 
Lttt matlab chuong 4
Lttt matlab chuong 4Lttt matlab chuong 4
Lttt matlab chuong 4Hoa Cỏ May
 
Ebook 4000 câu hỏi luyện thi Olympia 2016-Thiều Đình Chung
Ebook 4000 câu hỏi luyện thi Olympia 2016-Thiều Đình ChungEbook 4000 câu hỏi luyện thi Olympia 2016-Thiều Đình Chung
Ebook 4000 câu hỏi luyện thi Olympia 2016-Thiều Đình Chung
Chung Đình
 
Luận văn: Bài toán Neumann đối với hàm điều hòa, HAY, 9đ
Luận văn: Bài toán Neumann đối với hàm điều hòa, HAY, 9đLuận văn: Bài toán Neumann đối với hàm điều hòa, HAY, 9đ
Luận văn: Bài toán Neumann đối với hàm điều hòa, HAY, 9đ
Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Code và sơ đồ khối môn Phương pháp số và lập trình Fortran
Code và sơ đồ khối môn Phương pháp số và lập trình FortranCode và sơ đồ khối môn Phương pháp số và lập trình Fortran
Code và sơ đồ khối môn Phương pháp số và lập trình FortranLee Ein
 
Giáo trình CAD trong kỹ thuật điện.pdf
Giáo trình CAD trong kỹ thuật điện.pdfGiáo trình CAD trong kỹ thuật điện.pdf
Giáo trình CAD trong kỹ thuật điện.pdf
Man_Ebook
 
Tín Hiệu Và Hệ Thống - Phép biến đổi Laplace
Tín Hiệu Và Hệ Thống - Phép biến đổi LaplaceTín Hiệu Và Hệ Thống - Phép biến đổi Laplace
Tín Hiệu Và Hệ Thống - Phép biến đổi Laplace
Quang Thinh Le
 
Công thức tính nhanh điện xoay chiều
Công thức tính nhanh điện xoay chiềuCông thức tính nhanh điện xoay chiều
Công thức tính nhanh điện xoay chiều
tuituhoc
 
Cơ sở giải tích - Độ đo
Cơ sở giải tích - Độ đo Cơ sở giải tích - Độ đo
Cơ sở giải tích - Độ đo
Bui Loi
 

What's hot (20)

Do hoa may tinh
Do hoa may tinhDo hoa may tinh
Do hoa may tinh
 
Định luật Coulomb
Định luật CoulombĐịnh luật Coulomb
Định luật Coulomb
 
Tài liệu tham khảo trường điện từ
Tài liệu tham khảo trường điện từTài liệu tham khảo trường điện từ
Tài liệu tham khảo trường điện từ
 
Bài tập vật lý nguyên tử và hạt nhân www.mientayvn.com
Bài tập vật lý nguyên tử và hạt nhân www.mientayvn.comBài tập vật lý nguyên tử và hạt nhân www.mientayvn.com
Bài tập vật lý nguyên tử và hạt nhân www.mientayvn.com
 
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
THIẾT KẾ VÀ THI CÔNG LED CUBE 5X5X5 DÙNG VI ĐIỀU KHIỂN AT89S52
 
2 matlab ly-thuyet_laptrinh_hamtoanhoc_
2 matlab ly-thuyet_laptrinh_hamtoanhoc_2 matlab ly-thuyet_laptrinh_hamtoanhoc_
2 matlab ly-thuyet_laptrinh_hamtoanhoc_
 
Phương pháp tham lam
Phương pháp tham lamPhương pháp tham lam
Phương pháp tham lam
 
KTMT Số Nguyên - Số Chấm Động
KTMT Số Nguyên - Số Chấm ĐộngKTMT Số Nguyên - Số Chấm Động
KTMT Số Nguyên - Số Chấm Động
 
PHƯƠNG TRÌNH SÓNG SCHRÖDINGER
PHƯƠNG TRÌNH SÓNG SCHRÖDINGER PHƯƠNG TRÌNH SÓNG SCHRÖDINGER
PHƯƠNG TRÌNH SÓNG SCHRÖDINGER
 
Tóm tắt thuyết tương đối hẹp của Einstein
Tóm tắt thuyết tương đối hẹp của EinsteinTóm tắt thuyết tương đối hẹp của Einstein
Tóm tắt thuyết tương đối hẹp của Einstein
 
Bài tập lý thuyết mạch điện - Tập 1, Đoàn Đức Tùng.pdf
Bài tập lý thuyết mạch điện - Tập 1, Đoàn Đức Tùng.pdfBài tập lý thuyết mạch điện - Tập 1, Đoàn Đức Tùng.pdf
Bài tập lý thuyết mạch điện - Tập 1, Đoàn Đức Tùng.pdf
 
Lttt matlab chuong 4
Lttt matlab chuong 4Lttt matlab chuong 4
Lttt matlab chuong 4
 
Cay ion
Cay ionCay ion
Cay ion
 
Ebook 4000 câu hỏi luyện thi Olympia 2016-Thiều Đình Chung
Ebook 4000 câu hỏi luyện thi Olympia 2016-Thiều Đình ChungEbook 4000 câu hỏi luyện thi Olympia 2016-Thiều Đình Chung
Ebook 4000 câu hỏi luyện thi Olympia 2016-Thiều Đình Chung
 
Luận văn: Bài toán Neumann đối với hàm điều hòa, HAY, 9đ
Luận văn: Bài toán Neumann đối với hàm điều hòa, HAY, 9đLuận văn: Bài toán Neumann đối với hàm điều hòa, HAY, 9đ
Luận văn: Bài toán Neumann đối với hàm điều hòa, HAY, 9đ
 
Code và sơ đồ khối môn Phương pháp số và lập trình Fortran
Code và sơ đồ khối môn Phương pháp số và lập trình FortranCode và sơ đồ khối môn Phương pháp số và lập trình Fortran
Code và sơ đồ khối môn Phương pháp số và lập trình Fortran
 
Giáo trình CAD trong kỹ thuật điện.pdf
Giáo trình CAD trong kỹ thuật điện.pdfGiáo trình CAD trong kỹ thuật điện.pdf
Giáo trình CAD trong kỹ thuật điện.pdf
 
Tín Hiệu Và Hệ Thống - Phép biến đổi Laplace
Tín Hiệu Và Hệ Thống - Phép biến đổi LaplaceTín Hiệu Và Hệ Thống - Phép biến đổi Laplace
Tín Hiệu Và Hệ Thống - Phép biến đổi Laplace
 
Công thức tính nhanh điện xoay chiều
Công thức tính nhanh điện xoay chiềuCông thức tính nhanh điện xoay chiều
Công thức tính nhanh điện xoay chiều
 
Cơ sở giải tích - Độ đo
Cơ sở giải tích - Độ đo Cơ sở giải tích - Độ đo
Cơ sở giải tích - Độ đo
 

Viewers also liked

Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cHồ Lợi
 
Chuong 4 danh sach lien ket
Chuong 4   danh sach lien ketChuong 4   danh sach lien ket
Chuong 4 danh sach lien ketHoàng Đức
 
Bài tập CTDL và GT 7
Bài tập CTDL và GT 7Bài tập CTDL và GT 7
Bài tập CTDL và GT 7
Hồ Lợi
 
Chuong2 extra c_
Chuong2 extra c_Chuong2 extra c_
Chuong2 extra c_Hồ Lợi
 
Bài tập CTDL và GT 3
Bài tập CTDL và GT 3Bài tập CTDL và GT 3
Bài tập CTDL và GT 3
Hồ Lợi
 
FPT Polytechnic Profile 2016
FPT Polytechnic Profile 2016FPT Polytechnic Profile 2016
FPT Polytechnic Profile 2016
FPT Polytechnic
 
Danh Sach Lien Ket
Danh Sach Lien KetDanh Sach Lien Ket
Danh Sach Lien KetTony Nhân
 
Bài tập CTDL và GT 1
Bài tập CTDL và GT 1Bài tập CTDL và GT 1
Bài tập CTDL và GT 1
Hồ Lợi
 
Bài tập CTDL và GT 12
Bài tập CTDL và GT 12Bài tập CTDL và GT 12
Bài tập CTDL và GT 12
Hồ Lợi
 

Viewers also liked (20)

Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của c
 
Nguyen lyoop
Nguyen lyoopNguyen lyoop
Nguyen lyoop
 
Chuong 4 danh sach lien ket
Chuong 4   danh sach lien ketChuong 4   danh sach lien ket
Chuong 4 danh sach lien ket
 
Bài tập CTDL và GT 7
Bài tập CTDL và GT 7Bài tập CTDL và GT 7
Bài tập CTDL và GT 7
 
Xu ly chuoi
Xu ly chuoiXu ly chuoi
Xu ly chuoi
 
Chuong3 c
Chuong3 c Chuong3 c
Chuong3 c
 
Chuong1 c
Chuong1 c Chuong1 c
Chuong1 c
 
Chuong2 extra c_
Chuong2 extra c_Chuong2 extra c_
Chuong2 extra c_
 
Chuong6 (2)
Chuong6 (2)Chuong6 (2)
Chuong6 (2)
 
Bài tập CTDL và GT 3
Bài tập CTDL và GT 3Bài tập CTDL và GT 3
Bài tập CTDL và GT 3
 
FPT Polytechnic Profile 2016
FPT Polytechnic Profile 2016FPT Polytechnic Profile 2016
FPT Polytechnic Profile 2016
 
Chuong1
Chuong1Chuong1
Chuong1
 
Chuong2 c
Chuong2 c Chuong2 c
Chuong2 c
 
Chuong4 (2)
Chuong4 (2)Chuong4 (2)
Chuong4 (2)
 
Chuong 1
Chuong 1Chuong 1
Chuong 1
 
Chuong8 (2)
Chuong8 (2)Chuong8 (2)
Chuong8 (2)
 
Chuong5 (2)
Chuong5 (2)Chuong5 (2)
Chuong5 (2)
 
Danh Sach Lien Ket
Danh Sach Lien KetDanh Sach Lien Ket
Danh Sach Lien Ket
 
Bài tập CTDL và GT 1
Bài tập CTDL và GT 1Bài tập CTDL và GT 1
Bài tập CTDL và GT 1
 
Bài tập CTDL và GT 12
Bài tập CTDL và GT 12Bài tập CTDL và GT 12
Bài tập CTDL và GT 12
 

Similar to Chuong7

Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08xcode_esvn
 
10. C - Function And Operator Overload
10. C   - Function And Operator Overload10. C   - Function And Operator Overload
10. C - Function And Operator Overload
Darian Pruitt
 
THCS_W11_BaiDocThem
THCS_W11_BaiDocThemTHCS_W11_BaiDocThem
THCS_W11_BaiDocThemCNTT-DHQG
 
Nmlt c15 ham_nangcao_phan2_in
Nmlt c15 ham_nangcao_phan2_inNmlt c15 ham_nangcao_phan2_in
Nmlt c15 ham_nangcao_phan2_in
Huy Nguyễn
 
Fortran cơ sở
Fortran cơ sởFortran cơ sở
Fortran cơ sởHajunior9x
 
Chuong3 ham 2793
Chuong3 ham 2793Chuong3 ham 2793
Chuong3 ham 2793Sim Vit
 
Ngon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiNgon ngu c theo chuan ansi
Ngon ngu c theo chuan ansi
Huynh MVT
 
K33103350 tran doankimnhu_bai17_tin11
K33103350 tran doankimnhu_bai17_tin11K33103350 tran doankimnhu_bai17_tin11
K33103350 tran doankimnhu_bai17_tin11Tin5VungTau
 
Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdf
HngTrn365275
 
Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdf
nguyenkaka2
 
ưU tiên trong c
ưU tiên trong cưU tiên trong c
ưU tiên trong c
tienhien110293
 
Gt ung dung tin hoc trong kinh doanh
Gt ung dung tin hoc trong kinh doanhGt ung dung tin hoc trong kinh doanh
Gt ung dung tin hoc trong kinh doanhvantai30
 

Similar to Chuong7 (20)

Chuong 08 tai dinh nghia
Chuong 08 tai dinh nghiaChuong 08 tai dinh nghia
Chuong 08 tai dinh nghia
 
Lesson08
Lesson08Lesson08
Lesson08
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
 
10. C - Function And Operator Overload
10. C   - Function And Operator Overload10. C   - Function And Operator Overload
10. C - Function And Operator Overload
 
Lesson08
Lesson08Lesson08
Lesson08
 
THCS_W11_BaiDocThem
THCS_W11_BaiDocThemTHCS_W11_BaiDocThem
THCS_W11_BaiDocThem
 
Nmlt c15 ham_nangcao_phan2_in
Nmlt c15 ham_nangcao_phan2_inNmlt c15 ham_nangcao_phan2_in
Nmlt c15 ham_nangcao_phan2_in
 
Fortran cơ sở
Fortran cơ sởFortran cơ sở
Fortran cơ sở
 
Chuong3 ham 2793
Chuong3 ham 2793Chuong3 ham 2793
Chuong3 ham 2793
 
Chuong 2
Chuong 2Chuong 2
Chuong 2
 
Ltc 6
Ltc 6Ltc 6
Ltc 6
 
Chuong 07 lop
Chuong 07 lopChuong 07 lop
Chuong 07 lop
 
Ngon ngu c theo chuan ansi
Ngon ngu c theo chuan ansiNgon ngu c theo chuan ansi
Ngon ngu c theo chuan ansi
 
K33103350 tran doankimnhu_bai17_tin11
K33103350 tran doankimnhu_bai17_tin11K33103350 tran doankimnhu_bai17_tin11
K33103350 tran doankimnhu_bai17_tin11
 
Ctdl lab01
Ctdl lab01Ctdl lab01
Ctdl lab01
 
Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdf
 
Chuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdfChuong 1 Matlab co ban.pdf
Chuong 1 Matlab co ban.pdf
 
ưU tiên trong c
ưU tiên trong cưU tiên trong c
ưU tiên trong c
 
Gt ung dung tin hoc trong kinh doanh
Gt ung dung tin hoc trong kinh doanhGt ung dung tin hoc trong kinh doanh
Gt ung dung tin hoc trong kinh doanh
 
C3 functions and_library
C3 functions and_libraryC3 functions and_library
C3 functions and_library
 

More from Hồ Lợi

Lect04 functions
Lect04 functionsLect04 functions
Lect04 functionsHồ Lợi
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequyHồ Lợi
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignmentHồ Lợi
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapcHồ Lợi
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitapHồ Lợi
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhHồ Lợi
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Hồ Lợi
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++Hồ Lợi
 
Epc assignment
Epc assignmentEpc assignment
Epc assignmentHồ Lợi
 
Epc test practical
Epc test practicalEpc test practical
Epc test practicalHồ Lợi
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --thHồ Lợi
 

More from Hồ Lợi (20)

T4
T4T4
T4
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functions
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequy
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignment
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapc
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitap
 
Gtrinh oop
Gtrinh oopGtrinh oop
Gtrinh oop
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
Giaotrinhbaitapkythuatlaptrinh
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++
 
File trong c_
File trong c_File trong c_
File trong c_
 
Epc assignment
Epc assignmentEpc assignment
Epc assignment
 
Epc test practical
Epc test practicalEpc test practical
Epc test practical
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --th
 
Dethi c++ -lt
Dethi c++ -ltDethi c++ -lt
Dethi c++ -lt
 
Debug trong c
Debug trong cDebug trong c
Debug trong c
 
D05 stl
D05 stlD05 stl
D05 stl
 
Cpl test3
Cpl test3Cpl test3
Cpl test3
 
Cpl test2
Cpl test2Cpl test2
Cpl test2
 
Cpl test1
Cpl test1Cpl test1
Cpl test1
 

Chuong7

  • 1. Lập trình hướng đối tượng C++ Giảng viên giảng dạy: Nguyễn Hữu Vân Long
  • 2. BM MTT&TT 2 Chương 7 Tái định nghĩa các tác tử
  • 3. BM MTT&TT 3  Giới thiệu  Tái định nghĩa các tác tử  Tái định nghĩa bằng hàm độc lập  Tái định nghĩa bằng hàm thành viên  Tái định nghĩa phép gán  Tái định nghĩa tác tử nhập - xuất Nội dung bài giảng
  • 4. BM MTT&TT 4  Các toán tử trong C++ chỉ thao tác trên các kiểu dữ liệu cơ bản.  Tái định nghĩa toán tử: Định nghĩa lại chức năng của một toán tử để nó có thể thực hiện trên các kiểu dữ liệu lớp (hay có đối số là đối tượng).  Mục đích: Viết các biểu thức dưới dạng “thân thuộc” hơn. Giới thiệuGiới thiệuGiới thiệu
  • 5. BM MTT&TT 5  Tại sao cần tái định nghĩa tác tử? Giới thiệu class PhanSo { int tu, mau; public: PhanSo(int=0, int=1){…} void InPs() {…} int LonHon (PhanSo x) { return (tu*x.mau>mau*x.tu); } PhanSo Cong(PhanSo x) {…} }; void main() { PhanSo a(4,9), b(3,7); if(b.LonHon(a)) cout<<“PS b lon hon a”; PhanSo c = b.Cong(a); a.InPs(); cout<< “ + ”; b.InPs(); cout<< “ = ”; c.InPs(); } if ( b > a ) Tái định nghĩa tác tử để có thể viết biểu thức một cách “thân thuộc” hơn (dùng toán tử thay vì dùng hàm) Phan So c = b + a cout << a << “ + ” << b << “ = ” << c;
  • 6. BM MTT&TT 6  Chức năng của một toán tử được định nghĩa bằng một hàm (với tên hàm là ký hiệu của toán tử) => Tái định nghĩa toán tử chính là tái định nghĩa hàm.  Cú pháp: <kiểu dl trả về> operator <toán tử>(<đối số>);  Có 2 cách tái định nghĩa toán tử:  Dùng hàm đ c l pộ ậ  Dùng hàm thành viên Giới thiệu Một số toán tử chỉ được TĐN bằng 1 cách Các toán tử có thể tái ĐN
  • 7. BM MTT&TT 7  Cú pháp: <kiểu dl trả về> operator <toán tử>(<đối số>);  Chú ý:  Số đối số của hàm chính là số toán hạng của toán tử  Toán tử hai ngôi: đối số thứ nhất là toán hạng bên trái, đối số thứ hai là toán hạng bên phải toán tử.  Toán tử một ngôi: đối số là toán hạng duy nhất của toán tử (qui tắc này không áp dụng đối với toán tử tăng/ giảm sau, postfix [in/des]crement).  Thông thường các hàm tái ĐN toán tử được khai báo là hàm bạn của lớp là kiểu của toán hạng của toán tử này. Các toán hạng của toán tử ??? Tái định nghĩa bằng hàm độc lập
  • 8. BM MTT&TT 8 class Phanso { int tu, mau; public: Phanso(int t=0, int m=1) { tuso = t; mauso = m; } void in() { cout << tu << "/" << mau; } friend Phanso operator+( Phanso, Phanso); friend Phanso operator+( Phanso, int); friend Phanso operator-( Phanso); //unary ‘-’ }; Phanso operator+(Phanso p, Phanso q) { Phanso kq; kq.tu = p.tu*q.mau+p.mau*q.tu; kq.mau = p.mau*q.mau; return kq; } Phanso operator+(Phanso p, int n) { Phanso kq(p.tu+p.mau*n, p.mau); return kq; } Phanso operator-(Phanso p) { return Phanso(-p.tu, p.mau); } //unary ‘-’ Tái định nghĩa bằng hàm độc lập
  • 9. BM MTT&TT 9  Chú ý:  Toán tử tái định nghĩa không có tính giao hoán  Muốn toán tử có tính giao hoán, ta phải khai báo thêm hàm tái ĐN toán tử với đối số giao hoán. Thông thường: Phanso operator+(const Phanso&, const Phanso&); void main() { Phanso a(1,2), b(2,3); Phanso c = a + b; //c = operator+(a, b); Phanso d = a + 10; //d = operator+(a, 10); Phanso e = -a; //e = operator-(a); Phanso f = 10 + a; //Error } Phanso operator+(int n, Phanso p) { return (p + n); } Tái định nghĩa bằng hàm độc lập
  • 10. BM MTT&TT 10  Cú pháp: <kiểu dl trả về> operator <toán tử>(<đối số>);  Chú ý:  Chỉ sử dụng cho các toán tử có toán hạng đầu tiên (bên trái) là đối tượng của lớp đó.  Mặc nhiên, toán hạng đầu tiên là đối tượng của lớp => Có ít hơn 1 đối số so với tái ĐN bằng hàm độc lập. Tái định nghĩa bằng hàm thành viên
  • 11. BM MTT&TT 11 class Phanso { int tu, mau; public: Phanso(int t=0, int m=1) { tu = t; mau = m; } void in() { cout << tu << "/" << mau; } Phanso operator+(Phanso); //Phanso + Phanso Phanso operator+(int); //Phanso + int Phanso operator-(); //unary ‘-’: -Phanso int operator==(Phanso); }; Phanso Phanso::operator+(Phanso p){ Phanso kq; kq.tu = tu*p.mau + mau*p.tu; kq.mau = mau*p.mau; return kq; } Phanso Phanso::operator+(int n) { Phanso kq(tu + mau*n, mau); return kq; } Phanso Phanso::operator-() { return Phanso(-tu, mau); } //unary ‘-’ int Phanso::operator==(Phanso p) { return ((float)tu/mau == (float)p.tu/p.mau); } Tái định nghĩa bằng hàm thành viên
  • 12. BM MTT&TT 12  Chú ý:  Tương tự như tái ĐN toán tử bằng hàm độc lập, tái ĐN toán tử bằng hàm thành viên không có tính giao hoán.  Trong một số trường hợp, không thể định nghĩa toán tử có tính chất giao hoán bằng hàm thành viên được void main() { Phanso a(1,2), b(2,3); Phanso c = a + b; //c = a.operator+(b); Phanso d = a + 10; //d = a.operator+(10); Phanso e = -a; //e = a.operator-(); if (a==b) cout << "a bang b"; else cout << "a khong bang b"; } Không ĐN toán tử int + Phanso được! Tái định nghĩa bằng hàm thành viên
  • 13. BM MTT&TT 13  Các toán tử số học: -(unary), +, -, *, /, %  Một số chú ý:  Các toán tử này đều có thể tái định nghĩa bằng hàm thành viên hoặc hàm độc lập.  Thông thường, kiểu trả chính là lớp của đối tượng là toán hạng.  Các toán tử này không làm thay đổi giá trị của t.hạng Phanso operator-(); Phanso operator+(const Phanso&); Phanso operator-(const Phanso&); Phanso operator*(const Phanso&); Phanso operator/(const Phanso&); Phanso operator-(const Phanso&); Phanso operator+(const Phanso&, const Phanso&); Phanso operator*(const Phanso&, const Phanso&); //t ng t cho các toán t khácươ ự ử Tái định nghĩa bằng thành viên Tái định nghĩa bằng độc lập Tái định nghĩa toán tử số học
  • 14. BM MTT&TT 14  Các toán tử so sánh: >, <, >=, <=, ==, !=  Một số chú ý:  Các toán tử so sánh có thể tái ĐN bằng hàm thành viên hoặc hàm độc lập.  Kiểu trả về luôn là kiểu int (1: true, 0: false).  Toán tử không làm thay đổi giá trị của toán hạng. int operator>(const Phanso&); int operator<(const Phanso&); int operator>=(const Phanso&); int operator<=(const Phanso&); int operator==(const Phanso&); int operator!=(const Phanso&); int operator>(const Phanso&, const Phanso&); int operator<(const Phanso&, const Phanso&); int operator==(const Phanso&, const Phanso&); //t ng t cho các toán t khácươ ự ử Tái định nghĩa bằng thành viên Tái định nghĩa bằng độc lập Tái định nghĩa toán tử so sánh
  • 15. BM MTT&TT 15  Phép gán mặc nhiên:  Nếu ta không tái định nghĩa thì trình biên dịch sẽ tự động thực hiện phép gán bằng cách gán bằng tương ứng thuộc tính hai đối tượng.  Phép gán bằng này chỉ đúng khi đối tượng không có dữ liệu thành viên là con trỏ (xem lại hàm XDSC). => Nếu lớp không có dữ liệu thành viên là con trỏ thì không cần tái ĐN phép gán.  Phép gán này chỉ thực hiện khi hai toán hạng cùng kiểu. Tái định nghĩa toán tử gán class Stack { float *ds; int soluong , vitri; public : ... void operator = ( const Stack& s) { soluong = s.soluong; vitri = s.vitri; delete[] ds; ds = new float[soluong]; for(int i=0; i<vitri; i++) ds[i]= s.ds[i]; } }; void main() { Stack s1(100); … Stack s2(20); … s2 = s1; … s1 = s2; }
  • 16. BM MTT&TT 16  Một số chú ý:  Phép gán chỉ được tái ĐN bằng hàm thành viên.  Có thể ĐN phép gán giữa các toán hạng khác kiểu.  Cần phân biệt giữa phép gán và hàm XDSC.  Trị trả về của phép gán có thể là chính đối tượng vừa được gán hoặc void. class Phanso { int tu, mau; public: //các hàm thành viên ... void operator=(int n) { tu = n; mau = 1; } }; void main() { Phanso p1(1,2), p2, p3; //không c n tái đ nh nghĩaầ ị //toán t gán gi a hai phân sử ữ ố p2 = p1; p1 = 5; p2 = p3 = 5; //L iỗ } Tái định nghĩa toán tử gán
  • 17. BM MTT&TT 17 class Stack { float *ds; int sluong, vtri; public: //các hàm thành viên ... Stack operator=(const Stack& s) { sluong = s.sluong; vtri = s.vtri; delete[] ds; ds = new float[sluong]; for (int i=0; i<vtri; i++) ds[i] = s.ds[i]; return *this; } }; Stack s1(30), s2(10), s3(20); ... s2 = s3; //phép gán ... s1 = s2 = s3; //OK, phép gán ... Stack s4 = s1; //XDSC //ho c Stack s4(s1);ặ Tái định nghĩa toán tử gán
  • 18. BM MTT&TT 18  Phân biệt giữa phép gán và hàm xây dựng sao chép:  Phép gán: đối tượng đã tồn tại (có vùng nhớ)  Hàm xây dựng sao chép: đối tượng chưa có  Trị trả về của phép gán có thể là chính đối tượng đó. class SinhVien { char mssv[9]; char* hoten; int namsinh; float diemtb; public: ... SinhVien& operator=(const SinhVien& a){ strcpy(mssv,a.mssv); delete[] hoten; hoten = strdup(a.hoten); namsinh = a.namsinh; diemtb = a.diemtb; return *this; } }; Phải copy dữ liệu Xóa vùng nhớ cũ, cấp vùng nhớ mới và copy dữ liệu void main(){ SinhVien a, b, c; a.Nhap(); c = b = a; //phép gán SinhVien d=a; // hxdsc } Tái định nghĩa toán tử gán
  • 19. BM MTT&TT 19  Toán tử tăng/giảm: ++, --  Một số chú ý:  Có thể tái ĐN bằng hàm TV hoặc hàm độc lập.  Phép toán tăng/giảm gồm tăng giảm trước (prefix, tăng/giảm giá trị toán hạng trước khi trả kết quả trả về) và tăng giảm sau (postfix, tăng/giảm giá trị sau khi trả kết quả trả về).  Toán tử này làm thay đổi giá trị của toán hạng.  Phép tăng/giảm trước: Tái định nghĩa giống như toán tử trừ một ngôi (hàm TV: 0 đối số, hàm ĐL: 1 đối số)  Phép tăng giảm sau: Thêm vào 1 đối số giả kiểu int. Tái định nghĩa toán tử tăng giảm
  • 20. BM MTT&TT 20 class Phanso { int tu, mau; public: //Các hàm thành viên ... //Tái đ nh nghĩa b ng hàm thành viênị ằ Phanso& operator ++() { tu += mau; return *this; } //tăng tr c (prefix)ướ Phanso& operator ++(int n){ Phanso oldVal(*this); tu += mau; return oldVal; } //tăng sau (postfix) //Tái đ nh nghĩa b ng hàm đ c l pị ằ ộ ậ friend Phanso& operator --( Phanso&); //gi m tr cả ướ friend Phanso& operator --( Phanso&, int); //gi m sauả }; Phanso& operator --(Phanso& p) { p.tu -= p.mau; return p; } Phanso& operator --(Phanso& p, int n) { Phanso oldVal(p); p.tu -= p.mau; return oldVal; } void main() { Phanso a(1,2), b, c; b = a++; c = ++a; ++++a; //ph c t p, nên tránhứ ạ } const Phanso& operator ... Giải pháp Tái định nghĩa toán tử tăng giảm
  • 21. BM MTT&TT 21  Các phép toán nhập (>>), xuất (<<) phải được định nghĩa theo dạng hàm độc lập và thường khai báo là friend.  Thao tác với các dòng (stream) xuất/nhập chuẩn như:  Bàn phím, tập tin dùng để đọc, … (istream)  Màn hình, tập tin dủng để ghi, … (ostream)  Xuất: ostream& operator<<(ostream&, const ClassType&);  Nhập: istream& operator>>(istream&, ClassType&); class PhanSo { int tu, mau; public : … friend ostream& operator << (ostream& os, PhanSo p); friend istream& operator >> (istream& is, PhanSo& p); }; Tái định nghĩa toán tử xuất nhập
  • 22. BM MTT&TT 22  Ví d  1ụ class Diem { int x, y; public : … friend ostream& operator << (ostream& os, Diem p); friend istream& operator >> (istream& is, Diem& p); }; ostream& operator << (ostream& os, Diem p) { os << “(” << p.x << “,” << p.y <<“)”; return os; } istream& operator >> (istream& is, Diem& p) { cout << “Nhap hoanh do: ”; is >> p.x; cout << “Nhap tung do: ”; is >> p.y; return is; } void main() { Diem a(2,10), b; cout<< “Gia tri diem A la: ” << a <<endl; cout<< “Nhap gia tri cho diem B: ”<<endl; cin>>b; cout<< “Gia tri diem B la: ” << b <<endl; } Tái định nghĩa toán tử xuất nhập
  • 23. BM MTT&TT 23  Ví d  2ụ class SinhVien { char mssv[10], *hoten; float diemtb; public : … friend ostream& operator << (ostream& os, SinhVien s) { os<<s.mssv<<endl; os<<s.hoten<<endl; os<< s.diemtb<<endl; return os; } friend istream& operator >> (istream& is, SinhVien& s) { is.getline(s.mssv,9); is.getline(s.hoten,49); is >> s.diemtb; return is; } }; void main() { SinhVien ptcang; cout<<“Nhap thong tin: ”; cin >> ptcang; cout << “Sinh vien A: ”; cout << ptcang ; ofstream f1(“MyFile.txt”); f1<<ptcang; f1.close(); ifstream f2(“MyFile.txt”); SinhVien a1; f2>>a1; cout << “Trong file: ”; cout <<a1; f2.close(); } #include <fstream.h> Tái định nghĩa toán tử xuất nhập
  • 24. BM MTT&TT 24  Không được thay đổi số “ngôi” (số toán hạng) của một toán tử.  Toán tử được tái định nghĩa không có tính giao hoán.  Toán tử được tái định nghĩa phải có ít nhất một toán hạng có kiểu là lớp (là một đối tượng).  Toán tử gán: chỉ được định nghĩa bằng hàm TV.  Toán tử nhập xuất: chỉ được định nghĩa bằng hàm độc lập (vì toán hạng trái không phải là đối tượng).  Chú ý kiểu trả về của hàm tái ĐN toán tử và sự liên quan của nó đến cú pháp của các biểu thức.  Còn các toán tử khác ([ ], (), …) SV tự tìm hiểu thêm. Tóm tắt