Giới thiệu Lớp Complex a,b là 2 số phức Xác định toán tử giống như việc xác định hàm gọi là hàm toán tử Từ khóa operator và ký hiệu toán tử... Complex class – một số nhận xét a+b
Trang 1Lập trình hướng đối tượng
Bài 4: Toán tử
Trang 3Giới thiệu
Lớp Complex
a,b là 2 số phức
Xác định toán tử giống như việc xác định hàm (gọi là hàm toán tử)
Từ khóa operator và ký hiệu toán tử
Trang 4Khai báo chồng toán tử
Function name Using
Trang 6Complex class
void display(){
cout<<real<<(image>=0?’+’:’-’)<<fabs(image)<<“*i”<<endl;
}
// Function operator+ define binary plus operation
complex operator+ (complex b) {
Trang 8Complex class – một số nhận xét
a+b giống như a.operator+(b)
operator+ là hàm thành viên public
Gọi a.operator+(b): a là tham số ẩn còn b
là tham số tường minh
Chương trình dịch không thể thực hiện:
3+a (3.operator+(a)) Để giải quyết vấn đề này, phải sử dụng hàm bạn bè
Trang 9Hàm toán tử là hàm bạn bè
// the same as complex1.cpp
class complex{
//
// Free function operator+ defines binary operator +
friend complex operator+(float x, complex b);
};
complex operator+(float x, complex b){
cout<<“call operator+(float, complex)\n”;
complex c;
c.real=x+b.real;
c.image=b.image;
Trang 11complex & operator-()
complex operator+(float, complex&)
Trang 12Khả năng và giới hạn của việc viết toán tử
operator++() và operator () là toán tử tiền tố;
operator++(int) và operator (int) là toán tử hậu tố
operator phải duy trì là 1 hay 2 ngôi
Một trong số các toán hạng phải là đối tượng
Trang 13Chiến lược sử dụng toán tử
Các toán tử nên giữ ngữ nghĩa gốc
Trang 14Thí dụ
Phép gán operator“=“
Giả sử a,b là 2 đối tượng vector
Biểu thức: a=b; a.operator=(b);
Lưu ý:
Cần xác định toán tử gán cho các đối tượng
có dữ liệu thành viên động
Trang 15Thí dụ
vector & vector::operator=(vector &b){
cout<<“Call operator=() for ”<<this<<endl;
Trang 16float real, image;
friend ostream & operator<<(ostream &o, complex &b);
friend istream & operator>>(istream &i, complex &b);
Trang 17Thí dụ
istream & operator>>(istream &i, complex &b){
cout<<“Real member:”; i>>b.real;
cout<<“Image member:”; i>>b.image;
Trang 19Chuyển kiểu
Chuyển dạng built-in sang lớp
Giả sử đối tượng “a” là một số phức
Trang 22Số hữu tỷ
Có thể hợp nhất với các dạng số khác:
c = a + 3; // Should mean same as addition of 3/1
double x = 2.5 * a; // Should convert fraction to a
double
Trang 23Các phép toán số học trên số phức
a/b + c/d được xác định là (a*d + c*d)/(b*d)
Fraction operator+(const Fraction& left, const Fraction&
Trang 24Các phép toán số học một ngôi
+ - * & có cả 2 dạng một và hai ngôi
Để viết chồng các toán tử 1 ngôi, giảm số tham số
Trang 27Stream Output <<
Lớp Output stream cho phép viết 1 ký tự đơn
Thư viện Stream cung cấp toán tử chèn cho tất cả các dạng built-in:
ostream& operator<<(ostream& out, double value);
Lưu ý: chính stream lại được trả ra
Thí dụ: Overload output for Fraction
ostream& operator<<( ostream &out, const Fraction &value )
{
out << value.numerator() << "/" << value.denominator();
return out;
}
Trang 28Stream Input >>
Thư viện Stream cung cấp cho tất cả các dạng built-in
Có thể viết chồng như toán tử output
Tham số thứ 2 là tham chiếu không const
Thí dụ: Input operator for Time
Trang 29Stream Input >> (cont.)
Giả sử thời gian được cho vào bằng 3 tham số nguyên chỉ giờ, phút và giây Thí dụ 9 15 00 thể hiện 9:15:00 a.m
istream& operator>>(istream& in, Time& a)
{
int hours;
int minutes;
int seconds;
in >> hours >> minutes >> seconds;
a = Time(hours, minutes, seconds);
return in;
Trang 30istream& operator>>(istream& in, Fraction& r)
Trang 31Viết chồng các toán tử tăng và giảm
Trang 32Viết chồng các toán tử tăng giảm
Thí dụ: Increments for Fraction
Lưu ý:
Prefix trả ra tham chiếu
Postfix làm nhiều việc
class Fraction
{
Fraction& operator++(); // Prefix form
Fraction operator++(int unused); // Postfix form
};
Trang 33Viết chồng toán tử tăng giảm
Trang 35Viết chồng các toán tử gán (+= *=, etc.)
Không được cung cấp tự động
Trang 36Viết chồng các toán tử chuyển kiểu
Dùng phương thức thiết lập để thể hiện việc
chuyển kiểu tới 1 dạng người dùng xác định
Thí dụ: nếu lớp Fraction có phương thức thiết lập với 1 tham số nguyên thì:
Trang 37Viết chồng các toán tử chuyển kiểu
Trang 38Viết chồng các toán tử chuyển kiểu
Trang 39Thí dụ
Chuyển kiểu Fraction về double:
Fraction::operator double() const
{
// Convert numerator to double, then do division
return static_cast<double>(top) / bottom;
Trang 40Stream Loops và các toán tử chuyển
Trang 41Viết chồng toán tử chỉ mục
Thường được xác định ở các bộ chứa có thể lập chỉ mục (vector hoặc map)
Đối số tường minh là chỉ mục (index )
Kết quả là giá trị được lưu ở vị trí được
xác định
Trả ra tham chiếu tới giá trị để có một
L-value
Phải là hàm thành phần