Tài liệu Ngôn ngữ lập trình C và C++ - Bài 6: Cấu trúc và lớp - Đỗ Đăng Khoa: 5/12/2015
1
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Ngôn ngữ lập trình C và C++
Bài 6: Cấu trúc và Lớp
TS. Đỗ Đăng Khoa
Bộ môn Cơ học Ứng dụng
Viện Cơ khí
5/12/2015
2
Khái niệm về Cấu trúc (Struct)
Một tập hợp của một hoặc nhiều biến, có thể khác kiểu nhau,
được nhóm lại dưới một tên duy nhất cho tiện xử lý
Trong các ứng dụng về cơ sở dữ liệu, kiểu cấu trúc còn được
gọi là bản ghi
Việc định nghĩa cấu trúc sẽ tạo ra kiểu dữ liệu mới
Ví dụ:
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Hồ sơ nhân viên: mỗi nhân viên được mô tả bởi một tập các
thuộc tính như: tên, địa chỉ, số CMT, lươngM. Một trong số các
thuộc tính này lại có thể là một cấu trúc: tên có thể có vài thành
phần (họ, tên đệm, tên), địa chỉ và lương cũng có thể như vậy
Tài khoản ngân hàng: tên chủ tài khoản, tên tài khoản, số dư
tài khoản, loại tiền
5/12/2015
3
Khai báo cấu trúc
Khai báo một cấu trúc
struct
{
các thành phần ;
} ;
Ví dụ:
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
struct point {
int x;
int y;
...
63 trang |
Chia sẻ: putihuynh11 | Lượt xem: 661 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Ngôn ngữ lập trình C và C++ - Bài 6: Cấu trúc và lớp - Đỗ Đăng Khoa, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
5/12/2015
1
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
Ngơn ngữ lập trình C và C++
Bài 6: Cấu trúc và Lớp
TS. Đỗ Đăng Khoa
Bộ mơn Cơ học Ứng dụng
Viện Cơ khí
5/12/2015
2
Khái niệm về Cấu trúc (Struct)
Một tập hợp của một hoặc nhiều biến, cĩ thể khác kiểu nhau,
được nhĩm lại dưới một tên duy nhất cho tiện xử lý
Trong các ứng dụng về cơ sở dữ liệu, kiểu cấu trúc cịn được
gọi là bản ghi
Việc định nghĩa cấu trúc sẽ tạo ra kiểu dữ liệu mới
Ví dụ:
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Hồ sơ nhân viên: mỗi nhân viên được mơ tả bởi một tập các
thuộc tính như: tên, địa chỉ, số CMT, lươngM. Một trong số các
thuộc tính này lại cĩ thể là một cấu trúc: tên cĩ thể cĩ vài thành
phần (họ, tên đệm, tên), địa chỉ và lương cũng cĩ thể như vậy
Tài khoản ngân hàng: tên chủ tài khoản, tên tài khoản, số dư
tài khoản, loại tiền
5/12/2015
3
Khai báo cấu trúc
Khai báo một cấu trúc
struct
{
các thành phần ;
} ;
Ví dụ:
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
struct point {
int x;
int y;
}a,b,c;
5/12/2015
4
Khai báo cấu trúc
Mỗi thành phần giống như một biến riêng của kiểu, nĩ gồm
kiểu và tên thành phần. Một thành phần cũng cịn được gọi là
trường.
Phần tên của kiểu cấu trúc và phần danh sách biến cấu trúc cĩ
thể cĩ hoặc khơng. Tuy nhiên trong khai báo kí tự kết thúc cuối
cùng phải là dấu chấm phẩy (;).
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Các kiểu cấu trúc được phép khai báo lồng nhau, nghĩa là một
thành phần của kiểu cấu trúc cĩ thể lại là một trường cĩ kiểu cấu
trúc.
Một biến cĩ kiểu cấu trúc sẽ được phân bố bộ nhớ sao cho các
thực hiện của nĩ được sắp liên tục theo thứ tự xuất hiện trong
khai báo.
5/12/2015
5
Khai báo biến kiểu cấu trúc
Khai báo ngay sau dấu ngoặc }, danh sách các biến;
struct { ... } x, y, z;
Khai báo như biến thơng thường (trong C)
struct
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Khai báo như biến thơng thường (trong C++)
;
5/12/2015
6
Khởi tạo biến cấu trúc
Khởi tạo ngay định nghĩa của nĩ với danh sách các khởi tạo
cho các thành phần
point pt = {10, 20};
Sử dụng tốn tử gán
point pt1 = {10, 20}, pt2;
pt2 = pt1;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Ví dụ:
struct rect {
point p1,p2;
};
rect rect1={{1,2},{3,4}};
5/12/2015
7
Truy cập đến thành phần của cấu trúc
Biến khơng phải con trỏ
tên_cấu_ trúc.thành_phần
Biến con trỏ:
tên_cấu_ trúc->thành_phần,
(*tên_cấu_trúc).thành_phần
Ví dụ:
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
In tọa độ điểm pt:
printf("%d,%d", pt.x, pt.y);
//Tính khoảng cách từ pt đến tọa độ:
Double dist = sqrt((double)pt.x * pt.x +
(double)pt.y * pt.y);
5/12/2015
8
Cấu trúc lồng nhau
Hình chữ nhật là một cặp điểm xác định hai gĩc đối diện.
struct rect {
point pt1;
point pt2;
};
Nếu khai báo screen là
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
rect screen;
thì
screen.pt1.x
chỉ đến tọa độ x của thành phần pt1 của screen.
5/12/2015
9
Hàm và Cấu trúc
Các thao tác hợp lệ duy nhất với một cấu trúc là
Sao chép nĩ hoặc gán cho nĩ,
Lấy địa chỉ qua &,
Truy xuất các thành phần của nĩ.
Việc sao chép và gán bao gồm
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Truyền đối số tới hàm
Trả giá trị từ hàm
5/12/2015
10
Hàm và Cấu trúc
Hàm trả về một cấu trúc
là một biến cấu trúc.
là một con trỏ cấu trúc.
là một tham chiếu cấu trúc.
Ví dụ hàm trả về biến cấu trúc
struct Sophuc// Khai báo kiểu số phức dùng chung
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
{
float thuc;
float ao;
};
5/12/2015
11
Hàm và Cấu trúc
Sophuc Cong(Sophuc x, Sophuc y)
{
Sophuc kq;
kq.thuc = x.thuc + y.thuc ;
kq.ao = x.ao + y.ao ;
return kq;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
}
void In(Sophuc x)
{
cout << "(" << x.thuc << "," << x.ao << ")" <<
endl ;
}
5/12/2015
12
Hàm và Cấu trúc
void main(){
Sophuc x, y;
cout > x.thuc >> x.ao ;
cout > y.thuc >> y.ao ;
cout << "x + y = " ; In(Cong(x,y)) ;}
Ví dụ hàm trả về con trỏ cấu trúc
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Sophuc* Tru(Sophuc x, Sophuc y){
Sophuc* kq=new Sophuc;
kq->thuc = x.thuc + y.thuc ;
kq->ao = x.ao + y.ao ;
return kq;
}
5/12/2015
13
Hàm và Cấu trúc
Hàm cĩ đối số là cấu trúc
Là một biến cấu trúc
Là một con trỏ cấu trúc
Là một tham chiếu cấu trúc
Là một mảng cấu trúc hình thức hoặc con trỏ mảng
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Trường hợp cấu trúc lớn, sử dụng con trỏ và tham chiếu sẽ hiệu
quả hơn việc phải sao chép cả cấu trúc.
Con trỏ cấu trúc tương tương tự như con trỏ tới các biến thơng
thường.
5/12/2015
14
Bảng (Mảng) Cấu trúc
Khai báo:
struct_name {} tenbang[kích_thước];
struct_name tenbang[kích_thước];
Khởi tạo:
M = {,,,} hoặc ..={{,,},{,,},M}
Truy cập:
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
tenbang[i]
Ví dụ:
//mảng mười biến kiểu point
point a[10];
5/12/2015
15
Con trỏ Cấu trúc
Khai báo:
struct_name * ten_con_tro;
Khởi gán thơng qua phép lấy địa chỉ &
Ví dụ:
point p1={1,2}, *p2;
p2=&p1;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Cấp phát động và thu hồi bộ nhớ cũng thơng qua:
new và delete
Ví dụ:
point *p1=new point; delete p1;
int n=10;
point *p2=new point[n]; delete []p2;
5/12/2015
16
Kiểu Hợp
Kiểu hợp cũng cĩ nhiều thành phần giống kiểu cấu trúc
Tuy nhiên, các thành phần của chúng sử dụng chung nhau một
vùng nhớ
Kích thước của một kiểu hợp là độ dài của trường lớn nhất và
việc
Thay đổi giá trị một thành phần sẽ ảnh hưởng đến tất cả các
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
thành phần cịn lại
Ví dụ:
union {
Danh sách các thành phần;
};
5/12/2015
17
Truy cập đến thành phần của hợp
Biến khơng phải con trỏ
tên_cấu_ trúc.thành_phần
Biến con trỏ:
tên_cấu_ trúc->thành_phần,
(*tên_cấu_trúc).thành_phần
Ví dụ:
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
union foo { int x; int y; };
foo f; f.x = 10;
/* cũng mang giá trị 10 vì dùng chung bộ nhớ với
f.x */
printf("%d\n", f.y);
5/12/2015
18
Từ Khĩa typedef
Một kiểu dữ liệu cĩ thể được định nghĩa bằng cách sử
dụng từ khĩa typedef
Nĩ khơng tạo ra một kiểu dữ liệu mới, mà định nghĩa
một tên mới cho một kiểu đã cĩ.
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Cú pháp: typedef type tên;
Ví dụ: typedef float deci;
5/12/2015
19
Lập trình hướng đối tượng
Đối tượng: là một đơn vị đầy đủ được kết hợp bởi các
dữ liệu và chỉ thị
Đối tượng được chia thành hai thành phần: các
phương thức (hàm) và các thuộc tính (biến)
Phương thức: là phương tiện để sử dụng đối tượng,
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
trong khi các thuộc tính sẽ mơ tả đối tượng cĩ tính chất
gì
Đối tượng được trừu tượng hĩa qua việc định nghĩa
của các lớp
5/12/2015
20
Các đặc tính của lập trình hướng đối tượng
Tính trừu tượng (abstraction):
Bỏ qua một số khía cạnh thơng tin, chỉ tập trung vào những
cốt lõi cần thiết
Mỗi đối tượng cĩ thể hồn tất các cơng việc một cách nội
bộ, báo cáo, thay đổi trạng thái của nĩ và liên lạc với các đối
tượng khác, khơng cần cho biết làm cách nào tiến hành
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
được các thao tác (trừu tượng dự liệu)
Tính trừu tượng cịn thể hiện qua việc một đối tượng ban
đầu cĩ thể cĩ một số đặc điểm chung cho nhiều đối tượng
khác như là sự mở rộng của nĩ nhưng bản thân đối tượng
này cĩ thể khơng cĩ các biện pháp thi hành (lớp trừu tượng
hay lớp cơ sở)
5/12/2015
21
Các đặc tính của lập trình hướng đối tượng
Tính đĩng gĩi (encapsulation) và che giấu thơng tin
(information hiding):
Tính chất này khơng cho phép người sử dụng các đối tượng
thay đổi trạng thái nội tại của một đối tượng
Chỉ cĩ các phương thức nội tại của đối tượng cho phép thay
đổi trạng thái của nĩ
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Tính đa hình (polymorphism):
Thơng qua việc gửi các thơng điệp (message)
Các phương thức dùng trả lời cho một thơng điệp sẽ tùy theo
đối tượng mà thơng điệp đĩ được gửi tới sẽ cĩ phản ứng
khác nhau
5/12/2015
22
Các đặc tính của lập trình hướng đối tượng
Tính kế thừa (inheritance):
Cho phép một đối tượng cĩ thể cĩ sẵn các đặc tính mà đối
tượng khác đã cĩ thơng qua kế thừa
Cho phép các đối tượng chia sẻ hay mở rộng các đặc tính
sẵn cĩ mà khơng phải tiến hành định nghĩa lại
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Khơng phải ngơn ngữ hướng đối tượng nào cũng cĩ tính
chất này.
5/12/2015
23
Khái niệm về lớp (Class)
Một lớp bao gồm các hàm và dữ liệu cĩ liên quan
Các hàm này là các hàm thành phần (member
function) hay cịn là phương thức (method)
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Giống như cấu trúc, lớp cĩ thể xem như một kiểu dữ
liệu
Từ một lớp cĩ thể tạo ra (bằng cách khai báo) nhiều
đối tượng (biến, mảng) khác nhau. Mỗi đối tượng cĩ
vùng nhớ riêng của mình
5/12/2015
24
Khai báo lớp (Class)
Cú pháp:
class tên_lớp {
đặc_tả_truy_cập_1:
member1;
đặc_tả_truy_cập_2:
member2;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
...
}danh_sách_đối_tượng;
Ví dụ: class CRectangle {
int x, y;
public:
int area (void);} rect;
5/12/2015
25
Khai báo lớp (Class)
Việc khai báo một lớp khơng chiếm giữ bộ nhớ, chỉ các
đối tượng của lớp mới thực sự chiếm giữ bộ nhớ.
Thuộc tính của lớp cĩ thể là các biến, mảng, con trỏ cĩ
kiểu chuẩn (int, float, char, char*, long,...)
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Thuộc tính của lớp cĩ thể là kiểu ngồi chuẩn đã định
nghĩa trước (struct, union, class,...)
Thuộc tính của lớp khơng thể cĩ kiểu của chính lớp đĩ,
nhưng cĩ thể là con trỏ của lớp này
5/12/2015
26
Khai báo lớp (Class)- Các đặc tả truy cập
Các đặc tả truy cập này thay đổi các quyền truy cập
mà các thành phần khai báo sau chúng cĩ được:
private: chỉ cĩ thể truy cập từ bên trong thành phần
cùng lớp đĩ (trong thân các phương thức của lớp)
hoặc từ các thành phần bạn (friend) của nĩ.
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
protected: như private, ngồi ra cịn từ các thành
phần của các lớp dẫn xuất (lớp con) của lớp đĩ.
public: cĩ thể truy cập từ mọi nơi mà đối tượng hiển
thị.
Mặc định của class là quyền truy cập private đối với
tất cả thành phần của nĩ
5/12/2015
27
Khai báo lớp (Class)- Các đặc tả truy cập
Nếu các thành phần dữ liệu đã khai báo là private thì
các hàm thành phần phải cĩ ít nhất một vài hàm được
khai báo dạng public để cĩ thể truy cập được, nếu khơng
tồn bộ lớp sẽ bị đĩng kín và điều này khơng giúp gì cho
chương trình
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Cách khai báo lớp tương đối phổ biến là các thành
phần dữ liệu được ở dạng private và hàm thành phần
dưới dạng public
5/12/2015
28
Khai báo lớp (Class)- Dữ liệu thành phần
Khai báo như khai báo các thành phần trong kiểu cấu
trúc hay hợp
Bình thường được khai báo là private để bảo đảm tính
giấu kín, bảo vệ an tồn dữ liệu của lớp khơng cho phép
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
các hàm bên ngồi xâm nhập vào các dữ liệu này.
Khơng được khai báo là auto, register hoặc extern
Kiểu: enum, kiểu dữ liệu cĩ sẵn (chuẩn) hoặc người
dùng định nghĩa (struct, union, class)
5/12/2015
29
Khai báo lớp (Class)- Hàm thành phần
Hàm thành phần dùng để truy cập cĩ kiểm sốt vào thành
phần dữ liệu của lớp
Thường khai báo là public để chúng cĩ thể được gọi tới
(sử dụng) từ các hàm khác trong chương trình
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Hàm khai báo là private chỉ cĩ thể được gọi bởi các hàm
public khác trong lớp
Bản mẫu hàm: được khai báo bên trong phần thân lớp.
5/12/2015
30
Định nghĩa lớp (Class)- Hàm thành phần
Định nghĩa hàm: cĩ thể được triển khai luơn trong thân lớp
hoặc bên ngồi lớp cùng tốn tử phạm vi ::
(kiểu_trả_về tên_lớp::tên_hàm())
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Hàm được định nghĩa bên trong lớp sẽ được tự động coi
là hàm thành phần inline bởi trình biên dịch
Hàm thành phần được phép truy xuất tới các dữ liệu thành
phần, kể cả dữ liệu kiểu private
5/12/2015
31
Định nghĩa lớp (Class)- Hàm thành phần
Ví dụ:
#include
#include
class point{
private:
int x, y, m ;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
public:
void inputdata() ;
void displaypoint() ; //Hiện một điểm
//Ẩn một điểm, hàm định nghĩa trong khai báo
void hidepoint() { putpixel(x, y,getbkcolor());
} };
5/12/2015
32
Định nghĩa lớp (Class)- Hàm thành phần
void point::inputdata(){
cout <<"\n Nhap hoanh do va tung do cua
diem:”;
cin >> x >> y ;
cout << “\n Nhap ma mau cua diem: “;
cin >> m ; }
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
void point::displaypoint(){
int mau_ht ;
mau_ht = getcolor();
putpixel(x, y, m);
setcolor(mau_ht); }
5/12/2015
33
Phạm vi lớp
Ngồi hai phạm vi tồn cục và cục bộ, C++ đưa ra khái
niệm về phạm vi lớp
Mọi thành phần của lớp được gọi là trong phạm vi của
lớp đĩ
Mọi thành phần của lớp đều cĩ thể tham khảo tới bất kì
thành phần nào khác của cùng lớp
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Các hàm thành phần của lớp cĩ quyền truy cập khơng
hạn chế vào thành phần dữ liệu của lớp đĩ
Việc truy cập vào các thành phần dữ liệu và hàm từ
ngồi phạm vi lớp do người lập trình kiểm sốt
5/12/2015
34
Đối tượng, Mảng và con trỏ đối tượng của
lớp
Một đối tượng (object) là một thể nghiệm của lớp Lớp
là một định nghĩa của đối tượng.
Chú ý: Lớp là một kiểu dữ liệu, đối tượng của lớp này chỉ
là một biến.
Ví dụ:
point a;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Cách khai báo mảng đối tượng, con trỏ đối tượng cũng
giống như khai báo biến, mảng các kiểu khác (như int,
float, struct, union,...)
Ví dụ:
point b[10], *c;
c= new point;
5/12/2015
35
Truy xuất thuộc tính của đối tượng
Mỗi thuộc tính đều thuộc về một đối tượng, khơng thể viết tên
thuộc tính một cách riêng rẽ mà bao giờ cũng phải cĩ tên đối
tượng đi kèm
Truy xuất thuộc tính của đối tượng bằng tốn tử chấm .
tên_đối_tượng.Tên_thuộc_tính
con_trỏ_đối_tượng->Tên_thuộc_tính
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Ví dụ:
point a,*b;
a.x;// chỉ dùng được trong hàm thành phần
b=&a; b->y; // chỉ dùng được trong hàm thành phần
Chỉ cĩ thể truy xuất thuộc tính private của đối tượng bằng các
hàm thành phần
5/12/2015
36
Sử dụng hàm thành phần của đối tượng
Cũng giống như hàm thơng thường, hàm thành phần được
sử dụng thơng qua lời gọi.
Tuy nhiên trong lời gọi hàm thành phần bao giờ cũng phải cĩ
tên đối tượng để chỉ rõ hàm thực hiện trên các thuộc tính của
đối tượng nào.
Ví dụ:
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
void main(){
point a;
a.inputdata();
}
5/12/2015
37
Đối của hàm thành phần, con trỏ this
Con trỏ this là con trỏ tới chính đối tượng của nĩ
Con trỏ this là đối thứ nhất của hàm thành phần
Các thuộc tính viết trong hàm inputdata() gọi bởi một đối
tượng được hiểu là thuộc chính đối tượng đĩ do con trỏ this trỏ
tới
Cách viết tường minh lại hàm inputdata()
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
void point::inputdata(){
cout <<"\n Nhap hoanh do va tung do cua diem:”;
cin >> this->x >>this-> y ;
cout << “\n Nhap ma mau cua diem: “;
cin >> this->m ;
}
5/12/2015
38
Đối của hàm thành phần, con trỏ this
Tham số truyền cho đối con trỏ this chính là địa chỉ của đối
tượng đi kèm với phương thức trong lời gọi phương thức
Ví dụ:
point a;
a.inputdata()
Trong trường hợp này tham số truyền cho con trỏ this chính
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
là địa chỉ của a:
this = &a
Con trỏ this cịn được dùng trong các hàm thành phần cần trả
lại chính đối tượng cĩ phương thức đang triển khai.
5/12/2015
39
Đối tượng hằng và các hàm thành phần hằng
Đối tượng hằng là đối tượng được khai báo với từ khố cons
Mọi ý định sửa đổi các đối tượng hằng đều bị chương trình
báo lỗi khi biên dịch
Các hàm thành phần "khơng sủa đổi dữ liệu của lớp", tức là
các hàm thành phần hằng và là các hàm được khai báo với từ
khố const, mới được phép thực hiện trên các đối tượng hằng
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Khi viết các hàm thành phần của lớp, cần xác định ngay hàm
nào cần sửa hàm nào khơng cần sửa đổi dữ liệu của lớp và đặt
thêm từ khố const tương ứng trong khai báo và định nghĩa
hàm.
5/12/2015
40
Đối tượng hằng và các hàm thành phần hằng
Ví dụ:
class Matrix{
int row,col;
double data[100][100];
public:
void Transpose();
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
double Det() const; // hàm thành phần hằng
};
int main(){
Matrix const m; m.Transpose(); // error
// OK vì Det() là hàm thành phần hằng
double d = m.Det(); }
5/12/2015
41
Định nghĩa lớp- Hàm dựng (tạo)/ Cấu tử
Các đối tượng cần được khởi tạo dữ liệu thành phần hoặc
gán bộ nhớ động trong quá trình sinh ra để tránh việc trả lại các
giá trị khơng mong muốn trong quá trình thao tác chúng
Hàm dựng cũng là một hàm thành phần của lớp (nhưng là
hàm đặc biệt) được tự động gọi bất cứ khi nào một đối tượng
mới của lớp này được tạo ra
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Chương trình dịch sẽ cấp phát bộ nhớ cho đối tượng sau đĩ
sẽ gọi đến hàm dựng
Hàm dựng sẽ khởi gán giá trị cho các thuộc tính của đối
tượng và cĩ thể thực hiện một số cơng việc khác nhằm chuẩn
bị cho đối tượng mới.
5/12/2015
42
Định nghĩa lớp- Hàm dựng (tạo)/ Cấu tử
Hàm dựng phải cĩ tên giống tên lớp, khơng cĩ giá trị trả về
(kể cả void).
Nếu khơng định nghĩa hàm dựng của một lớp, trình biên dịch
sẽ sinh ra hàm dựng ngầm định.
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Hàm dựng ngầm định khơng cĩ đối và chỉ đơn thuần đặt
khơng vào mọi byte của biến thể nghiệm của một đối tượng
Một lớp cĩ thể cĩ nhiều hơn một hàm dựng (cùng tên, khác
bộ đối số)
5/12/2015
43
Định nghĩa lớp- Hàm dựng (tạo)/ Cấu tử
class point
{
private:
int x,y,m;
public:
point()// hàm dựng khơng đối
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
{x=0; y=0; m=1;}
//hàm dựng cĩ đối
point(int x1, int y1, int m1);
};
5/12/2015
44
Định nghĩa lớp- Hàm dựng (tạo)/ Cấu tử
point :: point(int x1, int y1, int m1)
{x = x1; y = y1; m = m1; }
Ví dụ:
point a; // Gọi tới hàm dựng khơng đối.
// Kết quả a.x = 0, a.y = 0, a.m = 1
point b(300, 100, 5);// Gọi tới hàm dựng cĩ đối.
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
// Kết quả b.x = 300, b.y = 100, b.m = 5
point c[5] ;// Gọi tới hàm dựng khơng đối 5 lần
Các hàm cĩ đối kiểu lớp, thì đối chỉ xem là các tham số hình
thức, vì vậy khai báo đối (trong dịng đầu của hàm) sẽ khơng
tạo ra đối tượng mới và do đĩ khơng gọi tới các hàm dựng
5/12/2015
45
Định nghĩa lớp- Hàm dựng sao chép
Một hàm dựng tạo ra đối tượng mới từ đối tượng đã cĩ được
gọi là hàm dựng sao chép.
Hàm dựng sao chép chỉ cĩ một đối: tham khảo tới một đối
tượng thuộc cùng lớp
Ví dụ:
point::point(const point& source)
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
{
x= source.x;
y= source.y;
m= source.m;
}
5/12/2015
46
Định nghĩa lớp- Hàm dựng sao chép
Nếu khơng được định nghĩa, trình biên dịch sẽ tạo ra cấu tử
sao chép ngầm định. Cấu tử này sao đối tượng nguồn theo từng
bit sang đối tượng mới.
Hàm dựng sao chép trong ví dụ trên khơng khác gì hàm dựng
sao chép mặc định.
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Khi lớp cĩ các thuộc tính con trỏ hoặc tham chiếu, thì hàm
dựng sao chép mặc định chưa đáp ứng được yêu cầu (ví dụ sao
chép mặc định hai con trỏ của 2 đối tượng thì hai đối tượng
dùng chung bộ nhớ con trỏ-> hai đối tượng khơng độc lập).
5/12/2015
47
Định nghĩa lớp- Tốn tử gán =
Nếu khơng định nghĩa tốn tử này, trình biên dịch sẽ sinh ra
tốn tử gán mặc định.
Tốn tử mặc định này sẽ sao chép từng bit từ nơi nguồn sang
nơi nhận.
Hàm dựng sao chép tạo ra đối tượng mới trong khi tốn tử
gán chỉ thay đổi giá trị của đối tượng hiện cĩ.
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
point& point::operator=(const point& source){
if (this != &source)
{
x= source.x; y = source.y; m=source.m;
}
}
5/12/2015
48
Định nghĩa lớp- Hàm hủy/ Hủy tử
Hàm hủy thực hiện chức năng ngược lại với hàm dựng
Tự động gọi khi đối tượng bị hủy, hoặc do kết thúc phạm vi tồn
tại của nĩ hoặc do được cấp phát động và được giải phĩng bằng
delete
Hủy tử phải cĩ tên giống tên lớp, nhưng cĩ thêm dấu ~ phía
trước, khơng cĩ đối số và khơng cĩ kiểu trả về (kể cả void).
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
point ::~ point()
{
}
Nếu khơng định nghĩa hàm hủy, thì một hàm hủy mặc định
khơng làm gì cả được phát sinh. Đối với nhiều lớp thì hàm hủy
mặc định là đủ, và khơng cần đưa vào một hàm hủy mới
5/12/2015
49
Các lớp được định nghĩa với struct và union
Các lớp cĩ thể định nghĩa bằng các từ khĩa struct và union.
Chỉ cĩ một sự khác nhau là các thành phần của lớp được khai
báo với struct và union cĩ quyền truy cập mặc định là public.
Với union, nĩ chỉ chứa một thành phần dữ liệu tại một thời
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
điểm.
5/12/2015
50
Quá tải/ Nạp chồng/ Định nghĩa lại các tốn tử
Cú pháp:
type operator sign (parameters) { /*...*/ }
Ví dụ:
point operator=(point a);
point operator + (point a);
point operator - (point a);
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
5/12/2015
51
Quá tải/ Nạp chồng/ Định nghĩa lại các tốn tử
Khi nạp chồng tốn tử cần chú ý xem tốn tử là một ngơi
(unary) hay hai ngơi (binary).
Tốn tử một ngơi thì danh sách rỗng
Tốn tử hai ngơi thì danh sách cĩ một tham số
Tốn tử () cĩ thể cĩ số tham số tuỳ ý
Những tốn tử sau khơng thể nạp chồng
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
5/12/2015
52
Một số điểm lưu ý về lớp
Hàm dựng và hàm hủy đặc biệt quan trọng với những
lớp cĩ thành phần dữ liệu con trỏ sử dụng cấp phát bộ
nhớ động và mảng bởi đây là các thành phần khơng
được khởi tạo, sao chép hay giải toả tự động đúng.
Để chúng cĩ thể hoạt động được, tối thiểu phải triển
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
khai:
Hàm dựng mặc định
Hàm dựng sao chép
Hàm hủy
Ngồi ra để dễ sử dụng, nên triển khai tốn tử gán
(operator = ()).
5/12/2015
53
Ví dụ về lớp véc tơ
class Vector
{
private:
double * m_pData;
int m_nSize;
public:
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Vector();
Vector(int n);
Vector(const double& val, int n);
Vector& operator=(const Vector& va);
~Vector();
5/12/2015
54
Ví dụ về lớp véc tơ
double& operator[](int n);
Vector operator+(const Vector& x);
Vector operator-(const double& x);
};
Vector::Vector()
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
{
m_nSize = 0;
m_pData = 0; // Giong nhu m_pData = NULL;
}
5/12/2015
55
Ví dụ về lớp véc tơ
Vector::Vector(int n){
m_nSize = n;
m_pData = new double[m_nSize];
for (int i = 0; i < m_nSize; i++)
m_pData[i] = 0.0;
}
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Vector::Vector(const double& val, int n){
m_nSize = n;
m_pData = new double[m_nSize];
for (int i = 0; i < m_nSize; i++)
m_pData[i] = val;
}
5/12/2015
56
Ví dụ về lớp véc tơ
Vector::~Vector(){
delete [] m_pData; // Chú ý dẫu []
}
Vector& Vector::operator=(const Vector& va)
{
delete [] m_pData;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
this->m_nSize = va.m_nSize;
this->m_pData = new double [m_nSize];
for (int i = 0; i < m_nSize; i++)
this->m_pData[i] = va.m_pData[i];
return *this;
}
5/12/2015
57
Ví dụ về lớp véc tơ
double& Vector::operator[](int i)
{
return m_pData[i];
}
Vector Vector::operator+(const Vector& x)
{
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
Vector t(this->m_nSize);
for (int i = 0; i < m_nSize; i++)
t.m_pData[i] = this->m_pData[i]+x.m_pData[i];
return t;
}
5/12/2015
58
Ví dụ về lớp véc tơ
Vector Vector::operator-(const double& x){
Vector t(this->m_nSize);
for (int i = 0; i < m_nSize; i++)
t.m_pData[i] = this->m_pData[i]-x;
return t;
}
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
int main(){
Vector v; // Constructor mặc định được gọi
// Constructor với 2 tham số được gọi
Vector u(1.0, 2);
Vector x(u); // Constructor sao chép (copy)
v=x+u;// tốn tử cộng và gán được gọi }
5/12/2015
59
Thành phần tĩnh (static)
Một lớp cĩ thể chứa các thành phần tĩnh, hoặc dữ liệu hoặc
hàm
Thành phần dữ liệu tĩnh: chỉ cĩ một giá trị duy nhất cho mọi đối
tượng của lớp đĩ và tồn tại ngay cả khi khơng cĩ đối tượng nào
của lớp đĩ.
Hàm thành phần tĩnh: dùng để truy xuất các biến tĩnh được
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
xác định là private
Hàm thành phần tĩnh khơng gắn với một đối tượng nào cụ thể
của lớp, cĩ thể gọi trực tiếp bằng tên lớp với tốn tử ::
5/12/2015
60
Thành phần tĩnh (static)
#include
using namespace std;
class CDummy {
private:
static int m;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
public:
static int n;
CDummy () { n++; m++ };
~CDummy () { n--; m--};
static int getnumcount(){return m;}
};
5/12/2015
61
Thành phần tĩnh (static)
int CDummy::n=0;
int CDummy::m=0;
int main () {
CDummy a;
CDummy b[5];
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
CDummy * c = new CDummy;
cout << a.n << endl;
//Gọi a.m là sai, gọi Cdummy::getnumcount();
delete c;
cout << CDummy::n << endl;
return 0;}
5/12/2015
62
Hàm bạn hữu (friend)
Ngồi quy tắc trao quyền truy cập thơng qua các từ khố truy
cập, C++ cịn cho phép trao quyền truy cập các thành phần của
một lớp cho một số hàm hay lớp khác, tạo thuận lợi cho việc
triển khai và sử dụng chúng.
Các hàm bạn là các hàm khơng phải là thành phần của lớp,
được khai báo với từ khố friend và cĩ quyền truy cập đến cả
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
các thành phần private và protected của lớp.
Một lớp bạn B của lớp A là lớp cĩ tên được liệt kê trong phần
khai báo của lớp A với từ khố friend và các hàm thành phần
của B cĩ quyền truy cập đến các thành phần private và
protected của lớp A.
5/12/2015
63
Hàm bạn hữu (friend)
class Matrix{
public:
Matrix AddTo(Matrix const & m);
friend Matrix Add(Matrix const & m1, Matrix const &
m2);
friend Matrix operator + (Matrix const & m1, Matrix
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
const & m2);
};
Matrix m1, m2, m3, m4;
m3 = m1.AddTo(m2); // gọi hàm thành phần Addto()
m4 = Add(m1, m2); // Gọi hàm bạn hữu Add()
m4 = m1 + m2; // Gọi hàm bạn hữu là tốn tử cộng
Các file đính kèm theo tài liệu này:
- ngon_ngu_lap_trinh_c_va_c_bai_6_cau_truc_va_lop_8877_1993522.pdf