.13| So sánh class và struct

Một phần của tài liệu Tài liệu giảng dạy kỹ thuật lập trình 2 (Trang 75)

Tất cả thành phần của lớp trong C++ đều mặc định là private.

Từ khóa struct giống như từ khóa class ngoại trừ các thành phần trong struct mặc định là public:

Trong ngôn ngữ C hỗ trợ struct nhưng không hỗ trợ class. Struct trong C không hỗ trợ phương thức và phương thức khởi tạo. Trong C++ (khác C), một struct có thể chứa phương thức và phương thức khởi tạo. Mặc định các thành phần của struct là public, nhưng chúng ta có thể áp dụng nhãn private và public như trong một lớp để quy định khả năng truy cập của người dùng.

Mặc dù chúng tương tự nhau nhưng người lập trình thích dùng class hơn struct để xây dựng kiểu dữ liệu. Cấu trúc struct hữu ích cho việc khai báo kiểu dữ liệu đơn giản. Cùng xem xét kiểu int, có thể thao tác trực tiếp với số nguyên và kiểu này khơng có các phương thức hay bất cứ phần ẩn thơng tin nào.

4.14| SỬ DỤNG ĐỐI TƯỢNG LÀM THAM SỐ CHO HÀM

Hàm print_fraction sau được truyền một tham số f (là một đối tượng của lớp SimpleRational) dưới dạng truyện tham trị.

Tại nơi sử dụng:

Khi một đối tượng được truyền tham số cho một hàm thì trong hàm đó chỉ có thể truy cập tới thành phần public của đối tượng.

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 72

Đối tượng có thể truyền dưới dạng tham trị hoặc tham chiếu cho hàm như sau:

4.15| CON TRỎ ĐỐI TƯỢNG VÀ MẢNG ĐỐI TƯỢNG

Xét lớp Pont sau:

Câu lệnh: Point pt;

Khai báo một biến pt cũng chính là tạo ra một đối tượng lớp Point. Cũng như kiểu dữ liệu khác chúng ta có thể khai báo một con trỏ dùng để trỏ tới đối tượng: Point pt;

Point *p_pt;

Trước khi sử dụng con trỏ p_pt thì phải gửi tạo giá trị ban đầu cho con trỏ để trỏ vào một đối tượng đã tồn tại:

p_pt = &pt;

hoặc sử dụng toán tử new để cấp phát một đối tượng động trong vùng nhớ heap: p_pt = new Point;

Nếu lớp có một phương thức khởi tạo có tham số, chúng ta cần cấp đối số thích hợp khi sử dụng new.

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 73 //BankAccountMethods.cpp #include <iostream> #include <iomanip> #include <string> class Account {

// String representing the name of the account's owner std::string name;

// The account number int id;

// The current account balance double balance;

public:

// Initializes a bank account object

Account(const std::string& customer_name, int account_number, double amount):name(customer_name), id(account_number),

balance(amount) {

if (amount < 0) {

std::cout << "Warning: negative account balance\n"; balance = 0.0;

} }

// Adds amount amt to the account's balance. void deposit(double amt)

{

balance += amt; }

/* Deducts amount amt from the account's balance,if possible. Returns true if successful; otherwise, it returns false.

A call can fail if the withdraw would cause the balance to fall below zero

*/

bool withdraw(double amt) {

bool result = false; // Unsuccessful by default if (balance - amt >= 0)

{

balance -= amt;

result = true; // Success }

return result; }

// Displays information about the account object void display()

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 74

std::cout << "Name: " << name << ", ID: " << id << ", Balance: " << balance << '\n'; } }; int main() { Account acct1("Joe", 2312, 1000.00); Account acct2("Moe", 2313, 500.29); acct1.display(); acct2.display(); std::cout << "---------------------" << '\n'; acct1.withdraw(800.00); acct2.deposit(22.00); acct1.display(); acct2.display(); }

Khai báo một đối tượng và một con trỏ sau:

Con trỏ acct_ptr có thể dùng để trỏ vào một đối tượng đã tồn tại:

Hoặc dùng để trỏ tới một đối tượng cấp phát động:

Để truy cập tới thành phần của đối tượng mà con trỏ đang cịn lý có hai cách: Thứ nhất: dùng tốn tử (.):

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 75

Thứ hai dùng toán tử (→):

Lưu ý khi dùng bộ nhớ động thì nên hủy bằng tốn tử delete để giải phóng vùng nhớ cho đối tượng.

Trong ví dụ này nếu chúng ta quên delete vùng nhớ cấp phát động thì sẽ xảy ra hiện tượng phân mảnh vùng nhớ (memory leak). Nếu chương trình kết thúc nhanh thì vấn đề này khơng đáng ngại so với chương trình chúng ta chạy dài hơn ví dụ như một web server, hiện tượng memory leak có thể gây ra sự sụp đổ sau một khoảng thời gian.

Khi chúng ta muốn tạo một danh sách các đối tượng thì sẽ tạo như sau:

Trong trường hợp này, khi chương trình khơng cịn cần sử dụng tới vector accts nữa thì phải thực hiện mã nguồn sau:

4.16|ĐỐI TƯỢNG THÀNH PHẦN

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 76

Một đối tượng lại là một thành phần thuộc tính của một lớp khác, đối tượng này gọi là đối tượng thành phần. Lớp có đối tượng thành phần được gọi là lớp bao.

Cách xây dựng phương thức khởi tạo cho lớp bao

Cú pháp:

TenLopBao(DS cac tham so):DTThanhPhan1,DTThanhPhan2,.. {

// khởi tạo cho các thuộc tính cịn lại khơng phải là đối tượng thành phần

}

Ví dụ:

Truy xuất thành phần của đối tượng thành phần

Việc truy xuất đến thuộc tính (đối tượng thành phần) trong lớp bao theo quy tắc sau:

• Khơng thể nào truy xuất được thành phần private của đối tượng thành phần trong lớp bao.

• Được phép truy xuất đến thành phần public của đối tượng thành phần trong lớp bao.

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 77

4.17| TỪ KHÓA FRIENDS 4.17.1| HÀM BẠN 4.17.1| HÀM BẠN

Thơng thường thì một hàm khơng phải là thành phần của lớp thì nó khơng có quyền truy cập đến những thành phần private, protected của đối tượng.

Ví dụ:

Giải pháp giải quyết vấn đề này: khai báo hàm thông thường này là bạn (friend) của lớp. Khi đó hàm này có thể truy cập được những thuộc tính đã đóng gói của lớp.

Cú pháp khai báo hàm bạn:

friend <khai báo hàm>;

Khai báo này được đặt ở trong lớp, khi định nghĩa hàm này thì khơng cần đặt từ khóa friend nữa.

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 78

Lưu ý: một hàm có thể làm bạn của nhiều lớp. Khi đó phải khai báo mẫu trước các tên lớp đó.

4.17.2| LỚP BẠN

Nếu lớp B được khai báo là bạn của lớp A thì tất cả các phương thức của B có thể truy xuất đến thành phần riêng của lớp A.

• Một lớp có thể là bạn của nhiều lớp

• Có thể khai báo A là bạn của B và ngược lại. • Phải khai báo trước các lớp.

Cú pháp: friend class <Tênlớp> Ví dụ:

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 79

BÀI TẬP THỰC HÀNH SỐ 4 II. Thơng tin chung:

• Mã số bài tập : HW2-KTLT2

• Hình thức nộp bài : Nộp qua Moodle mơn học • Thời hạn nộp bài : … / … / ……

• Nội dung : Chương 4: Các đối tượng tự xây dựng

Chuẩn đầu ra cần đạt:

L.O.2 Phân tích, thiết kế chương trình thêo hướng đối tượng. Cài đặt được sơ đồ lớp cho các chương trình vừa và nhỏ;

L.O.8 Làm bài tập và nộp bài đúng quy định.

BÀI TẬP CƠ BẢN

Bài 1. Sinh viên trả lời các câu hỏi sau

a. Giải thích sự khác nhau giữa một thành phần public và một thành phần public của một lớp.

b. Giải thích sự khác nhau giữa hàm thành phần của lớp và một hàm của chương trình.

c. Giải thích sự khác nhau giữa một struct và một class trong chương trình C++.

d. Có thể có bao nhiêu constructor và destructor trong một lớp? Giải thích sự khác nhau giữa chúng?

e. Giải thích sự khác nhau giữa Default constructors, Parameterized Constructors và Copy constructors.

f. Giải thích sự khác nhau giữa Copy constructor và assignment operator. g. Những hàm thành phần nào có thể được tự động tạo ra bởi trình biên

dịch và khi nào?

Với mỡi bài tốn sau hãy vẽ sơ đồ lớp sau đó cài đặt sơ đồ lớp đó.

Bài 2. Viết chương trình cho phép tạo ra các đối tượng Time (thời gian) được

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 80

Bài 3. Viết chương trình cho phép tạo ra các đối tượng Author (tác giả) được mô

tả theo sơ đồ lớp sau:

Bài 4. Viết chương trình cho phép tạo ra các đơn thức và thực hiện các chức

năng sau cho mỗi đơn thức đó:

a. Khởi tạo đơn thức

b. Phương thức hủy

c. Xuất đơn thức

d. Lấy giá trị hệ số, số mũ

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 81

f. Tính giá trị đơn thức

g. Cộng đơn thức

h. Xây dựng hàm toán tử >>, <<, +.

Bài 5. Viết chương trình quản lý sinh viên. Biết rằng mỗi sinh viên cần lưu trữ

các thuộc tính sau : họ tên , lớp, điểm trung bình tích lũy.

Hãy thiết kế lớp SinhVien với những thuộc tính đã mơ tả và các phương thức sau:

a. Khởi tạo và huỷ đối tượng

b. Định nghĩa toán tử nhập, xuất cho lớp c. Xếp loại cho sinh viên biết :

- Nếu đtb>8.5→Giỏi

- Nếu đtb>=7→ Khá

- Nếu đtb>=5→ Trung Bình

- Cịn lại Yếu

d. Viết chương trình chính cho phép tạo ra các đối tượng của lớp SinhVien và gọi các chức năng của đối tượng.

Bài 6. Viết chương trình để quản lý danh sách các máy tính của một cửa hàng.

Biết rằng thơng tin của một máy tính bao gồm: - Loại máy

- Nơi sản xuất

- Thời gian bảo hành

a. Xây dựng lớp MayTinh với các thuộc tính đã cho và một số phương thức sau:

- Khởi tạo, hủy

- Xuất thông tin

b. Viết chương trình chính cho phép tạo ra danh sách gồm n máy tính của cửa hàng. Sau đó thực hiện các chức năng sau:

c. Viết hàm thống kê xem có bao nhiêu máy có thời gian bảo hành là 1 năm. d. In ra danh sách các máy tính có xuất xứ từ Mỹ

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 82

Với mỗi biên lai, có các thơng tin sau: thông tin về hộ sử dụng điện, chỉ số cũ, chỉ số mới, số tiền phải trả của mỗi hộ sử dụng điện (số tiền phải trả = (Số mới - số cũ) * 750).

Xây dựng ứng dụng quản lý biên lai tiền điện theo mô tả sau:

Các thông tin riêng của mỗi hộ sử dụng điện gồm: Họ tên chủ hộ, số nhà, mã số công tơ của hộ dân sử dụng điện.

1. Hãy xây dựng lớp KhachHang để lưu trữ các thông tin riêng của mỗi hộ sử dụng điện và các phương thức nhập, xuất thông tin

2. Xây dựng lớp BienLai để quản lý việc sử dụng và thanh toán tiền điện của các hộ dân và các phương thức nhập, xuất thông tin.

3. Xây dựng chương trình có các chức năng sau: a. Nhập vào các thông tin cho n biên lai b. Hiển thị thông tin về các biên lai đã nhập.

c. Tính tổng tiền mà người quản lý thu được từ các biên lai.

Bài 8. Viết chương trình quản lý điểm của sinh viên với mỗi sinh viên có các

thơng tin về: Mã sinh viên, tên sinh viên, lớp học và môn học, biết rằng một sinh viên chỉ thuộc 1 lớp học và có nhiều mơn học.

Thông tin lớp học bao gồm: Tên lớp, khóa. Thơng tin về mơn học bao gồm: Tên mơn, số trình, điểm. u cầu chương trình có các chức năng sau:

• Nhập thơng thin cho n sinh viên sao cho mỗi sinh viên có đủ thơng tin • In ra danh sách các sinh viên vừa nhập gồm các thông tin: mã sinh viên,

tên sinh viên, tên lớp và khóa.

• In ra phiếu báo điểm cho từng sinh viên theo mẫu:

Phiếu Báo Điểm

Mã sinh viên: SV001 Tên sinh viên: Nguyễn Hải Hà

Lớp: Tin2 Khóa: 52

Bảng điểm:

Tên môn Số trình Điểm

Cơ sở dữ liệu 4 8

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 83

Hệ điều hành 5 9

Bài 9. Phòng đào tạo của Trường đại học ABC cần xây dựng ứng dụng quản

lý sinh viên để dễ dàng theo dõi tình hình học tập và rèn luyện của sinh viên trong trường. Biết rằng mỗi sinh viên được mô tả bởi mã sinh viên, họ tên,

năm sinh và danh sách các mơn học mà sinh viên đã tích lũy đến thời điểm hiện tại. Biết rằng với mỗi môn học cần được lưu trữ thông tin: mã mơn

học, tên mơn học, số tín chỉ và điểm mơn học.

1. Hãy xây dựng các lớp cần thiết cho ứng dụng. Với lớp sinh viên cần xây dựng các chức năng sau:

a. Nhập dữ liệu cho sinh viên

b. Xem thơng tin sinh viên (ngồi những thơng tin được mô tả, cần xuất thêm thơng tin về điểm trung bình tích lũy, xếp loại học tập)

Mơ phỏng mơ hình khi xuất dữ liệu:

MaSV: sv01

Ho ten: Nguyen Van An Nam sinh: 1996

Danh sach gom 2 mon hoc:

STT Ma Mon Ten Mon So tin chi Diem

1 Csc1060001 Nhap mon 3 5

2 Csc1070001 KTLT 3 5

Diem trung binh tich luy: 5.0 Xep loai: Trung binh

c. Tính điểm trung bình tích lũy theo cơng thức:

Tbtl = (điểm mơn 1. * tín chỉ mơn 1 + điểm mơn 2 * tín chỉ mơn 2 + …)/(tín chỉ 1 + tín chỉ 2 +…)

d. Xếp loại học tập sinh viên. Biết rằng • Nếu tbtl >= 9 : xuất sắc • 9>Tbtl >= 8: Giỏi • 8 > tbtl >= 7: Khá • 7 > tbtl >=6: Trung bình • Cịn lại là yếu

2. Xây dựng thêm lớp DanhSachSinhVien. Biết rằng mỗi danh sách cần lưu trữ mảng sinh viên và số lượng sinh viên thực tế. Các phương thức cần xây dựng cho lớp này bao gồm: Nhập danh sách, xuất danh sách, tìm sinh viên có điểm trung bình cao nhất. Sau đó tại chương trình chính cho phép tạo ra 1 danh sách sinh viên (L) của trường (đối tượng của lớp DanhSachSinhVien) và gọi các chức năng như sau:

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 84

L.nhapDS(); L.xuatDS();

L.diemTBCaoNhat();

Bài 10. Xây dựng class TAILIEU gồm các thuộc tính sau:

- Mã tài liệu - Loại tài liệu - Tên tài liệu - Tác giả - Nhà xuất bản - Ghi chú

Dựa trên class TAILIEU, xây dựng chương trình quản lý thự viên trong mơi trường console.

u cầu chương trình:

- Chương trình cho phép nhập mới tài liệu, thông tin tài liệu được lưu giữ trong file TAILIEU.DAT.

- Chương trình cho phép duyệt và xem thơng tin tài liệu lần lượt từ tài liệu đầu tiên cho đến tài liệu cuối cùng và ngược lại

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 85

5. Chương 5. KẾ THỪA VÀ ĐA HÌNH

Chương này nhằm trang bị cho sinh viên kiến thức về kế thừa trong luồng nhập xuất, các cơ chế và cách sử dụng kế thừa, đa hình trong lập trình. Qua đó sinh viên có thể lập trình chun sâu hơn theo hướng đối tượng.

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 86

5.1| KẾ THỪA TRONG LUỒNG NHẬP, XUẤT (I/O STREAM INHERITANCE)

5.2| SƠ ĐỒ LỚP TRONG I/O STREAM

Sơ đồ các lớp trong iostream như sau:

• ios: là lớp cơ sở

• istream, ostream: là lớp kết thừa từ lớp ios • ifstream: là lớp kế thừa từ istream (và ios) • ofstream kế thừa từ ostream (và ios)

• iostream kế thừa từ istream và ostream (và ios) • fstream kế thừa từ ifstream, iostream, và ofstream

Trong chương 2, việc khai báo sử dụng đối tượng std::ofstream ta có thể dễ dàng sử dụng toán tử << để ghi dữ liệu vào file dễ dàng như sử dụng std::cout khi xuất dữ liệu ra màn hình:

std::ofstream fout("myfile.dat"); int x = 10;

if (fout.good()) { // Make sure the file was opened properly

fout << "x = " << x << '\n'; }

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 87

std::cout << "Unable to write to the file

\"myfile.dat\"\n";

Ta đã biết, opperator<< có thể được nạp chồng (overload) trên vector như trong ví dụ sau:

ostream& operator<<(ostream& os, const

Một phần của tài liệu Tài liệu giảng dạy kỹ thuật lập trình 2 (Trang 75)

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

(143 trang)