5/12/2015
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í
/>
1
5/12/2015
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ụ:
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ương . 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
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
2
5/12/2015
Khai báo cấu trúc
Khai báo một cấu trúc
struct <tên kiểu>
{
các thành phần ;
} <danh sách biến>;
Ví dụ:
struct point {
int x;
int y;
}a,b,c;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
3
5/12/2015
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 (;).
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.
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
4
5/12/2015
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 <tên cấu trúc> <danh sách biến>
Khai báo như biến thông thường (trong C++)
<tên cấu trúc> <danh sách biến>;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
5
5/12/2015
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 toán tử gán
point pt1 = {10, 20}, pt2;
pt2 = pt1;
Ví dụ:
struct rect {
point p1,p2;
};
rect rect1={{1,2},{3,4}};
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
6
5/12/2015
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ụ:
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);
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
7
5/12/2015
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à
rect screen;
thì
screen.pt1.x
chỉ đến tọa độ x của thành phần pt1 của screen.
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
8
5/12/2015
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
Truyền đối số tới hàm
Trả giá trị từ hàm
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
9
5/12/2015
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
{
float thuc;
float ao;
};
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
10
5/12/2015
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;
}
void In(Sophuc x)
{
cout << "(" << x.thuc << "," << x.ao << ")" <<
endl ;
}
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
11
5/12/2015
Hàm và Cấu trúc
void main(){
Sophuc x, y;
cout << "x = " ; cin >> x.thuc >> x.ao ;
cout << "y = " ; cin >> y.thuc >> y.ao ;
cout << "x + y = " ; In(Cong(x,y)) ;}
Ví dụ hàm trả về con trỏ cấu trúc
Sophuc* Tru(Sophuc x, Sophuc y){
Sophuc* kq=new Sophuc;
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
12
5/12/2015
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 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.
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
13
5/12/2015
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:
= {,,,} hoặc ..={{,,},{,,}, }
Truy cập:
tenbang[i]
Ví dụ:
//mảng mười biến kiểu point
point a[10];
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
14
5/12/2015
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;
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;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
15
5/12/2015
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
thành phần cịn lại
Ví dụ:
union <tên kiểu> {
Danh sách các thành phần;
};
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
16
5/12/2015
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ụ:
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);
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
17
5/12/2015
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ó.
Cú pháp: typedef type tên;
Ví dụ:
typedef float deci;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
18
5/12/2015
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,
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
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
19
5/12/2015
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
đượ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ở)
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
20
5/12/2015
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ó
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
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
21
5/12/2015
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
Không phải ngôn ngữ hướng đối tượng nào cũng có tính
chất này.
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
22
5/12/2015
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)
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
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
23
5/12/2015
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;
...
}danh_sách_đối_tượng;
Ví dụ: class CRectangle {
int x, y;
public:
int area (void);} rect;
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
24
5/12/2015
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,...)
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
TRƯỜNG ĐẠI HỌC
BÁCH KHOA HÀ NỘI
25