Tải bản đầy đủ (.ppt) (36 trang)

Lập trình hướng đối tượng

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 (379.06 KB, 36 trang )

LỚP



BÀI 2

Lập trình Hướng đối

1


Mục đích bài học




Sử dụng toán tử phạm vi
Cấp phát bộ nhớ động với :








new
delete

Sử dụng con trỏ
Định nghĩa và sử dụng hàm Khởi tạo


Định nghĩa và sử dụng hàm Hủy
Từ khóa const

Lập trình Hướng đối

2


Mục đích bài học




Định nghĩa và sử dụng con trỏ this
Sự sắp xếp đối tượng và hàm trong bộ
nhớ





Dữ liệu thành viên tĩnh
Hàm thành viên tĩnh

Chuyển đổi kiểu :



Chuyển đổi bằng phép gán
Áp đổi kiểu


Lập trình Hướng đối

3


Toán tử phạm vi



Ta có thể định nghĩa một hàm bên
ngoài lớp bằng các dùng toán tử phạm
vi ::


Cú pháp :
Kiểu_trả_về Tên_lớp :: Tên_hàm(đốisố1, đốisố2...)





Kiểu của các đối số phải trùng khớp với kiểu đã
được khai báo trong lớp.

Định nghĩa hàm bên ngoài lớp làm cho
chương trình sáng sủa dễ đọc hơn

Lập trình Hướng đối


4


Toán tử phạm vi (tiếp)






Bên trái toán tử :: phải là tên của lớp.
Khi xuất hiện toán tử phạm vi thì hàm đó được
xác định là thành viên của một lớp cụ thể.
Toán tử :: còn được dùng để tham chiếu đến
các biến toàn cục trong trường hợp biến toàn
cục và biến nội tại (biến của riêng hàm) trùng
tên




Cú pháp : ::tên_biến_toàn_cục

Cho phép ta tự do hơn trong việc đặt tên biến

Lập trình Hướng đối

5



Cấp phát bộ nhớ động









Một đối tượng sẽ được tạo khi định nghĩa
của nó xuất hiện trong 1 chương trình và
nó sẽ bị hủy khi vượt ra ngoài phạm vi
hoặc khi chương trình kết thúc.
Chỉ nên tạo ra các đối tượng trong phạm
vi cần thiết.
Ta dùng toán tử new để tạo và delete để
hủy các đối tượng.
Các đối tượng được cấp phát bởi new và
delete thì gọi là cấp pháp động.

Lập trình Hướng đối

6


New






Toán tử new dùng để tạo ra một không gian
nhớ cho một đối tượng của lớp.
Cú pháp :




Kiểu_dữ_liệu biến_trỏ = new Kiểu_dữ_liệu;

Ví dụ :
int *p;
float *f;
p = new int;
f = new float;



Nếu lời gọi new thành công thì nó trả về con
trỏ trỏ tới không gian nhớ đã được cấp phát.

Lập trình Hướng đối

7


New (tiếp)






Trả về 0 hoặc lỗi nếu cấp phát không
gian nhớ không thành công.
Cú pháp tương tự cho một đối tượng :





Student *stu_ptr;
stu_ptr = new Student;

Toán tử new tương tự như hàm
malloc() trong C.

Lập trình Hướng đối

8


Delete








Đối tượng được tạo bởi new sẽ tồn tại cho đến khi nó bị hủy
một cách tường minh bằng delete.

delete tên_biến_trỏ;
Ví dụ :
int * ptr;
ptr = new int;
*ptr = 12;
cout << *ptr;
delete ptr;
Nên giải phóng bộ nhớ bằng delete sau khi đã sử dụng xong.
Thận trọng : không được sử dụng con trỏ trỏ tới không gian
nhớ đã được giải phóng bằng delete.

Lập trình Hướng đối

9


Cấp phát mảng


Để cấp phát khối các mảng có độ dài thay đổi
thì ta dùng kỹ thuật tương tự như trên.
int * ptr;
ptr = new int[100];
delete[] ptr;






Bất cứ khi nào dùng new để cấp phát mảng các
đối tượng, thì phải dùng [] sau chỉ lệnh delete.
Lỗi nếu ta dùng delete để giải phóng bộ nhớ
của biến đã được cấp phát bằng malloc hoặc
free đối với biến đã được cấp phát bằng new.

Lập trình Hướng đối

10


Con trỏ trỏ đến các đối tượng







Con trỏ có thể trỏ đến các đối tượng
cũng như các kiểu dữ liệu khác.
Khai báo con trỏ trỏ đến đối tượng cũng
giống như việc khai báo một con trỏ trỏ
đến một biến thuộc bất kỳ kiểu dữ liệu
nào.
Nó hữu dụng khi vào thời điểm viết
chương chình chúng ta không biết cần
phải tạo ra bao nhiêu đối tượng.


Lập trình Hướng đối

11


Con trỏ trỏ đến các đối tượng (tiếp)



Ta dùng new để tạo ra các đối tượng
vào thời điểm chạy.
date *today_ptr;
today_ptr = new date;



Vì today_ptr là con trỏ trỏ đến một đối
tượng nên ta dùng toán tử -> để truy
cập đến các thành viên của đối tượng :


today_ptr->getdate();

Lập trình Hướng đối

12


Hàm khởi tạo







Hàm khởi tạo là một hàm thành viên đặc
biệt dùng để tự động khởi tạo một đối
tượng.
Nó có cùng tên với lớp chứa nó.
Ta cũng có thể khai báo và định nghĩa
hàm khởi tạo bên trong lớp hoặc khai
báo bên trong nhưng định nghĩa bên
ngoài lớp như đối với các hàm thành
viên.

Lập trình Hướng đối

13


Hàm khởi tạo (tiếp)

class username{
public :
username(); //Hàm khởi tạo
};
username::username() {}







Không có kiểu trả về
Nó được gọi khi các đối tượng được tạo
Ta có thể định nghĩa nhiều hàm khởi tạo theo
các cách khởi tạo khác nhau.
Hàm khởi tạo mặc định là hàm không có đối
số.

Lập trình Hướng đối

14


Hàm khởi tạo (tiếp)

class date{
int month, day, year;
public :
date()
{ day=1; month=1; year=1999;}
date(int x)
{ day=x; month=1; year=1999;}
date(int x, int y, int z)
{ day=x; month=y; year=z;}
};

Lập trình Hướng đối


15


Hàm khởi tạo (tiếp)





Các hàm khởi tạo phải có các kiểu đối số
khác nhau sao cho bộ biên dịch có thể phân
biệt được và lựa chọn đúng hàm cho mỗi
cách dùng.
Các ví dụ sau sẽ gọi các hàm khởi tạo khác
nhau tùy thuộc vào giá trị của đối số :




date now;
date today(4);
date all(23,3,1998);

Lập trình Hướng đối

16


Hàm hủy








Hàm hủy là một hàm thành viên được gọi tự động khi
đối tượng bị hủy.
Ta không thể gọi trực tiếp, bộ biên dịch kích phát lời gọi
đến hàm hủy khi một đối tượng vượt ra ngoài phạm vi.
Có cùng tên với tên lớp nhưng có thêm dấu ~ phía
trước.




class username(){
public :
~username();
};

Không có kiểu trả về, không có đối số.

Lập trình Hướng đối

17


Giải phóng bộ nhớ với delete




Hàm hủy thường được sử dụng để giải phóng bộ nhớ đã được
cấp phát cho các đối tượng đã được tạo trong hàm khởi tạo
dùng toán tử new.
class String{
private:
char *str;
public:
String(char *s){
int length = strlen(s);
str = new char[length + 1];
strcpy(str,s);
}
~String(){delete[] str;}
};

Lập trình Hướng đối

18


Từ khóa const







Hằng là một thực thể có giá trị không thay
đổi trong suốt quá trình thực thi của chương
trình.
Ta dùng từ khóa const trong khai báo hằng.
Ta không thể gán giá trị cho hằng, do vậy ta
phải khởi tạo nó khi khai báo.
const int num = 100;
num = 200; //Lỗi
num++; //Lỗi

Lập trình Hướng đối

19


Const và con trỏ




Khi dùng const với một con trỏ thì sẽ có hai đối
tượng liên quan : con trỏ và đối tượng mà nó trỏ
tới.
Nếu khai báo một con trỏ với từ khoá const ở phía
trước thì sẽ biến đối tượng (chứ không phải con
trỏ) thành một hằng.
int num = 10;
const int *iptr = #
*iptr = 25; //Lỗi
num = 25; //OK, vì num không phải là hằng

int xyz = 200;
iptr = &xyz; //OK, có thể trỏ tới bất kỳ địa chỉ nào
*iptr = 305; //Lỗi

Lập trình Hướng đối

20


Const và con trỏ (tiếp)



Ta cũng có thể khai báo một con trỏ là
một hằng bằng cách dùng toán tử
*const :
int a1 = 777;
int *const ptr = &a1;
*ptr = 66; //OK
int a2 = 45;
ptr = &a2; //Lỗi vì ptr là hằng

Lập trình Hướng đối

21


Const và con trỏ (tiếp)




Từ khóa const có thể được sử dụng trong
danh sách các tham số để giới hạn cách
sử dụng của một tham số. Điều này rất
hữu dụng đối với các đối số trong hàm :
void func (const char *str){
str = “Hello”; //OK
*str = ‘A’; //Lỗi
}
void func1 (const int index){
index = 5; //Lỗi
}

Lập trình Hướng đối

22


Con trỏ this







Con trỏ this trỏ tới địa chỉ của đối tượng,
qua this ta có thể truy cập các thành viên.
Bất cứ khi nào một hàm thành viên được
gọi thì bộ biên dịch sẽ gán địa chỉ của đối

tượng đã kích hoạt hàm thành viên đó cho
con trỏ this.
Ta dùng this và toán tử -> để truy cập đến
các thành viên của đối tượng :



this->age;
this->getdata();

Lập trình Hướng đối

23


Cách dùng this
class Person{
private:
int age;
public:
void display();
};
void Person::display(){
this->age = 25;
cout<<this->age;
}
void main(){
Person Jack;
Jack.display();
}


Lập trình Hướng đối

24


Đối tượng và hàm trong bộ nhớ







Mỗi đối tượng có một bản sao giá trị các
dữ liệu thành viên của riêng nó.
Tất cả các đối tượng cùng một lớp sử
dụng chung các hàm thành viên. Các
hàm này chỉ được tạo và cấp phát bộ nhớ
một lần.
Trong khi đó dữ liệu được cấp phát bộ
nhớ mỗi khi một đối tượng được khởi tạo.

Lập trình Hướng đối

25


×