Bài giảng môn Lập trình - Chương 4: Lớp và đối tượng
Lập trình
Chương 4: Lớp và đối tượng
2/10/2017
Nội dung
. 4.1 Khái niệm
. 4.2 Định nghĩa lớp
. 4.3 Biến thành viên
. 4.4 Hàm thành viên
. 4.5 Kiểm soát truy nhập
. 4.6 Bài tập phần 1
. 4.7 Hàm tạo và hàm hủy
. 4.8 Hàm tạo bản sao
. 4.9 Hàm toán tử gán
. 4.10 Thành viên tĩnh
. 4.11 Nạp chồng toán tử
. 4.12 Khai báo friend
2
Chương 4: Lớp và đối tượng
4.1 Khái niệm
. Đối tượng là gì?
– Mô hình đại diện của một đối tượng vật lý:
Person, student, employee, employer
Car, bus, vehicle,…
– Đối tượng logic
Trend, report, button, window,…
. Một đối tượng có:
– Các thuộc tính
– Trạng thái
– Hành vi
– Căn cước
– Ngữ nghĩa
3
Chương 4: Lớp và đối tượng
Lớp là gì?
. Là sự thực thi của các đối tượng có chung các thuộc
tính, hành vi, quan hệ, ngữ nghĩa.
. Lớp là một kiểu dữ liệu mới có cấu trúc, trong đó việc
truy nhập các biến thành viên được kiểm soát thông
qua các hàm thành viên.
. Các dữ liệu của lớp biến thành viên
. Các hàm của lớp hàm thành viên
. Một biến của một lớp một đối tượng
4
Chương 4: Lớp và đối tượng
4.2 Định nghĩa lớp
. Kiểu dữ liệu có cấu trúc
sruct Date{
//sử dụng
void main(){
int day, month, year;
Date d;
set_date(d,32,13,2010);
add_day(d,5);
};
void set_date(Date& date,int d, int m, int y){
date.day = d;
date.month = m;
date.year = y;
add_year(d,1);
d.month = 13;
}
}
void add_day(Date& date, int n){
date.day += n;
...
}
Truy nhập biến
thành viên từ
bên ngoài
void add_month(Date& date, int n) ){
date.month += n;
...
}
void add_year(Date& date, int n) ){
date.year += n;
}
5
Chương 4: Lớp và đối tượng
Các vấn đề với struct
. Truy nhập trực tiếp vào các biến thành viên của cấu
trúc không an toàn
. Khi có sự thay đổi tên của các biến thành viên
người sử dụng phải thay đổi lại mã chương trình ứng
dụng
– Ví dụ: thay đổi lại cấu trúc Date
sruct Date{
int d, m, y;
};
– Thì đoạn mã sau sẽ có lỗi không biên dịch
Date d;
d.month = 10;
6
Chương 4: Lớp và đối tượng
Lớp hóa
. Định nghĩa lớp Date
Tên lớp
class Date{
int day;
int month;
int year;
public:
Biến thành viên
Kiểm soát quyền
truy nhập
void set_date(int d, int m, int y){
day = d;
month = m;
year = y;
}
int get_day() { return day; }
int get_month() { return month; }
Hàm thành viên
int get_year() { return year; }
void add_year(int n) ){
year += n;
}
...
};
7
Chương 4: Lớp và đối tượng
. Sử dụng lớp Date
Đối tượng
void main(){
Date d;
d.set_date(1,1,2010);
d.add_year(10);
Có lỗi.
d.day = 10; //??
d.month = 10; //??
d.year = 2009;//??
int i = d.day;//??
int day = d.get_day();
int month = d.get_month();
int year = d.get_year();
}
day, month, year là
các biến thành viên
của Date thuộc kiểu
không được phép
truy nhập từ bên
ngoài (kiểu private)
8
Chương 4: Lớp và đối tượng
. Thay đổi tên biến thành viên của lớp
//Sử dụng
class Date{
void main{
int d;
int m;
int y;
Date d;
d.set_date(1,1,2010);
d.add_year(10);
public:
int day = d.get_day();
int month = d.get_month();
int year = d.get_year();
void set_date(int _d, int _m, int _y){
d = _d;
m = _m;
y = _y;
}
}
int get_day() { return d; }
int get_month() { return m; }
int get_year() { return y; }
void add_year(int n) ){
Có sự khác
biệt
year += n;
}
...
không?
};
9
Chương 4: Lớp và đối tượng
4.3 Biến thành viên
. Khai báo biến thành viên của lớp
class Date{
int day,month, year; //khai báo tưng tự như cấu trúc
...
};
. Mặc định các biến thành viên không truy nhập được từ bên
ngoài
Date d;
d.day = 10;;
//Lỗi, vì biến thành viên day của Date thuộc kiểu private
. Có thể cho phép biến thành viên truy nhập từ bên ngoài bằng
cách chuyển thành biến public. Tuy nhiên, ít khi sử dụng như
vậy vì không còn che giấu dữ liệu
class Date{
public:
int day,month, year; //truy nhập được từ bên ngoài
...
};
10
Chương 4: Lớp và đối tượng
. Truy nhập các biến thành viên thông qua các hàm
thành viên
class Date{
int day, month,year;
public:
Hàm thành viên
để truy nhập biến
thành viên
int get_day()
{
return day; }
void set_day(int d){ day = d;
}
};
. Khởi tạo biến thành viên thông qua hàm tạo
class Date{
int day, month,year;
public:
Date(int d, int m, int y){ //hàm tạo
day = d; month = m; year = y;
}
...
};
11
Chương 4: Lớp và đối tượng
4.4 Hàm thành viên
. Khai báo và định nghĩa hàm thành viên
class Date{
int day, month,year;
public:
Khai báo và
định nghĩa
int get_day()
{
return day; }
void set_day(int d);
. . .
Chỉ khai báo,
không định
nghĩa
};
void Date::set_day(int d){
day = d;
}
Định nghĩa bên
ngoài phần khai
báo lớp
. Để che giấu cách thực hiện, hàm thành viên thường được khai
báo trong tập tin đầu (*.h), phần định nghĩa được thực hiện
trong tệp tin nguồn (*.cpp). Khi đóng gói thành thư viện, người
sử dụng chỉ cần tệp tin thư viện (*.lib) và tệp tin đầu (*.h),
không cần tệp tin nguồn (*.cpp)
12
Chương 4: Lớp và đối tượng
. Khai báo hàm thành viên trong tệp tin đầu (*.h)
//tệp tin Date.h
class Date{
int day, month,year;
public:
int get_day();
void set_day(int d);
. . .
};
. Định hàm thành viên trong tệp tin nguồn (*.cpp)
//tệp tin Date.cpp
void Date::set_day(int d){
day = d;
}
void Date::get_day(){ return day;}
13
Chương 4: Lớp và đối tượng
Con trỏ đối tượng
. Sử dụng con trỏ đối tượng
void main{
Date d;
d.set_date(1,1,2010);
Date *pd = &d;
pd->set_date(1,1,2010);
//con trỏ pd trỏ vào đối tượng d
Date *pd1 = new Date; //cấp phát bộ nhớ, gọi hàm tạo
pd1->set_day(10);
. . .
delete pd1;
//hủy bộ nhớ
Date *pd2 = new Date[5];
for(int i = 0 ;i < 5; i++)
pd2[i].set_date(1,1,2010);
. . .
delete [] pd2;
}
14
Chương 4: Lớp và đối tượng
4.5 Kiểm soát truy nhập
. private: các thành viên chỉ có thể truy nhập từ các
thành viên của lớp và từ các bạn bè của lớp
. public: các thành viên công cộng, truy nhập được ở
mọi nơi
. protected: các thành viên không truy nhập được từ
bên ngoài, nhưng truy nhập được từ lớp dẫn xuất
Lớp dẫn xuất
class A{
protected:
class B: public A{
public:
int a;
void f();
void g(){
f();
Lớp cơ sở
};
}
};
15
Chương 4: Lớp và đối tượng
4.6 Bài tập
. Xây dựng một lớp tên person để đại diện cho một
người với các yêu cầu:
– Tên có độ dài tối đa 50 ký tự
– Ngày, tháng, năm sinh có kiểu int (hoặc thuộc kiểu Date như
đã gợi ý trong bài giảng).
– Quê quán có độ dài tối đa 100 ký tự
– Hàm nhập tên, ngày sinh, quê từ bán phím
– Hàm hiển thị thông tin ra màn hình
– Hàm lấy tên, hàm gán tên
– Hàm lấy quê quán, hàm gán quê quán
– Hàm lấy ngày sinh, hàm gan ngày sinh
– Viết chương trình chính minh họa cách sử dụng
16
Chương 4: Lớp và đối tượng
4.7 Hàm tạo và hàm hủy
. Vấn đề 1: Nghiên cứu đoạn mã sau
class Date{
int day, month,year;
public:
int get_day()
{
return day; }
void set_day(int d){ day = d;
}
};
Câu hỏi:
d.day = ?
d.month = ?
d.year = ?
void main(){
Date d;
int i = d.get_date();
}
. Làm thế nào để sau khi được tạo ra, đối tượng có
trạng thái ban đầu theo ý muốn của người sử dụng?
. Giải pháp: sử dụng hàm tạo
17
Chương 4: Lớp và đối tượng
4.7 Hàm tạo và hàm hủy (…)
. Vấn đề 2: đối tượng sử dụng bộ nhớ động
class Array{
int n;
int *data; //mảng chứa giá trị các phần tử
public:
...
//số phần tử của array
};
. Câu hỏi: làm thế nào để cấp phát bộ nhớ và hủy bộ
nhớ cho biến thành viên data một cách an toàn
. Giải pháp: sử dụng hàm tạo và hàm hủy.
18
Chương 4: Lớp và đối tượng
4.7 Hàm tạo và hàm hủy (…)
. Hàm tạo: luôn được gọi khi đối tượng được tạo ra
. Hàm hủy: luôn được gọi khi đối tượng bị hủy
. Cú pháp:
class A{
int a, b;
public:
A(){a = 0; b = 0;}
A(int _a){ a = _a;}
1
2
A(int _a, int _b){ a = _a; b = _b;}
~A();
3
};
. Một lớp có thể có nhiều hàm tạo
– Hàm tạo 1: hàm tạo không đối
– Hàm tạo 2: hàm tạo một đối
– Hàm tạo 3: hàm tạo hai đối
. Một lớp chỉ có duy nhất một hàm hủy
Chương 4: Lớp và đối tượng
19
. Sử dụng
void main{
A a();
//gọi hàm tạo (?)
A a1(10); //gọi hàm tạo (?)
A a2(1,2); //gọi hàm tạo (?)
//gọi hàm hủy cho ?
}
void f(A a){
gọi hàm tạo (?)
A b(0,0);
if(...){
A c;
...
}
gọi hàm tạo (?)
gọi hàm hủy cho ?
gọi hàm hủy cho ?
}
void main{
A *a = new A(10);
//gọi hàm tạo (?)
//gọi hàm hủy
. . . //sử dụng
delete a;
}
20
Chương 4: Lớp và đối tượng
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng môn Lập trình - Chương 4: Lớp và đối tượng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bai_giang_mon_lap_trinh_chuong_4_lop_va_doi_tuong.pdf

