Hướng đối tượng - Lớp và đối tượng
Trang 1I Cài đặt lớp và tạo thực thể
Dùng từ khóa class
permission_label_1:
permission_label_2:
} object_name;
Trong đó :
class_name: Tên của lớp
object_name là một hoặc nhiều danh biểu xác định đối tượng (object) (thực thể instance).
members: dữ liệu hoặc phát biểu hàm
permission labels: (tùy chọn) có thể là các từ khóa: private:, public:
hoặc protected: Nhằm xác định quyền truy cập các members liên quan
Thiếu dấu ” ;”
này sẽ bị những thông báo lỗi rất khó hiểu!
Trang 2Thuộc tính truy cập
private: members của class chỉ có thể
truy xuất bởi các members khác thuộc
cùng lớp hoặc từ các lớp " friend "
các members khác thuộc cùng lớp hoặc từ các lớp " friend “, và từ các members của các lớp dẫn xuất
nơi nào thấy được class.
Trang 3Cài đặt lớp và tạo thực thể
Có sự khác biệt giữa khai báo theo kiểu lập trình hướng thủ tục và hướng đối
tượng.
Sử dụng toán tử phân giải phạm vi (scope
Ví dụ 1 về lập trình kiểu thủ tục
Ví dụ 2 về thiết kế Class và Object (1)
Ví dụ 3 về thiết kế Class và Object (2)
Ví dụ 4 về mảng các đối tượng (arrays of objects)
Trang 4II.Phương thức thiết lập và phương thức hủy bỏ
(Constructors and Destructors)
Phương thức thiết lập là phương thức sẽ được gọi một
cách tự động khi đối tượng được khởi tạo.
Trong C++ không cho phép khởi tạo dữ liệu trong khi khai báo class vì vậy xây dựng constructor là rất cần thiết Thực chất constructor là một method Init
Khai báo phương thức này bằng cú pháp:
Class class_name {
member;
…
public:
member;
… ;
class_name(void); // constructor here !
} object_name;
Ví dụ 5
Lưu ý: không định nghĩa giá trị trả về cho method này
Trang 5Phương thức thiết lập
(Constructors) Chuyển tham số cho constructor
Trong nhiều trường hợp ta cần khởi tạo đối tượng với các tính chất được xác định đặc biệt, khi đó cần chuyển một hoặc
nhiều tham số cho constructor.
Có thể truyền tham số cho constructor
ngay trong khai báo class Ví dụ 5b
Cũng có thể truyền tham số cho
constructor khi khai báo object Ví dụ 5c
Trang 6Phương thức hủy bỏ
(Destructors)
Phương thức hủy bỏ là phương thức sẽ được gọi một cách tự động khi đối tượng bị hủy
Khai báo phương thức này bằng cú pháp:
Class class_name {
member;
…
public:
member;
… ;
} object_name;
Ví dụ 6
Coi
chừng
ngã
Trang 7Phân bổ bộ nhớ động
Nhiều đối tượng cần được tạo ra trong thời gian chạy chương trình và cần bị hủy (giải phóng
khỏi bộ nhớ) khi đã hết nhiệm vụ
Cú pháp cấp phát vùng nhớ:
(datatype) pointer_var = new datatype
Ví dụ:
int *p;
Student *sv_ptr; // Student là một class
Ví dụ 8
Tham khảo thêm về sử dụng bộ nhớ trong C++
Trang 8Thu hồi bộ nhớ động
Cú pháp thu hồi vùng nhớ:
delete pointer_var
Ví dụ:
int *ptr;
Student *sv_ptr; // Student là một class
ptr = new int; // cấp phát vùng nhớ
*p
*ptr = 1276;
cout << *ptr;
delete ptr; // Thu hồi vùng nhớ *p
sv_ptr = new Student;
… // xử lí *sv_ptr ở đây
delete sv_ptr;
Trang 9Tham chiếu bộ nhớ động
KHÔNG DÙNG TOÁN TỬ (.) tham chiếu đến các phương thức trong một đối tượng được trỏ: vì toán tử này yêu cầu bên trái
nó là một đối tượng.
PHẢI DÙNG TOÁN TỬ MŨI TÊN (->)
Ví dụ:
Student *Sv_ptr;
Sv_ptr= new Student;
Sv_ptr.hanhdong(); // SAI
Sv_ptr->hanhdong(); //ĐÚNG
Trang 10III Lớp thừa kế (Inheritance)
Một lớp con có thể thừa kế các thành phần (member)
bao gồm data và method của một lớp cha (base class)
Lớp con có thể thêm các thành phần mới hoặc overwrite các member của siêu lớp.
Khai báo:
Class class_name: inheritance_type base_class {
private data and function list public:
public data and funtion list } object_list;
Lớp cha (base classs):
class animal
{
public:
void eat(void)
void sleep(void)
void breathe(void)
};
Lớp con (derived class):
{ public:
int tail(void) int fur(void) } jerry ;
Inheritance_type có thể là public, private hoặc
protected
Trang 11Thuộc tính kế thừa
inheritance_ right có thể là:
– public: Mọi thành phần private của lớp cha là
private ở lớp con Mọi thành phần public của lớp cha là public ở lớp con
– private: Mọi thành phần của lớp cha là private
ở lớp con
– protected:
Trang 12VI Con trỏ this
Không nhất thiết dùng tên của đối tượng
để truy cập các thành phần của của đối tượng trong một hàm cũng là thành phần của đối tượng đó
Để tham chiếu tường minh đến các thành phần của một đối tượng, các hàm thành phần của cùng đối tượng có thể truy cập đến một con trỏ đặc biệt: this
Cú pháp: this -> member
Ví dụ về sử dụng con trỏ this
Trang 13VII Hàm và lớp friend
Khai báo hàm bao gồm khai báo kiểu giá trị trả về, tên hàm, số lượng tham số cùng kiểu của các tham số này.
Một khai báo hàm có thể không có giá trị trả về hoặc không có tham số gởi dến
Trong khai báo hàm cũng có thể khởi tạo ngay các giá trị tham số ngầm định.
void func1(void);
int factorial(int n);
char* ChangeCase(char* str; int case);
void func(int num1; int num2=3;char
=‘*’);
Trang 14Quá tải hàm (Overloading
function)
Quá tải một hàm là làm cho cùng một tên hàm
có thể được gọi với nhiều tham số khác nhau hoặc được chuyển giao với các kiểu dữ liệu
khác nhau
Để quá tải một hàm cần phải khai báo và thiết lập các trường hợp được quá tải
Constructor là một hàm vì vậy cũng có thể quá tải constructor
Trang 15Hàm và lớp friend
Vì một hàm không thể là thành viên của cùng một lúc hai class nên ta cần một biện pháp sao
cho một hàm có thể truy cập
được các member private của
một class mà nó không phải là
thành viên Một hàm như thế sẽ được gọi là “Friend - bạn” của
class.
Trang 16Chú ý: Một hàm friend khai báo trong một class không phải là thành viên của class đó, do đó có thể đặt hàm friend chổ nào cũng được trong khai báo class (trong phần private hay trong phần public đều được) và trong friend function không thể dùng con trỏ this
Cú pháp :
class CLASS1; // forward declaration
class CLASS2 {
private:
datatype1 var1;
public:
….
friend datatype FUNC(CLASS1 abc, CLASS2 xyz);
} class CLASS1 {
private:
datatype2 var2;
public:
….
friend datatype FUNC(CLASS1 abc, CLASS2 xyz) }
Ví dụ 10_1
Ví dụ 10_2
Trang 17Lớp friend
Có thể làm cho mọi hàm thành viên của
một lớp thành friend
Ví dụ:
class beta;
class alpha
{ private: int data;
};
class beta
{ public: void display(alpha d) {cout << d.data;}
void get_data(alpha d) {int x=d.data;}
};
Khai báo này giúp mọi thành viên của lớp beta trở thành friend của alpha
Giờ đây get_data() có thể truy cập dữ liệu của
alpha
Trang 18VIII Lớp có dữ liệu tĩnh
Một dữ liệu là tĩnh trong khai báo class nếu dữ liệu đó độc lập đối với mọi đối tượng của class Một dữ liệu tĩnh chỉ có một bản sao duy nhất (trong bộ nhớ) dùng chung cho mọi đối tượng thuộc class
Cú pháp: static data_type static_var;
Dữ liệu tĩnh phải được khởi tạo trước khi hàm main() bắt đầu:
data_type class_name :: static_var=value;
Ví dụ 11
Trang 19IX Lớp có phương thức tĩnh
Tương tự dữ liệu tĩnh, phương thức tĩnh là các hàm toàn cục như các hàm thành viên khác của class
Nó không phải là một phương thức thành viên của bất cứ đối tượng nào của lớp mà là thành viên trực tiếp của lớp
Phương thức tĩnh chỉ có thể gọi được các dữ liệu
tĩnh
Không thể sử dụng từ khóa this trong phương thức tĩnh vì sẽ gây ra sự tham chiếu đến con trỏ đối
tượng
Cú pháp: static data_type static_method ();
Cách gọi: class_name :: static_method()
Ví dụ 12
Trang 20class và các hàm khách (client
function) của class
Cấu trúc class trong C++ là một kiểu dữ liệu do người dùng định nghĩa Hàm sử
dụng dữ liệu kiểu class gọi là hàm khách của class đó.
C chỉ dùng cách chuyển tham trị (passing
by value) do đó một bản sao của đối
tượng (không phải chính đối tượng) sẽ
được gởi đến cho hàm Vì vậy không thể thay đổi thuộc tính của đối tượng bên
trong hàm khách được.
Ví dụ 13 Ví dụ 14