Lập trình hướng đối tượng: Các đặc điểm C++ áp dụng cho class

pdf 15 trang phuongnguyen 2860
Bạn đang xem tài liệu "Lập trình hướng đối tượng: Các đặc điểm C++ áp dụng cho class", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdflap_trinh_huong_doi_tuong_cac_dac_diem_c_ap_dung_cho_class.pdf

Nội dung text: Lập trình hướng đối tượng: Các đặc điểm C++ áp dụng cho class

  1. Các đặc điểm C++ áp dụng cho class Lập trình hướng đối tượng Tài liệu đọc n Eckel, Bruce. Thinking in C++, 2nd 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, 4th Ed. ¨ Chapter 7: Class II n 7.2, 7.3, 7.6, 7.7, 7.8 @ 2004 Trần Minh Châu. FOTECH. VNU 2
  2. 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 3 Hằng thành viên–const member n Ta đãbiết về từ khoá const dùng với các biến thông thường const int x = 50; n Từ khoá const đối với các thành viên dữ liệu như thế nào? n Khi một thành viên dữ liệu được khai báo là const, thành viên đó sẽ giữ nguyên giátrị trong suốt thời gian sống của đối tượng chủ. class MyClass { public: MyClass(int x = 5); // Constructor w/default argument private: const int foo; // Declares foo a constant member }; @ 2004 Trần Minh Châu. FOTECH. VNU 4
  3. Hằng thành viên–const member khởi tạo hằng thành viênkhi nào? n Bên trong khai báo class? Quásớm, ta chưa có đối tượng nào, không cóchỗđể lưu giátrị n Gán trị trong thân hàm constructor? Quámuộn, không đảm bảo hằng không được truy nhập trước khi nó được gán. n Giải pháp: danh sách khởi tạo tại constructor–member initialization list @ 2004 Trần Minh Châu. FOTECH. VNU 5 Hằng thành viên–const member n danh sách khởi tạo của constructor nằm tại định nghĩa của constructor, chứa một tập các "lời gọi constructor" màsẽđược thực hiện trước khi thực thi phần thân của constructor đó. ¨ 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 { dấu hai chấm tách giữa public: danh sách tham số và MyClass(int x = 5); // Condastructornh sách kh w/defaultởi tạo argument private: const int foo; // Declares foo a constant member }; danh sách khởi tạo của constructor MyClass::MyClass(int x) : foo(x) { // constructor body } @ 2004 Trần Minh Châu. FOTECH. VNU 6
  4. Hằng thành viên–const member n Danh sách khởi tạo–Vídụ class MyClass { public: dấu phảy tách giữa các MyClass(int x = 5); // Constructor w/defaultthành phargumentần của danh sách private: khởi tạo const int foo; // Declares foo a constant member const int bar; }; MyClass::MyClass(int x, int y) : foo(x), bar(y) { // constructor body } danh sách khởi tạo của constructor, khởi tạo hằng foo với giátrị của x , khởi tạo hằng bar với giátrị của y. @ 2004 Trần Minh Châu. FOTECH. VNU 7 Hằng thành viên–const member n Điều quan trọng cần nhớ: hằng thành viên của một đối tượng không thay đổi giátrị trong suốt thời gian sống của đối tượng đó. ¨ Các hằng của các đối tượng khác nhau (thuộc cùng một lớp) không cóquan hệ gìvới nhau ¨ Vídụ, một đối tượng thuộc lớp MyClass cóhằng foo với giátrị 5,trong khi đó, một đối tượng khác cùng thuộc lớp MyClass lại cóhằng foo cógiátrị 10. n Tiếp theo, ta sẽ tìm hiểu cách định nghĩa các thành viên dữ liệu được dùng chung bởi tất cả các đối tượng thuộc cùng một lớp @ 2004 Trần Minh Châu. FOTECH. VNU 8
  5. Thành viên tĩnh–static member 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. void myCounter() { static int count = 0; // Static variable count++; cout <<“This function has been invoked“ << count <<“time(s). << endl; } int main() { for (int i = 1; i <= 3; i++) This function has been invoked 1 time(s). { This function has been invoked 2 time(s). myCounter(); This function has been invoked 3 time(s). } } @ 2004 Trần Minh Châu. FOTECH. VNU 9 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 10
  6. Thành viên tĩnh-Vídụ n Đếm sốđối tượng MyClass ¨ khai báo lớp MyClass class MyClass { public: MyClass(); // Constructor ~MyClass(); // Destructor void printCount(); // Output current value of count private: static int count; // static memberto store // number of instances of MyClass }; thành viên tĩnh count @ 2004 Trần Minh Châu. FOTECH. VNU 11 Thành viên tĩnh-Vídụ ¨ cài đặt các phương thức Khởi tạo biến đếm bằng 0, vì ban đầu không có đối tượng nào int MyClass::count = 0; MyClass::MyClass() { this->count++; // Increment the static count } MyClass::~MyClass() { this->count ; // Decrement the static count } void MyClass::printCount() { cout count << " instance(s) of MyClass.\n"; } @ 2004 Trần Minh Châu. FOTECH. VNU 12
  7. 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 13 Thành viên tĩnh–static member ¨ chương trình demo sử dụng MyClass 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. @ 2004 Trần Minh Châu. FOTECH. VNU 14
  8. Hằng thành viên tĩnh n Kết hợp hai từ khoáconst vàstatic, ta cóhiệu quả kết hợp ¨ một thành viên dữ liệu được định nghĩa là static const làmột hằng được chia sẻ giữa tất cả các đối tượng của một lớp. n Không như các thành viên khác, các thành viên static const phải đượckhởi tạo khi khai báo class MyClass int main() { { public: MyClass x; MyClass(); MyClass y; ~MyClass(); MyClass z; private: } static const int thirteen = 13; }; x, y, z dùng chung một thành viên thirteen cógiátrị không đổi là 13 @ 2004 Trần Minh Châu. FOTECH. VNU 15 Hằng thành viên tĩnh n Tóm lại, ta nên khai báo: ¨ static đối với các thành viên dữ liệu ta muốn dùng chung cho mọi thể hiện của một lớp ¨ const đố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 16
  9. 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 { 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 // MyMethod(const int& x); /// }; @ 2004 Trần Minh Châu. FOTECH. VNU 17 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 { void MyClass::PrintCount() const void printCount() const; { // }; } phải cótừkhóa const ở cả khai báo và định nghĩa phương thức @ 2004 Trần Minh Châu. FOTECH. VNU 18
  10. Hằng phương thức–const method n Đối với các hằng đối tượng, trình biên dịch chỉ cho phép gọi các hằng phương thức ¨ đểđảm bảo nókhông sửa đổi đối tượng chủ n Trình biên dịch sẽ báo lỗi nếu một hằng phương thức sửa đổi giátrị của thành viên bất kỳ của đối tượng ¨ Tuy nhiên, hằng phương thức được phép sửa giátrị của các thành viên dữ liệu tĩnh của lớp n do các thành viên tĩnh độc lập với các đối tượng, như vậy sửa đổi chúng không vi phạm tính bất biến của đối tượng n Nói chung, ta nên khai báo mọi phương thức truy vấn là hằng, vừa để báo với trình biên dịch, vừa để tự gợi nhớ. @ 2004 Trần Minh Châu. FOTECH. VNU 19 Phương thức tĩnh–static method n Từ khoá static còn được dùng cho các phương thức à phương thức tĩnh 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 20
  11. 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 21 Phương thức tĩnh–static method n Vídụ int main() { MyClass::printCount(); MyClass* x = new MyClass; x->printCount(); MyClass* y = new MyClass; x->printCount(); y->printCount(); delete x; y->printCount(); } There are currently 0 instance(s) of MyClass. 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. @ 2004 Trần Minh Châu. FOTECH. VNU 22
  12. Hằng đối tượng–const object n hằng đối tượng: ¨ trình biên dịch sẽđảm bảo rằng không một thành viên dữ liệu nào cóthể bị sửa đổi sau khi đối tượng được khởi tạo n kể cả các thành viên public không phải làhằng ¨ khai báo: const MyClass x(5);// x làhằng n Khi làm việc với hằng đối tượng, ta chỉ cóthể gọi các hàm thành viên làhằng-const hoặc tĩnh-static @ 2004 Trần Minh Châu. FOTECH. VNU 23 Hằng đối tượng. Vídụ chỉ được gọi hàm thành viên làhằng hoặc tĩnh class MyClass const MyClass x; { public: x.printCount();// static-OK MyClass(); x.foo();// const-OK ~MyClass(); x.bar();// non-const-error static void printCount(); void foo() const; void bar(); const MyClass x; const int x; int y; cout << x.x;//no change–OK cout << x.y;//no change–OK }; x.x++;//Error x.y++;//Error không thể sửa thành viên, dùlà public không phải hằng @ 2004 Trần Minh Châu. FOTECH. VNU 24
  13. Làm việc với đối tượng n Đến đây, ta đãgặp các vídụvềcách khai báo, khởi tạo, vàlàm việc với các đối tượng n Trước khi tiếp tục, ta nên tóm tắt lại một số cách sử dụng đối tượng trong C++ n Kèm thêm một số lưu ý về vấn đề liên quan tới quản lý bộ nhớ vàlập trình hướng đối tượng @ 2004 Trần Minh Châu. FOTECH. VNU 25 Làm việc với đối tượng n Điều quan trọng cần nhớ về các đối tượng là: tại cốt lõi, chúng chẳng qua chỉ làcác kiểu dữ liệu người dùng tự định nghĩa n Cónghĩa là, hầu như tất cả những gìta cóthể làm đối với các kiểu dữ liệu cài sẵn, ta cũng cóthể thực hiện đối với các lớp @ 2004 Trần Minh Châu. FOTECH. VNU 26
  14. Làm việc với đối tượng MyClass foo; n Khai báo các đối tượng MyClass foo2(5,6); MyClass* foo; n Khai báo con trỏ tới đối foo = new MyClass(); tượng, vàdùng con trỏđể MyClass* foo2; foo2 = new MyClass(5, 6); cấp phát bộ nhớđộng delete foo; rồi thu hồi chúng delete foo2; MyClass foo; n Khai báo tham chiếu tới MyClass& r_foo = foo; đối tượng MyClass foo2; MyClass& r_foo2 = foo2; @ 2004 Trần Minh Châu. FOTECH. VNU 27 Làm việc với đối tượng phải cóconstructor mặc định để cóthể cókhai báo này MyClass foo[10]; n Tạo mảng các đối tượng MyClass* foo2[10]; hoặc mảng các con trỏ for (int i = 0; i < 10; i++) { tới đối tượng foo2[i] = new MyClass(i, i + 1); } foo[7].PrintCount(); n Truy nhập các đối tượng trong mảng như vẫn làm đối với các for (int i = 0; i < 10; i++) { phần tử mảng thông thường foo[i].PrintCount(); } @ 2004 Trần Minh Châu. FOTECH. VNU 28
  15. Làm việc với đối tượng class MyClass { n Cóthể cóthành viên là các đối tượng thuộc lớp private: // Instance of a class khác. MyOtherClass x; (quan hệ chứa-“has-a”) // Pointer to an instance // of a class MyOtherClass* y; }; MyClass::MyClass { n Để tránh rò rỉ bộ nhớ, bất cứ this->y = new MyClass2(); phần bộ nhớ nào được cấp phát } động tại constructor đều phải MyClass::~MyClass { được thu hồi tại destructor delete this->y; } @ 2004 Trần Minh Châu. FOTECH. VNU 29