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