Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 45 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
45
Dung lượng
3,24 MB
Nội dung
Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 22 Toán tửphạmvi Toántử :: dùng để xác định chính xác hàm (thuộc tính) đƣợc truy xuất thuộc lớp nào. Câu lệnh: pt.OffsetPt(2,2); <=> pt.Point::OffsetPt(2,2); Cần thiết trong một số trƣờng hợp: Cách gọi hàm trong thừa kế. Tên thành viên bị che bởi biến cục bộ. Ví dụ: Point(int xVal, int yVal) { Point::xVal = xVal; Point::yVal = yVal; } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 23 Hàm xây dựng (Constructor) Dùng để định nghĩa và khởi tạo đối tƣợng cùng 1 lúc. Có tên trùng với tên lớp, không có kiểu trả về. Không gọi trực tiếp, sẽ đƣợc tự động gọi khi khởi tạo đt. Gán giá trị, cấp vùng nhớ cho các dữ liệu thành viên. Constructor có thể đƣợc khai báo chồng (đa năng hoá) nhƣ các hàm C++ thông thƣờng khác cung cấp các kiểu khởi tạo khác nhau tuỳ theo các đối số đƣợc cho khi tạo thể hiện class Point { int xVal, yVal; public: Point (int x, int y) { xVal = x; yVal = y; } void OffsetPt (int x, int y) { xVal += x; yVal += y; } }; void main() { Point pt1(10,20); pt1.OffsetPt(2,2); …… // Khai báo nào là sai ? Point pt2; Point pt3(); Point pt4 = Point(5,5); Point pt5 = new Point(5,5); ………. } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 24 Hàm xây dựng (tt) class Point { int xVal, yVal; public: Point (int x=0, int y=0) { xVal = x; yVal = y; } Point (float len=0, float angle=0) { xVal = (int) (len * cos(angle)); yVal = (int) (len * sin(angle)); } void OffsetPt (int , int ); … }; void main() { Point p1; Point p2(10,20); Point p3(60.3, 3.14); } class Set { private: int *elems; int maxCard; int card; public: Set(const int size) { elems = new int[size]; maxCard = size; card = 0; } …………… }; void main() { Set s1(100); Set s2(20); Set s3(1000); … } Mềm dẻo hơn Không cần phải nhớ gọi hàm EmptySet() khi khởi tạo Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 25 Hàm xây dựng Đối với constructor mặc định, nếu ta không cung cấp một phƣơng thức constructor nào, C++ sẽ tự sinh constructor mặc định là một phƣơng thức rỗng (không làm gì) mục đích để luôn có một constructor nào đó để gọi khi không có tham số nào Tuy nhiên, nếu ta không định nghĩa constructor mặc định nhƣng lại có các constructor khác, trình biên dịch sẽ báo lỗi không tìm thấy constructor mặc định nếu ta không cung cấp tham số khi tạo thể hiện. Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 26 Copy constructor Copy constructor là constructor đặc biệt đƣợc gọi khi ta tạo đối tƣợng mới là bản sao của một đối tƣợng đã có sẵn MyClass x(5); MyClass y = x; hoặc MyClass y(x); C++ cung cấp sẵn một copy constructor, nó chỉ đơn giản copy từng thành viên dữ liệu từđối tƣợng cũ sang đối tƣợng mới. Tuy nhiên, trong nhiều trƣờng hợp, ta cần thực hiện các công việc Khởi tạo khác trong copy constructor Thí dụ: lấy giá trị cho một ID duy nhất từ đâu đó, hoặc thực hiện sao chép “sâu” (chẳng hạn khi một trong các thành viên là con trỏ giữ bộ nhớ cấp phát động) Trong trƣờng hợp đó, ta có thể định nghĩa lại copy constructor Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 27 Copy constructor Khai báo cho copy constructor của lớp Foo: Foo(const Foo& existingFoo); từ khoá const đƣợc dùng để đảm bảo đối tƣợng đƣợc sao chép sẽ không bị sửa đổi tham số là đối tƣợng đƣợc sao chép Kiểu tham số là tham chiếu đến đối tƣợng kiểu Foo Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 28 Hàm hủy (Destructor) Dọn dẹp 1 đối tƣợng trước khi nó đƣợc thu hồi. Destructor không có giá trị trả về, và không thể định nghĩa lại (nó không bao giờ có tham số) mỗi lớp chỉ có 1 destructor Cú pháp: ~TenLop() { …… . } Không gọi trực tiếp, sẽ đƣợc tự động gọi khi hủy bỏ đt. Thu hồi vùng nhớ cho các dữ liệu thành viên là con trỏ. nếu ta không cung cấp destructor, C++ sẽ tự sinh một destructor rỗng(không làm gì cả) class Set { private: int *elems; int maxCard; int card; public: Set(const int size) { …… } ~Set() { delete[] elems; } …. }; Set TestFunct1(Set s1) { Set *s = new Set(50); return *s; } void main() { Set s1(40), s2(50); s2 = TestFunct1(s1); } Tổng cộng có bao nhiêu lần hàm hủy đƣợc gọi ? Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 29 Bạn (Friend) – Đặt vấn đề class IntSet { public: // . void SetToReal (RealSet&); private: int elems[maxCard]; int card; }; class RealSet { public: // . private: float elems[maxCard]; int card; }; Tập Các Số Nguyên Tập Các Số Thực void IntSet::SetToReal (RealSet &set) { set.card = card; for (register i = 0; i < card; ++i) set.elems[i] = (float) elems[i]; } Hàm SetToReal dùng để chuyển tập số nguyên thành tập số thực Làm thế nào để thực hiện đƣợc việc truy xuất đến thành viên Private ? Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 30 Hàm bạn (Friend) Cách 1: Khai báo hàm thành viên của lớp IntSet là bạn (friend) của lớp RealSet. class IntSet { public: // . void SetToReal (RealSet&); private: int elems[maxCard]; int card; }; class RealSet { public: // . friend void IntSet::SetToReal (RealSet&); private: float elems[maxCard]; int card; }; Giữ nguyên định nghĩa của lớp IntSet Thêm dòng khai báo Friend cho hàm thành viên SetToReal Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 31 Hàm bạn (Friend) Cách 2: Chuyển hàm SetToReal ra ngoài (độc lập). Khai báo hàm đó là bạn của cả 2 lớp. class IntSet { public: // . friend void SetToReal (IntSet &, RealSet&); private: int elems[maxCard]; int card; }; class RealSet { public: // . friend void SetToReal (IntSet &, RealSet&); private: float elems[maxCard]; int card; }; void SetToReal (IntSet& iSet, RealSet& rSet ) { rSet.card = iSet.card; for (int i = 0; i < iSet.card; ++i) rSet.elems[i] = (float) iSet.elems[i]; } Hàm độc lập là bạn(friend) của cả 2 lớp. [...]... 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 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 52 Thành vi n tĩnh Hàm thành vi n tĩnh: Tƣơng đƣơng với hàm toàn cục 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 Gọi thông qua: ::... :: Thƣờng dùng để đếm số lƣợng đối tƣợng class Window { // danh sách liên kết tất cả Window static Window *first; // con trỏ tới window kế tiếp Window *next; // }; Window *Window::first = &myWindow; // …………… Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khai báo Khởi tạo dữ liệu thành vi n tĩnh 46 Thành vi n tĩnh -Ví dụ Đếm số đối tƣợng MyClass khai báo lớp MyClass class... đối tƣợng nào Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 48 Thành vi n tĩnh Định nghĩa và khởi tạo 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; 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ế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... are currently 1 instance(s) of MyClass Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 50 Thành vi n hằng tĩnh 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 Không nhƣ các thành vi n khác, các thành vi n static const phải đƣợc khởi tạo khi khai báo class MyClass... int thirteen=13; }; Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng int main() { MyClass x; MyClass y; MyClass z; } x, y, z dùng chung một thành vi n thirteen có giá trị không đổi là 13 51 Thành vi n hằng tĩnh 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... Tin - Đại Học Bách khoa Đà Nẵng 44 Thành vi n hằng void main() { const string Truong("DH BC TDT"); string s("ABCdef"); s.Output(); s.ToLower(); s.Output(); Truong.Output(); Truong.ToLower(); // Bao loi } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 45 Thành vi n tĩnh Thành vi n dữ liệu tĩnh: Dùng chung 1 bản sao chép (1 vùng nhớ) chia sẻ cho tất cả đối tƣợng của lớp đó Sử dụng: ::... Thông Tin - Đại Học Bách khoa Đà Nẵng Khởi tạo ĐÚNG thông qua danh sách khởi tạo thành vi n 42 Thành vi n hằng Hằng đối tƣợng: không đƣợc thay đổi giá trị Hàm thành vi n hằng: Đƣợc phép gọi trên hằng đối tƣợng.(đảm bảo không thay đổi giá trị của đối tƣợng chủ) Không đƣợc thay đổi giá trị dữ liệu thành vi n 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... Tin - Đại Học Bách khoa Đà Nẵng 47 Thành vi n tĩnh -Ví dụ Cài đặt các phƣơng thức int MyClass::count = 0; MyClass::MyClass() { this->count++; // Increment the static count } MyClass::~MyClass() { this->count ; // Decrement the static count } void MyClass::printCount() { cout . Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 22 Toán tử phạm vi Toán tử :: dùng để xác định chính xác hàm (thuộc tính) đƣợc truy xuất thuộc lớp nào. Câu. forward cho một lớp chỉ cho trình biên dịch biết về sự có mặt của lớp mà không cho biết về các thành vi n của lớp đó Vậy: cần khai báo forward cho lớp cấp quyền