1. Trang chủ
  2. » Công Nghệ Thông Tin

4 nạp chồng toán tử

5 739 7

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 116 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

− 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ó

Trang 1

HỌC VIỆN KỸ THẬT QUÂN SỰ

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 );

− 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:

Trang 2

− 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:

Trang 3

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ụ

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 &);

};

#include <iostream.h>

class Date

Trang 4

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

Trang 5

• 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 ?

Ngày đăng: 18/10/2017, 04:42

TỪ KHÓA LIÊN QUAN

w