• Class là cơ sở của C++ cho lập trình hướng đối
tượng.
• Class là đơn vị đóng gói cơ bản, nó cung cấp
cơ chế để tạo đối tượng.
• Class định nghĩa một kiểu dữ liệu mới đặc tả một
đối tượng. Class bao gồm data và code thực
thi data đó, vì vậy class liên kết data với code.
29 trang |
Chia sẻ: lylyngoc | Lượt xem: 1708 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài 11 Giới thiệu về lớp (class ), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bài 11
Giới thiệu về lớp (class )
Ngôn ngữ C++ 1
Căn bản về class
• Class là cơ sở của C++ cho lập trình hướng đối
tượng.
• Class là đơn vị đóng gói cơ bản, nó cung cấp
cơ chế để tạo đối tượng.
• Class định nghĩa một kiểu dữ liệu mới đặc tảmột
đối tượng. Class bao gồm data và code thực
thi data đó, vì vậy class liên kết data với code.
• Đối tượng là một hiện hữu của class.
• Class là khái niệm trừu tượng mang tính luận lý
còn đối tượng là biểu diễn vật lý của class.
Ngôn ngữ C++ 2
• Data được chứa trong các biến còn code được
chưa trong các hàm.
• Các hàm và biến trong class được gọi là thành viên
của class, do đó một biến được khai báo trong
class được gọi là biến thành viên, tương tự hàm
được gọi là hàm thành viên.
• Đôi khi cũng dùng khái niệm biến hiện hữu
Ngôn ngữ C++ 3
Dạng tổng quát của class
class tên {
private biến và hàm
public:
biến và hàm
} danh sách các đối tượng;
Ngôn ngữ C++ 4
Ví dụ 1
Ngôn ngữ C++ 5
Ví dụ 2
class queue {
int q[100];
int sloc, rloc;
public:
void init();
void qput(int i);
int qget();
};
Ngôn ngữ C++ 6
• Một class có thể chứa thành viên private (riêng)
hay public (phổ biến). Mặc định là private, có nghĩa
là chỉ được truy xuất bởi các thành viên khác của
class.
• Để cho phép truy xuất từ phần khác của chương
trình thì định nghĩa thành viên sau từ khóa public.
Như vậy phần khác của chương trình truy xuất biến
riêng củc class thông qua các hàm public.
Ngôn ngữ C++ 7
Tạo đối tượng
• Khi đã định nghĩa class, có thể tạo đối tượng bằng
cách dùng tên của class làm kiểu.
ví dụ:
queue Q1,Q2;
• Khi một đối tượng được tạo ra nó sẽ sở hữu riêng
các bản sao biến và hàm thành viên.
Ngôn ngữ C++ 8
Truy xuất
• Để truy xuất thành viên public của class thông qua
một đối tượng dùng dấu chấm như cách dùng trên
kiểu cấu trúc.
• ví dụ
cout << Q1.sloc;
Ngôn ngữ C++ 9
Thực hiện một hàm thành viên
• Dùng dấu :: để thông báo hàm của class
tên class :: tên hàm thành viên(){code}
ví dụ:
void queue::qput(int i)
{
if(sloc==100) {
cout << "Queue is full.\n";
return;
}
sloc++;
q[sloc] = i;
}
Ngôn ngữ C++ 10
• Khi một hàm thành viên gọi một hàm thành viên khác của lớp nó
có thể gọi trực tiếp, không có đối tượng hay dấu chấm.
• Khi code nằm ngoài class thì phải tham chiếu biến thông qua đối
tượng và dấu chấm.
Ngôn ngữ C++ 11
void queue::init()
{rloc = sloc = 0;
}
void queue::qput(int i)
{
if(sloc==100) {
cout << "Queue is full.\n";
return;
}
sloc++;
q[sloc] = i;
}
Ngôn ngữ C++ 12
// Lấy số từ queue.
int queue::qget()
{
if(rloc == sloc) {
cout << "Queue underflow.\n";
return 0;
}
rloc++;
return q[rloc];
}
int main()
{
queue a, b;
a.init();
b.init();
a.qput(10);
b.qput(19);
a.qput(20);
b.qput(1);
Ngôn ngữ C++ 13
cout << "Contents of queue a: ";
cout << a.qget() << " ";
cout << a.qget() << "\n";
cout << "Contents of queue b: ";
cout << b.qget() << " ";
cout << b.qget() << "\n";
return 0;
}
Constructor
• C++ cho phép các đối tượng tự khởi động khi được
tạo ra. Quá trình khởi động được thực hiện thông
qua một constructor.
• Constructor là một hàm đặc biệt là thành viên của
class và có tên giống như class. Vì thế constructor
thường được gọi là hàm tạo.
• Hàm tạo không trà về giá trị
Ngôn ngữ C++ 14
class queue {
int q[100];
int sloc, rloc;
public:
queue(); // constructor
void qput(int i);
int qget();
};
Ngôn ngữ C++ 15
queue::queue()
{
sloc = rloc = 0;
cout << "Queue Initialized.\n";
}
Destructor
• Trong một vài trường hợp, một đối tượng cần thực
hiện một số các hoạt động trước khi bị hủy.
• Hủy các đối tượng cục bộ và toàn cục.
• Hàm hủy có tác dụng giải phóng vùng nhớ đã cấp
cho đối tượng trước đó
• Hàm hủy có cùng tên với class nhưng có dấu ~
đứng trước.
• Hàm hủy cũng không có giá trị trả về
Ngôn ngữ C++ 16
class queue {
int q[100];
int sloc, rloc;
public:
queue(); // constructor
~queue(); // destructor
void qput(int i);
int qget();
};
Ngôn ngữ C++ 17
queue::queue()
{
sloc = rloc = 0;
cout << "Queue initialized.\n";
}
queue::~queue()
{
cout << "Queue destroyed.\n";
}
Hàm tạo có tham số
• Hàm tạo có thể chứa tham số để gán giá trị cho biến
thành viên mỗi khi đối tượng được tạo ra.
Ngôn ngữ C++ 18
class queue {
int q[100];
int sloc,rloc;
int who;
public:
queue(int id);
~queue();
void qput(int id);
int qget();
};
Ngôn ngữ C++ 19
queue::queue(int id)
{
sloc = rloc = 0;
who = id;
cout << "Queue " << who << " initialized.\n";
}
• Để truyền tham số vào hàm tạo, liên kết tham số với
đối tượng khi khai báo
queue a = queue(102);
• Cách khác
queue a(102); đây là cách phổ biến nhất
Ngôn ngữ C++ 20
#include
using namespace std;
class widget {
int i;
int j;
public:
widget(int a, int b);
void put_widget();
} ;
// truyền 2 arguments cho
widget().
widget::widget(int a, int b)
{
i = a;
j = b;
}
Ngôn ngữ C++ 21
void widget::put_widget()
{
cout << i << " " << j << "\n";
}
int main()
{
widget x(10, 20), y(0, 0);
x.put_widget();
y.put_widget();
return 0;
}
Hàm inline
• Hàm inline là hàm mà code của nó được mở rộng
tại điểm mà nó được yêu cầu, không phải được gọi.
• Lý do: giảm ovehead để thực thi hiệu quả
• Có hai cách tạo hàm inline:
o Dùng inline modifier
o Định nghĩa code bên trong một class
Ngôn ngữ C++ 22
Ví dụ inline modifier
#include
using namespace std;
class cl {
int i; // mặc định private
public:
int get_i();
void put_i(int j);
} ;
inline int cl::get_i()
{
return i;
}
Ngôn ngữ C++ 23
inline void cl::put_i(int j)
{
i = j;
}
int main()
{
cl s;
s.put_i(10);// tương đương s.i=10
cout << s.get_i();
return 0;
}
Tạo hàm inline trong class
• Bất kỳ hàm nào được định nghĩa trong class tự động là
hàm inline.
Ngôn ngữ C++ 24
class cl {
int i; // private by default
public:
// inline functions
int get_i() { return i; }
void put_i(int j) { i = j; }
} ;
int main()
{
cl s;
s.put_i(10);
cout << s.get_i();
return 0;
}
Mảng đối tượng
• Có thể tạo một mảng các đối tượng như các
kiểu dữ liệu khác.
• Khai báo:
Tên class Tên biến[kích thước]
Ngôn ngữ C++ 25
Ngôn ngữ C++ 26
#include
using namespace std;
enum resolution {low, medium, high};
class display {
int width;
int height;
resolution res;
public:
void set_dim(int w, int h)
{width = w; height = h;}
void get_dim(int &w, int &h)
w = width; h = height;}
void set_res(resolution r) {res = r;}
resolution get_res() {return res;}
};
char names[3][7] = {
"low",
"medium",
"high",
} ;
int main()
{
display display_mode[3];
int i, w, h;
display_mode[0].set_res(low);
display_mode[0].set_dim(640, 480);
display_mode[1].set_res(medium);
display_mode[1].set_dim(800, 600);
display_mode[2].set_res(high);
display_mode[2].set_dim(1600, 1200);
cout << "Available display modes:\n\n";
for(i=0; i<3; i++) {
cout<<names[display_mode[i].get_res()]
<< ": ";
display_mode[i].get_dim(w, h);
cout << w << " by " << h << "\n";
}
return 0;
}
Khởi động một mảng đối tượng
• Nếu một class chứa hàm tạo có tham số, một mảng
đối tượng có thể được khởi động.
Ngôn ngữ C++ 27
#include
using namespace std;
class samp {
int a;
public:
samp(int n) { a = n; }
int get_a() { return a; }
};
int main()
{
samp sampArray[4] = { -1, -2, -3, -4
};
int i;
for(i=0; i<4; i++)
cout << sampArray[i].get_a() << ' ';
cout << "\n";
return 0;
}
Trỏ đến đối tượng
• Có thể truy xuất một đối tượng bằng cách dùng
con trỏ chỉ đến đối tượng.
• Để truy xuất thành viên của đối tượng cần phải
dùng toán tửmũi tên.
• Để khai báo một con trỏ đối tượng dùng cú pháp
như các kiểu khác.
Ngôn ngữ C++ 28
Ngôn ngữ C++ 29
#include
using namespace std;
class P_example {
int num;
public:
void set_num(int val) {num = val;}
void show_num();
};
void P_example::show_num()
{
cout << num << "\n";
}
int main()
{
P_example ob, *p; // khai báo một đối tượng
//và con trỏ chỉ đến nó
ob.set_num(1); // truy xuất ob
ob.show_num();
p = &ob; // gán địa chỉ của ob cho p
p->show_num(); // truy xuất ob dùng con trỏ
return 0;
}