Tải bản đầy đủ (.doc) (5 trang)

4 nạp chồng 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 (99.1 KB, 5 trang )

HỌC VIỆN KỸ THẬT QUÂN SỰ
KHOA CÔNG NGHỆ THÔNG TIN

ĐỀ CƯƠNG BÀI GIẢNG

HỌC PHẦN: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bộ môn: Công nghệ phần mềm
Giáo viên: 1) Phạm Thị Bích Vân

Bài IV: Nạp chồng toán tử
1. Thời lượng: 6 tiết (GV giảng: 3; bài tập: 3)
2. Mục đích, yêu cầu: Giới thiệu sinh viên ý nghĩa, cách xây dựng nạp chồng toán tử. Cách nạp chồng các
toán tử chèn dòng, trích dòng, các toán tử đặc biệt.
3. Nội dung:
a) Nội dung chi tiết:
• Giới thiệu



Trong chương này tìm hiểu làm thế nào cho phép các toán tử của C++ làm việc với các đối
tượng của lớp. Xử lý này được gọi là nạp chồng toán tử (operator overloading).
Các nguyên tắc cơ bản của nạp chồng toán tử



Lập trình viên có thể sử dụng các kiểu có sẵn và có thể định nghĩa các kiểu mới.



Các lập trình viên có thể sử dụng các toán tử với các kiểu do người dùng định nghĩa.




Các toán tử được nạp chồng bằng cách viết một định nghĩa hàm ngoại trừ tên hàm bây giờ trở



thành từ khóa operator theo sau bởi ký hiệu của toán tử được nạp chồng. Prototype của nó có
dạng như sau:
type operator operator_symbol ( parameter_list );
Các giới hạn



Phần lớn các toán tử của C++ có thể được nạp chồng. Các toán tử có thể được nạp chồng:



Các toán tử không thể được nạp chồng:



Không thể thay đổi số các toán hạng mà một toán tử yêu cầu: Nạp chồng các toán tử một ngôi



vẫn là các toán tử một ngôi; nạp chồng các toán tử hai ngôi vẫn là các toán tử hai ngôi..
Nạp chồng các toán tử 2 ngôi




Các toán tử hai ngôi được nạp chồng trong hình sau:

Bộ môn Công nghệ phần mềm




Một toán tử hai ngôi có thể được nạp chồng như là hàm thành viên không tĩnh với một tham số



hoặc như một hàm không thành viên với hai tham số.
Nạp chồng các toán tử 1 ngôi



Các toán tử một ngôi được nạp chồng trong hình sau:



Một toán tử một ngôi của lớp được nạp chồng như một hàm thành viên không tĩnh với không có



tham số hoặc như một hàm không thành viên với một tham số; Tham số đó phải hoặc là một đối
tượng lớp hoặc là một tham chiếu đến đối tượng lớp.
Nạp chồng các toán tử đặc biệt




Toán tử []



Khi cài đặt các lớp vector hoặc chuỗi ký tự, cần phải truy cập đến từng phần tử của chúng, trong



ngôn ngữ C/C++ đã có toán tử [] để truy cập đến một phần tử của mảng.
Đây là toán tử hai ngôi, có dạng a[b] và khi nạp chồng toán tử này thì hàm toán tử tương ứng



phải là thành viên của một lớp.
Toán tử ()



Toán tử () được dùng để gọi hàm, toán tử này gồm hai toán hạng: toán hạng đầu tiên là tên hàm,



toán hạng thứ hai là danh sách các tham số của hàm.
Toán tử này có dạng giống như toán tử [] và khi nạp chồng toán tử này thì hàm toán tử tương



ứng phải là thành viên của một lớp.
Nạp chồng toán tử chuyển đổi kiểu




Một toán tử chuyển đổi kiểu có thể được sử dụng để chuyển đổi một đối tượng của một lớp



thành đối tượng của một lớp khác hoặc thành một đối tượng của một kiểu có sẵn. Toán tử chuyển
đổi kiểu như thế phải là hàm thành viên không tĩnh và không là hàm friend.
Prototype của hàm thành viên này có cú pháp:



operator <data type> ();
Nạp chồng toán tử new và delete



Hàm toán tử của toán tử new và delete có prototype như sau:

Bộ môn Công nghệ phần mềm




void * operator new(size_t size);
void operator delete(void * ptr);
Trong đó tham số kiểu size_t được trình biên dịch hiểu là kích thước của kiểu dữ liệu được trao
cho toán tử new.
Nạp chồng các toán tử chèn dòng




Ta có thể nạp chồng các toán tử chèn dòng << (stream insertion) và trích dòng >> (stream



extraction). Hàm toán tử của toán tử << được nạp chồng có prototype như sau:
ostream & operator << (ostream & stream, ClassName Object);
Hàm toán tử << trả về tham chiếu chỉ đến dòng xuất ostream. Tham số thứ nhất của hàm toán tử



<< là một tham chiếu chỉ đến dòng xuất ostream, tham số thứ hai là đối tượng được chèn vào
dòng.
Nạp chồng toán tử trích dòng.



istream & operator >> (istream & stream, ClassName Object);
Hàm toán tử >> trả về tham chiếu chỉ đến dòng xuất istream. Tham số thứ nhất của hàm toán tử
>> là một tham chiếu chỉ đến dòng xuất istream, tham số thứ hai là đối tượng.
Một số ví dụ



Lớp String

Xây dựng một lớp xử lý việc tạo và thao tác trên các chuỗi (string). C++ không cài sẵn kiểu
dữ liệu chuỗi. Nhưng C++ cho phép chúng ta thêm kiểu chuỗi như một lớp thông qua cơ chế nạp
chồng.

class String
{
private:
char *Ptr; //Con tro tro den diem bat dau cua chuoi
int Length; //Chieu dai chuoi
public:
String(const char * = ""); //Constructor chuyen doi
String(const String &); //Constructor sao chep
~String();
//Destructor
const String &operator=(const String &); //Phep gan
String &operator+=(const String &);
//Phep noi
int operator!() const;
//Kiem tra chuoi rong
int operator==(const String &) const;
int operator!=(const String &) const;
int operator<(const String &) const;
int operator>(const String &) const;
int operator>=(const String &) const;
int operator<=(const String &) const;
char & operator[](int);
//Tra ve ky tu tham chieu
String &operator()(int, int); //Tra ve mot chuoi con
int GetLength() const;
friend ostream &operator<<(ostream &, const String &);
friend istream &operator>>(istream &, String &);
};




Lớp Date
#include <iostream.h>
class Date

Bộ môn Công nghệ phần mềm


{
private:
int Month;
int Day;
int Year;
static int Days[]; //Mang chua so ngay trong thang
void HelpIncrement(); //Ham tang ngay len mot
public:
Date(int M = 1, int D = 1, int Y = 1900);
void SetDate(int, int, int);
Date operator++();
//Tien to
Date operator++(int);
//Hau to
const Date &operator+=(int);
int LeapYear(int);
//Kiem tra nam nhuan
int EndOfMonth(int);
//Kiem tra cuoi thang
friend ostream &operator<<(ostream &, const Date &);
};


b) Nội dung thảo luận: Nạp chồng toán tử là hàm bạn và hàm thành viên khác nhau như thế nào.
Nạp chồng trả về đối tượng do con trỏ this trỏ tới?
c) Nội dung tự học: Xây dựng nạp chồng các toán tử đối với các lớp.
d) Bài tập (bắt buộc, mở rộng):
Bài 1: Xây dựng lớp Complex chứa các số phức gồm các phép toán: +, -, *, /, +=, -=, *=, /=, ==,
!=, >, >=, <, <=.
Bài 2: Xây dựng lớp String để thực hiện các thao tác trên các chuỗi, trong lớp này có các phép
toán:
Phép toán + để nối hai chuỗi lại với nhau.
Phép toán = để gán một chuỗi cho một chuỗi khác.
Phép toán [] truy cập đến một ký tự trong chuỗi.
Các phép toán so sánh: ==, !=, >, >=, <, <=
Bài 3: Xây dựng lớp ma trận Matrix gồm các phép toán cộng, trừ và nhân hai ma trận bất kỳ.
Bài 4: Xây dựng lớp Rational chứa các số hữu tỷ gồm các phép toán +, - , *, /, ==, !=, >, >=, <, <=.
Bài 5: Xây dựng lớp Time để lưu trữ giờ, phút, giây gồm các phép toán:
Phép cộng giữa dữ liệu thời gian và một số nguyên là số giây, kết quả là một dữ
liệu thời gian.
Phép trừ giữa hai dữ liệu thời gian, kết quả là một số nguyên chính là số giây.
++ và – để tăng hay giảm thời gian xuống một giây.
Các phép so sánh.
Bài 6: Xây dựng lớp Date để lưu trữ ngày, tháng, năm gồm các phép toán:
Phép cộng giữa dữ liệu Date và một số nguyên là số ngày, kết quả là một dữ liệu
Date.
Phép trừ giữa hai dữ liệu Date, kết quả là một số nguyên chính là số ngày.
++ và – để tăng hay giảm thời gian xuống một ngày.
Bài 7. Xây dựng lớp Vector. Mỗi đối tượng của lớp sẽ đại diện cho một vector. Lớp chứa hàm dựng
mặc định, hàm dựng sao chép, hàm hủy, toán tử gán =; toán tử <<, >>; +, -, *, tích của một số và
vector; toán tử so sánh ==, toán tử chỉ số [].
4. Tài liệu tham khảo
• Lập trình hướng đối tượng với C++ / Lê Đăng Hưng, Tạ Tuấn Anh, Nguyễn Hữu Đức, Nguyễn

Thanh Thủy (Chủ biên), - Hà Nội : Khoa học và Kỹ thuật, 2009. -346 trang. Chương 4.
Bộ môn Công nghệ phần mềm




Giáo trình C++ & lập trình hướng đối tượng / Phạm Văn Ất (Chủ biên), Lê Trường Thông. – Hà
Nội : Hồng Đức, 2009. -495 trang. Phần 3,4.
• Object-Oriented Programming in C++ (4th Edition) / Robert Lafore. Sams Publishing, 2002.
Chapter 8.
5. Câu hỏi ôn tập
- Có mấy cách xây dựng nạp chồng toán tử?
- Cú pháp nạp chồng toán tử với hàm nạp chồng là hàm thành viên?
- Cú pháp nạp chồng toán tử với hàm nạp chồng là hàm bạn?
- Thế nào là hàm bạn?
- Cách nạp chồng toán tử chèn dòng, trích dòng.
- Cách nạp chồng toán tử hai ngôi?
- Cách nạp chồng toán tử một ngôi ?

Bộ môn Công nghệ phần mềm



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×