Định nghĩa kiểu dữ liệu trừu tượng bằng cấu trúc struct

Một phần của tài liệu Cplusplus_2011 (Trang 104 - 110)

Chương 7 Các kiểu dữ liệu trừu tượng

7.1. Định nghĩa kiểu dữ liệu trừu tượng bằng cấu trúc struct

là cấu trúc struct. Ví dụ, kiểu dữ liệu trừu tượng Time có thể được định nghĩa như sau trong C++:

struct Time { int hour; int minute; int second; };

Trong đó, hour, minute, second là các trường hay các thành viên dữ liệu của

cấu trúc Time.

Chú ý rằng các trường thuộc cùng một cấu trúc phải có tên khác nhau tuy rằng có thể trùng tên với các trường của một cấu trúc khác. Ngoài ra, phần định nghĩa một cấu trúc phải được kết thúc bằng một dấu chấm phảy.

Sau khi đã định nghĩa kiểu dữ liệu Time, ta có thể sử dụng nó y như các kiểu dữ liệu khác. Ta có thể khai báo biến, mảng, con trỏ, tham chiếu kiểu Time, ví dụ:

Time dinnerTime;

Time appointment[10];

Time *timePtr = &dinnerTime; Time &timeRef = dinnerTime;

Lưu ý: mặc dù cùng dùng từ khóa struct, nhưng struct của C++ khơng tương đương với struct của ngơn ngữ lập trình C.

Trong C++, biến thuộc kiểu dữ liệu cấu trúc cũng được đối xử như các kiểu dữ liệu thơng thường. Ta có thể thực hiện phép gán giá trị của biến Time này cho biến Time khác, ví dụ:

appointment[1] = dinnerTime;

Kết quả là giá trị của các thành viên dữ liệu của dinnerTime được sao chép vào các thành viên dữ liệu tương ứng của appointment[1]. Lưu ý rằng phép gán

mặc định của C++ là phép gán nơng, nghĩa là chỉ có giá trị của các thành viên được sao chép. Do đó nếu một trong các thành viên dữ liệu là con trỏ tới một vùng nhớ thì chỉ có giá trị của con trỏ được sao chép chứ nội dung của vùng nhớ thì khơng.

Để truy cập các thành viên dữ liệu của cấu trúc, ta có hai tốn tử dấu chấm (.) và mũi tên (->). Toán tử mũi tên (->) dùng để truy nhập các thành viên qua một

con trỏ đến đối tượng. Toán tử dấu chấm (.) được dùng trong các trường hợp cịn lại. Ví dụ, để in thành viên hour của biến dinnerTime ra màn hình:

cout << dinnerTime.hour;

hoặc

cout << timeRef.hour;

hoặc thông qua biến con trỏ timePtr như sau

cout << timePtr->hour;

Trong đó timePtr đang chứa địa chỉ của biến dinnerTime, còn timeRef là một tham chiếu của biến dinnerTime.

Lưu ý rằng biểu thức (*timePtr) cho ta chính biến dinnerTime, do đó ba biểu thức (*timePtr).hour, dinnerTime.hour, và timePtr->hour tương đương với nhau. Ngoài ra, cặp ngoặc trong biểu thức (*timePtr).hour là cần thiết do tốn tử * khơng được ưu tiên bằng tốn tử ->.

Hình 7.1 minh họa cách khai báo và sử dụng struct để khai báo cấu trúc dữ liệu Time. Cũng như các kiểu dữ liệu khác, kiểu dữ liệu có cấu trúc cũng có thể được truyền vào trong các hàm dưới dưới dạng tham số (xem Hình 7.2). Trong ví dụ đó, phần mã chương trình có nhiệm vụ in một giá trị kiểu Time ra màn

hình được chuyển thành hàm print với tham số là một tham chiếu tới biến Time cần in. Trong ví dụ này, tham số của hàm print được quy định là hằng tham chiếu (từ khóa const) để hàm này khơng có quyền sửa dữ liệu nằm trong biến

kiểu Time được truyền vào.

Khi sử dụng cơ chế truyền bằng giá trị, chẳng hạn print(Time), một bản sao

của đối số kiểu Time sẽ được truyền vào hàm tương tự như đối với tham số thuộc các kiểu dữ liệu khác. Tuy nhiên, để tránh việc phải tốn chi phí tính tốn và bộ nhớ cho việc sao chép các cấu trúc mà không phải cấp quyền sửa một cách không cần thiết, người ta thường dùng tham số là hằng tham chiếu như tại hàm print(const Time & t) trong Hình 7.2 thay vì dùng kiểu truyền giá trị. Một lựa chọn khác là dùng tham số là con trỏ, chẳng hạn

void print(Time * ptrTime)

void print (const Time * ptrTime)

Để ý rằng cấu trúc Time trong Hình 7.2 chỉ bao gồm dữ liệu. Phần chương trình xử lý dữ liệu của Time được đặt ở bên ngoài cấu trúc dữ liệu Time, tại các hàm có chức năng thao tác dữ liệu Time. Đây chính là đặc điểm của phong cách lập trình hướng thủ tục: dữ liệu được khai báo một nơi và xử lý dữ liệu một nơi. Cụ thể, trong ví dụ của ta, các hàm print, setTime và main tuy nằm ngồi và độc lập với Time nhưng lại có tồn quyền thao tác dữ liệu nằm trong các biến kiểu

Time, chẳng hạn như gán cho một biến Time giá trị không hợp lệ 3:100:-1. Đây

là giới hạn của các ngơn ngữ lập trình thủ tục. Các ngơn ngữ lập trình hướng đối tượng đi xa hơn và cung cấp cơ chế tự bảo vệ cho các kiểu dữ liệu. Ta có thể sửa cấu trúc Time trong Hình 7.2 để sử dụng cơ chế đó, mục tiếp theo sẽ nói về vấn đề này.

// define struct Time and test it. #include <iostream>

using namespace std;

// Time structure definition struct Time { int hour; // 0-23 (24-hour clock format) int minute; // 0-59

int second; // 0-59 }; // end struct Time

int main() {

Time dinnerTime, midnight; // variables of new type Time dinnerTime.hour = 18; // set hour member of dinnerTime dinnerTime.minute = 30; // set minute member of dinnerTime dinnerTime.second = 0; // set second member of dinnerTime midnight.hour = 0; // set hour member of midnight midnight.minute = 0; // set minute member of midnight midnight.second = 0; // set second member of midnight cout << "Dinner will be held at "

<< dinnerTime.hour << ":" << dinnerTime.minute << ":" << dinnerTime.second << endl;

cout << "Lights will be switched off at " << midnight.hour << ":"

<< midnight.minute << ":" << midnight.second << endl; return 0;

}

Kết quả chạy chương trình Dinner will be held at 18:30:0

// define struct Time and test it. #include <iostream>

#include <iomanip> using namespace std;

// Time structure definition struct Time { int hour; // 0-23 (24-hour clock format) int minute; // 0-59

int second; // 0-59 }; // end struct Time

// print time to the screen void print (const Time &t) {

cout << t.hour << ":" << t.minute << ":" << t.second; }

// set hour, minute, and second of a Time structure void setTime (Time &t, int hour, int minute, int second) {

t.hour = hour; t.minute = minute; t.second = second; }

int main() {

Time dinnerTime, midnight; // variables of the type Time setTime(dinnerTime, 18, 30, 0);

setTime(midnight, 0, 0, 0);

cout << "Dinner will be held at "; print(dinnerTime);

cout << endl;

cout << "Lights will be switched off at "; print(midnight);

return 0; }

Một phần của tài liệu Cplusplus_2011 (Trang 104 - 110)

Tải bản đầy đủ (PDF)

(145 trang)