Các đặc điểm C++
áp dụng cho class
Lập trình hướng đối tượng
@ 2004 Trần Minh Châu. FOTECH. VNU
2
Tài liệu đọc
n Eckel, Bruce. Thinking in C++, 2
nd
Ed. Vol 1.
¨ Chapter 8: Constants
n Start at p. 352 (Classes)
¨ Chapter 10: Name Control
n p. 423 (Static Members in C++) to p. 442 (Alternate Linkage
Specifications)
n Dietel. C++ How to Program, 4
th
Ed.
¨ Chapter 7: Class II
n 7.2, 7.3, 7.6, 7.7, 7.8
@ 2004 Trần Minh Châu. FOTECH. VNU
3
Tổng quan
n Các đặc điểm cơ bản của C++ như const, static, áp
dụng cho các lớp như thế nào?
¨ hằng thành viên–const member
¨ thành viên tĩnh–static member
¨ hằng thành viên tĩnh–const static member
¨ hằng hàm/phương thức–const method
¨ hàm/phương thức tĩnh–static method
¨ làm việc với các đối tượng
@ 2004 Trần Minh Châu. FOTECH. VNU
¨ khi dùng cho các hằng thành viên, danh sách khởi tạo đảm bảo chúng
được khởi tạo trước khi được truy nhập
¨ chi tiết thêm tại phần thừa kế.
class MyClass {
public:
MyClass(int x = 5); // Constructor w/default argument
private:
const int foo; // Declares foo a constant member
};
MyClass::MyClass(int x) : foo(x)
{ // constructor body }
danh sách khởi tạo của
constructor
dấu hai chấm tách giữa
danh sách tham số và
danh sách khởi tạo
@ 2004 Trần Minh Châu. FOTECH. VNU
7
Hằng thành viên–const member
n Danh sách khởi tạo–Vídụ
class MyClass {
public:
MyClass(int x = 5); // Constructor w/default argument
private:
const int foo; // Declares foo a constant member
const int bar;
};
MyClass::MyClass(int x, int y) : foo(x), bar(y)
}
int main()
{
for (int i = 1; i <= 3; i++)
{
myCounter();
}
}
This function has been invoked 1 time(s).
This function has been invoked 2 time(s).
This function has been invoked 3 time(s).
n Đối với biến thông thường, static dùng để khai báo các biến tĩnh
tồn tại trong suốt quátrình chạy của chương trình.
@ 2004 Trần Minh Châu. FOTECH. VNU
10
Thành viên tĩnh–static member
Tương tự giữa biến tĩnh vàthành viên tĩnh
n biến staticxđược khai báo trong hàm f(),
¨ một bản duy nhất tồn tại trong suốt quátrình chạy của chương trình.
¨ dùng chung cho tất cả các lần chạy hàm f(),
¨ bất kể hàm f() được gọi bao nhiêu lần
n Đối với class, static dùng để khai báo thành viên dữ liệu dùng
chung cho mọi thể hiện của lớp.
¨ một bản duy nhất tồn tại trong suốt quátrình chạy của chương trình,
¨ dùng chung cho tất cả các thể hiện của lớp,
¨ bất kể lớp đócóbao nhiêu thể hiện
@ 2004 Trần Minh Châu. FOTECH. VNU
11
n Đếm sốđối tượng MyClass
¨ khai báo lớp MyClass
Thành viên tĩnh–static member
Định nghĩa vàkhởi tạo
n thành viên tĩnh được lưu trữđộc lập với các thể hiện của lớp, do đó,
các thành viên tĩnh phải được định nghĩa
int MyClass::count;
n ta thường định nghĩa các thành viên tĩnh trong file chứa định nghĩa
các phương thức
n nếu muốn khởi tạo giátrị cho thành viên tĩnh ta cho giátrị khởi tạo
tại định nghĩa
int MyClass::count = 0;
@ 2004 Trần Minh Châu. FOTECH. VNU
14
Thành viên tĩnh–static member
int main()
{
MyClass* x = new MyClass;
x->PrintCount();
MyClass* y = new MyClass;
x->PrintCount();
y->PrintCount();
delete x;
y->PrintCount();
}
There are currently 1 instance(s) of MyClass.
There are currently 2 instance(s) of MyClass.
There are currently 2 instance(s) of MyClass.
There are currently 1 instance(s) of MyClass.
¨ chương trình demo sử dụng MyClass
@ 2004 Trần Minh Châu. FOTECH. VNU
15
đối với các thành viên dữ liệu cần giữ nguyên giátrị trong suốt
thời gian sống của một thể hiện
¨ static const
đối với các thành viên dữ liệu cần giữ nguyên cùng một giátrị tại
tất cả các đối tượng của một lớp
@ 2004 Trần Minh Châu. FOTECH. VNU
17
Hằng phương thức–const method
n Từ khoá const được dùng cho các tham số của hàm để
đảm bảo các tham sốđược truyền cho hàm sẽ không bị
hàm sửa đổi.
int myFunction(const int& x);
n Cúpháp này cũng được dùng cho phương thức với hiệu
quả tương tự
class MyClass {
//
MyMethod(const int& x);
///
};
x được truyền bằng hằng tham chiếu
x sẽ không bị hàm/phương thức sửa đổi
@ 2004 Trần Minh Châu. FOTECH. VNU
18
Hằng phương thức–const method
n Còn tham sốẩn truyền bằng con trỏ this vàchính là đối
tượng chủ?
n Hằng phương thức làcúpháp cho phép ta đảm bảo với
trình biên dịch rằng phương thức sẽ không sửa đổi đối
tượng chủ
class MyClass {
n Một phương thức tĩnh cóthểđược gọi một cách độc lập
với mọi thể hiện của lớp
¨ phương thức tĩnh không được truyền con trỏ this làm tham số
ẩn.
¨ không thể sửa đổi các thành viên dữ liệu từ trong phương thức
tĩnh.
¨ cóthể gọi phương thức tĩnh màkhông cần tạo thể hiện nào của
lớp-gọi thẳng bằng tên lớp
@ 2004 Trần Minh Châu. FOTECH. VNU
21
Phương thức tĩnh–static method
n Khai báo:
class MyClass
{
public:
MyClass(); // Constructor
~MyClass(); // Destructor
static void printCount(); // Output current value of count
private:
static int count; // count
};
n dùng tên lớp kèm theo toán tử phạm vi (::) để gọi phương thức tĩnh
MyClass::printCount();
n hoặc cóthể dùng đối tượng sẵn có để gọi phương thức tĩnh
MyClass x;
x.printCount();
@ 2004 Trần Minh Châu. FOTECH. VNU
22
Phương thức tĩnh–static method
n Vídụ
24
Hằng đối tượng. Vídụ
class MyClass
{
public:
MyClass();
~MyClass();
static void printCount();
void foo() const;
void bar();
const int x;
int y;
};
const MyClass x;
cout << x.x;//no change–OK
cout << x.y;//no change–OK
x.x++;//Error
x.y++;//Error
const MyClass x;
x.printCount();// static-OK
x.foo();// const-OK
x.bar();// non-const-error
không thể sửa thành viên, dùlà
public không phải hằng
chỉ được gọi hàm thành viên
làhằng hoặc tĩnh
@ 2004 Trần Minh Châu. FOTECH. VNU
25
Làm việc với đối tượng
cấp phát bộ nhớđộng
rồi thu hồi chúng
MyClass foo;
MyClass& r_foo = foo;
MyClass foo2;
MyClass& r_foo2 = foo2;
n Khai báo tham chiếu tới
đối tượng
@ 2004 Trần Minh Châu. FOTECH. VNU
28
Làm việc với đối tượng
MyClass foo[10];
MyClass* foo2[10];
for (int i = 0; i < 10; i++) {
foo2[i] = new MyClass(i, i + 1);
}
n Tạo mảng các đối tượng
hoặc mảng các con trỏ
tới đối tượng
foo[7].PrintCount();
for (int i = 0; i < 10; i++)
{
foo[i].PrintCount();
}
n Truy nhập các đối tượng trong
mảng như vẫn làm đối với các
phần tử mảng thông thường
phải cóconstructor
mặc định để cóthể