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

Bài giảng Ngôn ngữ lập trình C - Chương 13: Toán tử trên lớp

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 (88.63 KB, 12 trang )

CHƯƠNG 13: TỐN TỬ TRÊN LỚP


Nội dung
Tốn tử
Hàm tốn tử
Định nghĩa chồng
Định nghĩa chồng
Định nghĩa chồng
Định nghĩa chồng

toán
toán
toán
toán

tử gán “=“
tử tăng/giảm ”++“/”—”
tử “[]”
tử “<<” và “>>”


Tốn tử
 Trong C++, có thể định nghĩa chồng đối với hầu hết các tốn tử (một ngơi
hoặc hai ngơi) trên các lớp, nghĩa là một trong các toán hạng tham gia phép
toán là các đối tượng.
 Toán tử được định nghĩa chồng bằng cách định nghĩa một hàm toán tử với
tên bao gồm từ khóa operator và theo sau là ký hiệu tốn tử cần định nghĩa
chồng.
• Ví dụ 1: Một số ví dụ về tên hàm tốn tử
• operator+


định nghĩa phép cộng
• operatorđịnh nghĩa phép trừ
• operator*
định nghĩa phép nhân
• operator/
định nghĩa phép chia
• operator+=
định nghĩa phép cộng bằng
• operator!=
định nghĩa phép so sánh khác

















Hàm tốn tử
Hàm tốn tử có thể là hàm thành phần hoặc hàm bạn của lớp. Khi hàm toán
tử là hàm thành phần của lớp thì tốn hạng thứ nhất trong hàm tốn tử ln

là một đối tượng thuộc lớp đó. Nếu tốn hạng thứ nhất trong hàm tốn tử
khơng phải là một đối tượng của lớp thì hàm tốn tử phải là hàm bạn của
lớp.
Ví dụ 2:
class SoPhuc
{
private:
float re, im; //phần thực và phần ảo
public:
SoPhuc(float re = 0; float im = 0); void Xuat();
//Hàm toán tử cộng hai đối tượng Sophuc
SoPhuc operator+(SoPhuc u); // Hàm thành phần lớp
/*Hàm toán tử cộng một số thực với phần thực của một đối tượng
SoPhuc*/
friend SoPhuc operator+(float x, SoPhuc v); //Hàm bạn
};



















//Định nghĩa các hàm thành phần
SoPhuc::SoPhuc(float im1, float re1)
{
im = im1; re = re1;
}
SoPhuc SoPhuc::oprator+(SoPhuc u)
{
cout << “Goi hàm toán tử thành phần operator+\n”;
SoPhuc res(re + u.re, im + u.im); //Gọi hàm thiết lập hai đối số
return res;
}
void SoPhuc::Xuat()
{
cout << re << (im >= 0 ? “+” : “-”) << fabs(im) << “*i\n”;
}






















//Định nghĩa hàm tự do
SoPhuc operator+(float x, SoPhuc u)
{
cout << “Goi hàm toán tử tự do operator+\n”;
SoPhuc res(x + u.re, u.im);
return res;
}
//Hàm chính
void main()
{
SoPhuc a(-2, 4);
a.Xuat();
SoPhuc b(8, -6);
b.Xuat();
SoPhuc c = a + b; // CT dịch hiểu c = a.operator+(b)
c.Xuat();
SoPhuc d = 4 + c; // CT dịch hiểu c = operator+(4, c)
d.Xuat();
SoPhuc e = a + b + c; // e = (a.operator+(b)).operator+(c)
e.Xuat();

}


Định nghĩa chồng phép gán
 Hàm tốn tử gán ln là hàm thành phần của lớp.
 Việc định nghĩa chồng phép gán chỉ cần thiết khi các đối tượng có các
thành phần dữ liệu động.
 Giá trị trả về của hàm toán tử gán được chọn là tham chiếu đến đối tượng
đứng bên trái phép gán nhằm giũ hai tính chất quan trong của phép gán: trật
tự kết hợp tử bên phải sang bên trái và có thể sử dụng kết quả biểu thức gán
trong các biểu thức khác.
• Ví dụ 3:
• class Vector
• {
• private:

...
• public:

...

Vector& operator=(Vector &u);
• };

















Vector& Vector::operator=(Vector &u)
{
cout <<“goi ham toan tu gan\n”;
if(this != &u) {
delete[]a; /*xóa vùng nhớ động đã có trong đối tượng vế
trái*/
n = u.n;
u.a = new float[n]; /*cấp phát vùng nhớ mới có kích thước
như trong u*/
for(i = 0; i < n; i++)
a[i] = u.a[i];
}
else cout <<“ Hai doi tuong trong phep gan la mot\n”;
return *this;
}













void main()
{
...
Vector b = a; //Gọi hàm thiết lập sao chép
b.Xuat();
Vector c(0);
c = b; //Gọi hàm toán tử gán
c.Xuat();
}














Định nghĩa chồng toán tử “<<“ và “>>”

Việc định nghĩa chồng hai toán tử “<<“ và “>>” sẽ cho phép các đối tượng
đứng bên phải chúng khi thức hiện các thao tác nhập xuất.
Ví dụ 4:
class SoPhuc
{
private:
float im, re;
public:
//
friend ostream& operator<<(ostream &os, SoPhuc &u);
firend istream& operator>>(istream &is, SoPhuc &u);
};





















//Định nghĩa hàm tự do
ostream& operator<<(ostream &os, SoPhuc &u)
{
cout << “Nhap phan thuc va phan ao:”;
os << u.re << u.im;
}
istream& operator>>(istream &os, SoPhuc &u)
{
is << u.re << (u.im >= 0 ? “+” : “-”) << u.im <<“*i\n”;
}
//Hàm chính
void main()
{
SoPhuc a;
cin << a;
cout << a;
}





Chú ý:
Các toán hạng bên trái của các toán tử << và >> là các đối tượng thuộc lớp
ostream và istream chứ không phải thuộc lớp SoPhuc nên không thể định
nghĩa chồng các toán tử này như là hàm thành phần, mà phải được định
nghĩa như là hàm bạn.





×