Tải bản đầy đủ (.pptx) (47 trang)

Bài giảng lập trình hướng đối tượng dùng c + +chương 4 đa năng hoá toán tử

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 (6.07 MB, 47 trang )

Chương 4
Đa năng hoá toán tử
TRẦN MINH THÁI
Email:
Website: www.minhthai.edu.vn
Cập nhật: 10 tháng 02 năm 2015
#2
Nội dung
1. Giới thiệu
2. Cách cài đặt & sử dụng đa năng hoá toán tử
3. Một số kỹ thuật đa năng hoá toán tử đặc biệt
#3
Giới thiệu (1/3)
Đa năng hóa toán tử là khả năng của C++ cho phép định nghĩa lại toán tử (+, -, *, / , …)
trên kiểu dữ liệu khác → Chương trình ngắn gọn, dễ đọc và có ý nghĩa hơn so với việc
gọi hàm bình thường
Đa năng hóa toán tử bằng cách định nghĩa hoạt động của từng toán tử giống như định
nghĩa một hàm → hàm toán tử
#4
Giới thiệu (2/3)
Cú pháp:
type_name operator operator_symbol ( parameters_list )
{
………………
}
Hàm toán tử

Hàm toàn cục (hàm tự do) → hàm friend

Hàm thành viên của lớp (hàm non-static) → có thuộc tính truy xuất public
#5


Giới thiệu (3/3)
Cú pháp khi gọi
Khai báo
Hàm thành viên Hàm toàn cục
aa#bb aa.operator#(bb) operator#(aa,bb)
#aa aa.operator#() operator#(aa)
aa# aa.operator#(int) operator#(aa,int)
Với # là ký hiệu dấu toán tử
#6
Các lưu ý (1/)
Không thể định nghĩa toán tử mới
Phần lớn các toán tử được đa năng hóa ngoại trừ các toán tử sau:
. .* :: ?: typeid sizeof const_cast dynamic_cast reinterpret_cast static_cast
Không thể đa năng hóa ký hiệu tiền xử lý
Không thể thay đổi độ ưu tiên của toán tử hay số các toán hạng của nó
#7
Các lưu ý (2/)
Không thể thay đổi ý nghĩa của toán tử khi áp dụng các kiểu cài sẵn
Không dùng tham số có giá trị mặc định
Các toán tử: = [] () -> đòi hỏi hàm toán tử phải là hàm thành viên
Phải chủ động định nghĩa toán tử += -= *= /= dù đã định nghĩa + - * /
#8
Tham số (1/2)
Số lượng các tham số của hàm toán tử phụ thuộc:
Toán tử một ngôi hay hai ngôi
Toán tử được khai báo là hàm toàn cục hoặc hàm thành viên
#9
Tham số (2/2)
Nên sử dụng tham chiếu khi có thể (đối tượng lớn)
Luôn sử dụng tham số hằng tham chiếu nếu tham số không bị sửa đổi

bool CComplex::operator == (const CComplex & c) const;
Hàm thành viên nên khai báo là hàm thành viên hằng nếu toán hạng đầu tiên không bị
sửa đổi
Các toán tử tính toán/ so sánh  thường dùng hằng tham chiếu
#10
Giá trị trả về
Tuân thủ theo đặc điểm chung của các cài đặt có sẵn của toán tử
Các phép so sánh (==, !=…) thường trả về giá trị kiểu bool → phiên bản đa năng hóa
cũng nên trả về bool
Giá trị trả về có thể là hằng hoặc tham chiếu tuỳ theo ngữ cảnh
#11
Ví dụ hàm toán tử thành viên (1/3)
class CComplex
{
private:
double real, image;
public:
CComplex (double r = 0, double i=0)
{
real = r;
image = i;
}
void Print() const;
void Println() const;
CComplex operator + (CComplex c) const;
CComplex operator + (double r) const;
};
void CComplex::Print() const
{
cout<<"["<<real<<","<<image<<"]";

}
#12
Ví dụ hàm toán tử thành viên (2/3)
void CComplex::Println() const
{
Print(), cout<<endl;
}
CComplex CComplex::operator + (CComplex c ) const
{
CComplex tmp;
tmp.real = real + c.real;
tmp.image = image + c.image;
return tmp;
}
CComplex CComplex::operator + (double r) const
{
CComplex tmp;
tmp.real = real + r;
tmp.image = image;
return tmp;
}
#13
Ví dụ hàm toán tử thành viên (3/3)
CComplex c1 (3,5), c2(3, -2);
CComplex c3, c4;
c3 = c1 + c2; //OK: c3 = c1.operator + (c2)
c1.Print(), cout<<"+", c2.Print(),cout<<"=", c3.Println();
c4 = c2 + 4.5; //OK: c4 = c2.operator + (4.5)
c2.Print(), cout<<"+ 4.5 =", c4.Println();
c3.Print(), cout<<"+", c4.Print(),cout<<"=",

(c3 + c4).Println(); //OK
c4 = 4.5 + c1; //Error vì 4.5 không phải là đối tượng của CComplex
#14
Ví dụ hàm toán tử friend (1/5)
class CComplex
{
private :
double real, image;
public :
CComplex();
CComplex (double r, double i);
CComplex (double r); //constructor chuyển kiểu: double → CComplex
CComplex (const CComplex &c ); //constructor sao chép
void Print() const;
void Println() const;
friend CComplex operator + ( CComplex c1, CComplex c2 );
friend CComplex operator - ( CComplex c1, CComplex c2 );
CComplex operator += (CComplex c);
friend bool operator == (CComplex c1, CComplex c2);
};
#15
Ví dụ hàm toán tử friend (2/5)
CComplex::CComplex()
{
real = image = 0.0;
}
CComplex::CComplex(double r, double i)
{
real = r;
image = i;

}
CComplex::CComplex(double r)
{
real = r;
image= 0.0;
}
CComplex::CComplex(const CComplex &c)
{
real = c.real;
image = c.image;
}
#16
Ví dụ hàm toán tử friend (3/5)
void CComplex::Print() const
{
cout<<"["<<real<<","<<image<<"]";
}
void CComplex::Println() const
{
Print(), cout<<endl;
}
CComplex operator + (CComplex c1, CComplex c2)
{
CComplex tmp;
tmp.real = c1.real + c2.real;
tmp.image = c1.image + c2.image;
return tmp;
}
#17
Ví dụ hàm toán tử friend (4/5)

CComplex operator - (CComplex c1, CComplex c2)
{
CComplex tmp;
tmp.real = c1.real - c2.real;
tmp.image = c1.image - c2.image;
return tmp;
}
bool operator == (CComplex c1, CComplex c2)
{
return (c1.real==c2.real)&&(c1.image==c2.image);
}
CComplex CComplex::operator += (CComplex c)
{
real+=c.real;
image+=c.image;
return *this;
}
#18
Ví dụ hàm toán tử friend (5/5)
CComplex c1 (3,5), c2(3, -2);
CComplex c3, c4;
c3 = c1 + c2; //OK: c3 = operator + (c1,c2)
c1.Print(), cout<<"+", c2.Print(),cout<<"=", c3.Println();
c4 = c2 + 4.5; //OK: c4 = operator + (c2,CComplex(4.5))
c2.Print(), cout<<"+ 4.5 =", c4.Println();
c3.Print(), cout<<"+", c4.Print(),cout<<"=",
(c3 + c4).Println(); //OK
c4 = 4.5 + c1; //OK: c4 = operator + (CComplex((4.5), c1)
cout<<"4.5+", c1.Print(), cout<<"=", c4.Println();
c4.Print(), cout<<" += ", c3.Print();

c4+=c3; //OK: c4 = c4.operator+=(c3)
cout<<" -> Ket qua:", c4.Println();
#19
Ví dụ đa năng hoá toán tử 1 ngôi (1/2)
Gồm các toán tử: + - ! ++ -> ~ * &
class CComplex
{
private :
double real, image;
public :
CComplex();
CComplex (double r, double i);
CComplex (double r);
CComplex (const CComplex &c ); //constructor sao chép
void Print() const;
friend CComplex operator + ( CComplex c1, CComplex c2 );
friend CComplex operator - ( CComplex c1, CComplex c2 );
friend bool operator == (CComplex c1, CComplex c2);
CComplex operator += (CComplex c);
CComplex operator - ();
};
#20
Ví dụ đa năng hoá toán tử 1 ngôi (2/2)
CComplex CComplex::operator-()
{
CComplex tmp;
tmp.real = -real;
tmp.image = -image;
return tmp;
}

#21
Ví dụ đa năng hoá toán tử đặc biệt (1/3)
Gồm các toán tử:

() [] ++ , = ->

Toán tử chuyển kiểu

Toán tử new và delete
Toán tử [] và ()

[]: chỉ có hai tham số

(): số các tham số bất kỳ
#22
Ví dụ đa năng hoá toán tử đặc biệt (2/3)
class CVector
{
private:
int size;
int *data;
public:
CVector(int s = 2);
~CVector();
int & operator[](int i);
int & operator()(int i);
};
CVector::CVector(int s)
{
size = s;

data = new int[size];
for(int i=0;i<size;++ i)
data[i] = i + 1;
}
CVector::~CVector()
{
delete [] data;
}
#23
Ví dụ đa năng hoá toán tử đặc biệt (3/3)
int & CVector::operator[](int i)
{
return data[i];
}
int & CVector::operator()(int i)
{
return data [i];
}
CVector v(10);
cout<<v(5)<<","<<v[7];
v[4] = 10;
#24
Đa năng hoá toán tử tăng/ giảm (1/2)
Tiền tố và hậu tố phân biệt qua số ngôi
Tiền tố là toán tử một ngôi
Hậu tố là toán tử hai ngôi (tham số thứ hai kiểu int)
#aa aa.operator#() operator#(aa)
aa# aa.operator#(int) operator#(aa,int)
#25
Đa năng hoá toán tử tăng/ giảm (2/2)

class CMyPoint
{
private:
int x, y;
public:
CMyPoint(int a = 0 , int b = 0 );
CMyPoint operator ++();
CMyPoint operator ++(int);
};
CMyPoint::CMyPoint(int a, int b )
{
x = a;
y = b;
}
CMyPoint CMyPoint::operator ++()
{
++x;
++y;
return *this;
}
CMyPoint CMyPoint::operator ++(int)
{
return operator ++();
}

×