intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

CHƯƠNG 3: Lớp – Quyền truy xuất

Chia sẻ: Hiếu Đại Ca | Ngày: | Loại File: PDF | Số trang:14

70
lượt xem
2
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Toán tử phạm vi Danh sách khởi tạo thành viên Thành viên hằng - Thành viên tĩnh Thành viên tham chiếu Thành viên là đối tượng của 1 lớp Mảng các đối tượng Phạm vi lớp Cấu trúc (structure) và hợp (union) Các trường bit...

Chủ đề:
Lưu

Nội dung Text: CHƯƠNG 3: Lớp – Quyền truy xuất

  1. Nội dung Lớp – Quyền truy xuất CHƯƠNG 3: LỚ P Khai báo, định nghĩa 1 lớp đơn giản Hàm thành viên nội tuyến (inline) (CLASS) Hàm xây dựng (constructor) Hàm hủy (destructor) Hàm bạn (friend) – Lớp bạn Khoa Công Nghệ Thông Tin Đại học Bách khoa – Đại học Đà Nẵng Đối số mặc định Đối số thành viên ẩn (con trỏ this) 1 2 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Nội dung (tt) Khái niệm lớp Toán tử phạm vi Lớp: kiểu dữ liệu trừu tượng. private protected Danh sách khởi tạo thành viên public Thành viên hằng - Thành viên tĩnh class TÊNLỚP { Đặc tả TÊN LỚP đối : Thành viên tham chiếu tượng DataType1 memberdata1; Dữ liệu DataType2 memberdata2; Thành viên là đối tượng của 1 lớp thành viên ……………. Mảng các đối tượng < Quyền truy xuất > : memberFunction1(); Phạm vi lớp Tập các Hàm memberFunction2(); thao tác thành viên Cấu trúc (structure) và hợp (union) ………….. }; Các trường bit 3 4 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 1
  2. Đóng gói trong C++ Đóng gói trong C++ Khái niệm đóng gói có sẵn trong C++ class: ta có thể hạn Khi nào sử dụng quyền nào? chế quyền truy nhập đến các thành viên của đối tượng Theo phong cách lập trình hướng đối tượng tốt, ta sẽ giữ mọi thành Sử dụng một bộ từ khoá để mô tả quyền truy nhập: viên dữ liệu ở dạng private (che dấu dữ liệu). Các phương thức thường khai báo là public để có thể liên lạc được private với đối tượng từ bên ngoài(giao diện của đối tượng). nếu một thành viên của một lớp được khai báo là private, nó chỉ được truy nhập đến từ bên trong lớp đó Các phương thức tiện ích chỉ được dùng bởi các phương thức khác Mặc định: mọi thành viên của class là private, do đó nhấn mạnh khái niệm đóng gói trong cùng lớp nên dược khai báo private. của lập trình hướng đối tượng. Public Các thành viên được khai báo là public có thể được truy nhập từ bên ngoài đối tượng là mặc định đối với các thành viên của struct protected friend 5 6 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Ví dụ: Lớp đơn giản Khai báo các phương thức Giao diện của phương thức luôn đặt trong định nghĩa Tạo ra đối tượng lớp, cũng như các khai báo thành viên dữ liệu. thuộc lớp class Point { Phần cài đặt (định nghĩa phương thức) có thể đặt trong Point void main() { int xVal, yVal; định nghĩa lớp hoặc đặt ở ngoài. Point pt; public: Khai báo void SetPt (int, int); Hai lựa chọn: Lớp pt.SetPt(10,20); void OffsetPt (int, int); pt.OffsetPt(2,2); }; Gọi hàm …….. class Point { class Point { trên void Point::SetPt (int x, int y) { Point int xVal, yVal; int xVal, yVal; đối tượng Định nghĩa xVal = x; public: public: các hàm yVal = y; void SetPt (int, int); void SetPt (int, int) { pt.xVal = 10; // Đúng hay sai? thành viên } void OffsetPt (int, int); xVal = x; void Point::OffsetPt (int x, int y) { Point }; yVal = y; Point pt1, pt2, pt3; xVal += x; void Point::SetPt (int x, int y) { } Point ………. yVal += y; xVal = x; yVal = y; void OffsetPt (int, int); } } } }; 7 8 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 2
  3. Khai báo các phương thức Ví dụ - Lớp Set (tập hợp) Hàm inline: Bool Set::IsMember (const int elem) { #include for (register i = 0; i < card; ++i) const maxCard = 100; Cải thiện tốc độ thực thi if (elems[i] == elem) enum Bool {false, true}; return true; class Set { return false; Tốn bộ nhớ (dành cho mã lệnh) khi thực thi. private: } void Set::AddElem (const int elem) { int elems[maxCard]; if (IsMember(elem)) int card; Cách 1: return; class Point { class Point { public: if (card < maxCard) thêm int xVal, yVal; int xVal, yVal; void EmptySet(){ card = 0; } elems[card++] = elem; Từ public: Cách 2: public: else Bool IsMember (const int); cout
  4. Hàm xây dựng (tt) Hàm xây dựng Mềm Đối với constructor mặc định, nếu ta không cung class Set { class Point { dẻo private: cấp một phương thức constructor nào, C++ sẽ int xVal, yVal; hơn int *elems; public: int maxCard; tự sinh constructor mặc định là một phương Point () // Hàm xây dựng mặc nhiên int card; { xVal = 0; yVal = 0; } thức rỗng (không làm gì) public: Point (int x=0, int y=0) { Set(const int size) { xVal = x; yVal = y; mục đích để luôn có một constructor nào đó để gọi elems = new int[size]; } maxCard = size; khi không có tham số nào Point (float len, float angle) { card = 0; xVal = (int) (len * cos(angle)); } Tuy nhiên, nếu ta không định nghĩa constructor yVal = (int) (len * sin(angle)); …………… } }; mặc định nhưng lại có các constructor khác, Không cần void OffsetPt (int , int ); … void main() { phải nhớ }; trình biên dịch sẽ báo lỗi không tìm thấy Set s1(100); gọi hàm void main() { Set s2(20); constructor mặc định nếu ta không cung cấp EmptySet() EmptySet() Set s3(1000); … Point p1; khi khởi tạo Point p2(10,20); } tham số khi tạo thể hiện. Point p3(60.3, 3.14); } 13 14 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Copy constructor Copy constructor Copy constructor là constructor đặc biệt được gọi khi ta tạo Khai báo cho copy constructor của lớp Foo: đối tượng mới là bản sao của một đối tượng đã có sẵn Foo(const Foo& existingFoo); 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 tham số là đối tượng tượng mới. được sao chép Tuy nhiên, trong nhiều trường hợp, ta cần thực hiện các Kiểu tham số là tham chiếu công việc Khởi tạo khác trong copy constructor đến đối tượng kiểu Foo 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 từ khoá const được dùng để đảm bảo đối là con trỏ giữ bộ nhớ cấp phát động) tượng được sao chép sẽ không bị sửa đổi Trong trường hợp đó, ta có thể định nghĩa lại copy constructor 15 16 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 4
  5. Hàm hủy (Destructor) Bạn (Friend) – Đặt vấn đề Dọn dẹp 1 đối tượng trước khi nó được thu hồi. ướ Hàm SetToReal Tập Các Destructor không có giá trị trả về, và không thể định nghĩa lại (nó không bao dùng để chuyển Số Nguyên giờ có tham số) tập số nguyên mỗi lớp chỉ có 1 destructor thành tập số thực class IntSet { IntSet Cú pháp: ~TenLop() { ……... } void IntSet::SetToReal (RealSet &set) { public: Không gọi trực tiếp, sẽ được tự động gọi khi hủy bỏ đt. set.card = card; //... Thu hồi vùng nhớ cho các dữ liệu thành viên là con trỏ. thà Thu for (register i = 0; i < card; ++i) void SetToReal (RealSet&); SetToReal nếu ta không cung cấp destructor, C++ sẽ tự sinh một destructor rỗng(không set.elems[i] = (float) elems[i]; private: làm gì cả) } int elems[maxCard]; Set TestFunct1(Set s1) { int card; class Set { Set *s = new Set(50); Tổng cộng }; private: return *s; có bao nhiêu Làm thế nào để class RealSet { int *elems; RealSet } thực hiện được lần hàm hủy public: int maxCard; Tập Các việc truy xuất //... int card; được gọi ? void main() { Số Thực đến thành viên private: public: Set s1(40), s2(50); Private ? float elems[maxCard]; Set(const int size) { …… } s2 = TestFunct1(s1); int card; ~Set() { delete[] elems; } } }; …. }; 17 18 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Hàm bạn (Friend) Hàm bạn (Friend) Cách 2: 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. 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 { IntSet public: Giữ nguyên định //... nghĩa của lớp IntSet class IntSet { IntSet void SetToReal (RealSet&); SetToReal public: void SetToReal (IntSet& iSet, SetToReal private: //... RealSet& rSet ) int elems[maxCard]; friend void SetToReal (IntSet &, RealSet&); { private: int card; rSet.card = iSet.card; int elems[maxCard]; }; int card; for (int i = 0; i < iSet.card; ++i) }; class RealSet { RealSet rSet.elems[i] = class RealSet { RealSet public: Thêm dòng khai báo (float) iSet.elems[i]; public: //... Friend cho } //... friend void IntSet::SetToReal (RealSet&); hàm thành viên friend void SetToReal (IntSet &, RealSet&); private: SetToReal Hàm độc lập private: float elems[maxCard]; float elems[maxCard]; là bạn(friend) int card; int card; của cả 2 lớp. }; }; 19 20 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 5
  6. friend – khai báo forward Bạn (Friend) Hàm bạn: Một điều cần phải chú ý khi khai báo phương thức đơn lẻ là friend: Có quyền truy xuất đến tất cả các dữ liệu và Nhớ lại cách ta đã khai báo phương thức SetToReal hàm thành viên (protected + private) của 1 lớp. (RealSet&) là friend của RealSet class RealSet { RealSet Lý do: public: Cách định nghĩa hàm chính xác. friend void IntSet::SetToReal (RealSet&); Hàm cài đặt không hiệu quả. private: … Lớp bạn: }; Khi xử lý phần này, trình biên dịch cần phải biết là đã có Tất cả các hàm trong lớp bạn: là hàm bạn. lớp IntSet Tuy nhiên các phương thức của IntSet lại dùng đến class A; RealSet nên phải có lớp RealSet trước khi định nghĩa IntSet class IntSet { ……….. } IntSet class B { // ………. class RealSet { // ………. RealSet Cho nên ta không thể tạo IntSet khi chưa tạo RealSet và friend class A; friend class IntSet; không thể tạo RealSet khi chưa tạo IntSet }; }; 21 22 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng friend – khai báo forward friend – khai báo forward Giải pháp: sử dụng khai báo forward (forward Tuy nhiên, không thể làm ngược lại (khai declaration) cho lớp cấp quan hệ friend (trong ví báo forward cho lớp IntSet) dụ là RealSet) Ta khai báo các lớp trong ví dụ như sau: class IntSet; // Forward declaration class RealSet { RealSet class RealSet; // Forward declaration public: class IntSet { IntSet friend void IntSet::SetToReal (RealSet&); public: private: void SetToReal (RealSet&); SetToReal … private: Trình biên dịch chưa biết SetToReal }; … }; class IntSet { IntSet class RealSet { RealSet public: public: void SetToReal (RealSet&); SetToReal friend void IntSet::SetToReal (RealSet&); private: private: … … }; }; 23 24 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 6
  7. friend – khai báo forward Đối số mặc định Lý do: trình biên dịch phải nhìn thấy khai báo phương Đối số mặc định tính từ bên phải. thức trong lớp nhận trước khi tạo mối quan hệ friend tại lớp cho (granting class) class Point { class Point { Point Point Trong ví dụ, trình biên dịch phải biết khai báo IntSet::SetToReal int xVal, yVal; int xVal, yVal; (RealSet&) tại khai báo của IntSet trước khi có thể tạo mối quan public: public: Point (int x = 0, int y = 0); Point (int x = 0, int y = 0); hệ friend của IntSet::SetToReal (RealSet&) với RealSet //... Point (float x=0, float y=0); Khai báo 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 đó }; Tối nghĩa Mơ hồ Vậy: cần khai báo forward cho lớp cấp quyền friend void main() { Point p1; // như là ??? void main() { trong ví dụ trên là RealSet Point p2(10); // như là ??? Point p2(1.6, 5.0); // như là ??? Point p3(10,20); Point p3(10,20); // như là ??? Point p4(, 20); // ????? Point p4; // ????? ….. ….. } } 25 26 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Con trỏ this Đối số thành viên ẩn Con trỏ *this: Con Tuy không bắt buộc sử dụng tường minh con trỏ this, ta có thể dùng nó để giải quyết vấn đề tên trùng và phạm vi Là 1 thành viên ẩn, có thuộc tính là private. void Foo::bar() Trỏ tới chính bản thân đối tượng. { int x; x = 5; // local x void Point::OffsetPt (int x, int y) { void Point::OffsetPt (int x, int y) { Point Point this->x = 6; // this instance’s x xVal += x; this->xVal += x; } yVal += y; this->yVal += y; hoặc } } void Foo::bar(int x) { this->x = x; • Có những trường hợp sử dụng *this là dư thừa (Ví dụ trên) } • Tuy nhiên, có những trường hợp phải sử dụng con trỏ *this 27 28 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 7
  8. Con trỏ this Toán tử phạm vi Con trỏ this được các phương thức tự động Toán tử :: dùng để xác định chính xác hàm sử dụng, nên việc ta có sử dụng nó một cách (thuộc tính) được truy xuất thuộc lớp nào. tường minh hay bỏ qua không ảnh hưởng đến Câu lệnh: pt.OffsetPt(2,2); tốc độ chạy chương trình pt.Point::OffsetPt(2,2); Nhiều lập trình viên sử dụng this một cách Cần thiết trong một số trường hợp: tường minh mỗi khi truy nhập các thành viên dữ Cách gọi hàm trong thừa kế. liệu Tên thành viên bị che bởi biến cục bộ. để đảm bảo không có rắc rối về phạm vi Ví dụ: Point(int xVal, int yVal) { ngoài ra, còn để tự nhắc rằng mình đang truy nhập Point::xVal = xVal; thành viên Point::yVal = yVal; Lựa chọn có dùng hay không là tuỳ ở mỗi người } 29 30 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Đặt khai báo lớp ở đâu? File header car.h Để đảm bảo tính đóng gói, ta thường đặt khai // car.h báo của lớp trong file header #ifndef CAR_H #define CAR_H tên file thường trùng với tên lớp. Ví dụ khai báo lớp class Car { Car đặt trong file “car.h” public: //... Phần cài đặt (định nghĩa) đặt trong một file void drive(int speed, int distance); nguồn tương ứng //... void stop(); “car.cpp” hoặc “car.cc” //... void turnLeft(); Quy ước đặt khai báo/định nghĩa của lớp trong private: file trùng tên lớp được chấp nhận rộng rãi trong int vin; //... C++ string make; //... string model; //... là quy tắc bắt buộc đối với các lớp của Java string color; //... }; #endif 31 32 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 8
  9. Định nghĩa các phương thức Định nghĩa các phương thức Định nghĩa của các phương thức cần đặt trong 1 file Khi định nghĩa một phương thức, ta cần sử dụng toán tử nguồn trùng tên với tên lớp phạm vi để trình biên dịch hiểu đó là phương thức của một lớp cụ thể chứ không phải một hàm thông thường File bắt đầu với các lệnh #include và có thể có các khai khác báo using cho các namespace Ví dụ, định nghĩa phương thức drive của lớp Car được viết Bên cạnh việc include các thư viện C++ cần thiết, ta con Toán tử định phạm vi như sau phải include header file chứa khai báo lớp // car.cpp ... // car.cpp void Car::drive(int speed, int distance) #include { #include //method definition #include “car.h” } using namespace std; Tên lớp ... Tên phương thức 33 34 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Định nghĩa các phương thức Danh sách khởi tạo thành viên Tương đương việc gán giá trị dữ liệu thành viên. Vậy cấu trúc của file nguồn lớp Car có thể như sau: class Image { Image class Point { public: int xVal, yVal; Image(const int w, const int h); // car.cpp public: private: Point (int x, int y) { #include int width; xVal = x; int height; #include //... yVal = y; }; } #include “car.h” Image::Image(const int w, const int h) { // …………………… width = w; void Car::drive(int speed, int distance) {…} }; height = h; //..................... void Car::stop() {…} } Point::Point (int x, int y) void Car::turnLeft() {…} : xVal(x), yVal(y) Image::Image (const int w, const int h) {} : width(w), height(h) { //............... } 35 36 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 9
  10. Thành viên hằng Thành viên hằng Thành viên dữ liệu hằng: Hằng đối tượng: không được thay đổi giá trị. 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ủ. 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á class Image { Image public: trị của đối tượng chủ) Image(const int w, const int h); Khai báo bình thường Không được thay đổi giá trị dữ liệu thành viên. private: như 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 để const int width; const int height; báo với trình biên dịch, vừa để tự gợi nhớ. //... }; class Set { void main() { Set public: const Set s; class Image { Image Set(void){ card = 0; } s.AddElem(10); // SAI const int width = 256; Khởi tạo Bool Member(const int) const; const int height = 168; s.Member(10); // ok SAI void AddElem(const int); //... //... }; } }; Image::Image (const int w, const int h) Bool Set::Member (const int elem) const Khởi tạo ĐÚNG : width(w), height(h) thông qua danh sách { //... { //................ } khởi tạo thành viên } 37 38 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Thành viên tĩnh Thành viên tĩnh - Ví dụ Thành viên dữ liệu tĩnh: Đếm số đối tượng MyClass Dùng chung 1 bản sao chép (1 vùng nhớ) chia sẻ khai báo lớp MyClass cho tất cả đối tượng của lớp đó. Sử dụng: :: class MyClass { Thường dùng để đếm số lượng đối tượng. public: MyClass(); // Constructor ~MyClass(); // Destructor class Window { Window // danh sách liên kết tất cả Window void printCount();//Output current value of count static Window *first; Khai báo private: // con trỏ tới window kế tiếp static int count;//static member to store Window *next; //number of instances of MyClass //... Khởi tạo }; }; dữ liệu thành viên Window *Window:: Window::first = &myWindow; tĩnh // ……………. 39 40 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 10
  11. Thành viên tĩnh - Ví dụ Thành viên tĩnh Định nghĩa và khởi tạo Cài đặt các phương thức thành viên tĩnh được lưu trữ độc lập với các thể int MyClass::count = 0; hiện của lớp, do đó, các thành viên tĩnh phải MyClass::MyClass() { this->count++; // Increment the static count được định nghĩa } int MyClass::count; MyClass::~MyClass() { this->count--; // Decrement the static count ta thường định nghĩa các thành viên tĩnh trong } void MyClass::printCount() { file chứa định nghĩa các phương thức cout PrintCount(); static const phải được khởi tạo khi khai báo y->PrintCount(); delete x; int main() { class MyClass { There are currently 1 instance(s) of MyClass. MyClass x; public: y->PrintCount(); There are currently 2 instance(s) of MyClass. MyClass y; MyClass(); } There are currently 2 instance(s) of MyClass. MyClass z; ~MyClass(); There are currently 1 instance(s) of MyClass. } 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 43 44 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 11
  12. Thành viên hằng tĩnh Thành viên tĩnh Hàm thành viên tĩnh: Tóm lại, ta nên khai báo: Tương đương với hàm toàn cục. static Phương thức tĩnh không được truyền con trỏ this làm tham số đối với các thành viên dữ liệu ta muốn dùng chung ẩn. cho mọi thể hiện của một lớp Không thể sửa đổi các thành viên dữ liệu từ trong phương thức tĩnh. const Gọi thông qua: :: đối với các thành viên dữ liệu cần giữ nguyên giá class Window { Window Khai báo trị trong suốt thời gian sống của một thể hiện // ………. Định nghĩa static void PaintProc () { ….. } hàm thành static const // ……… viên tĩnh }; đối với các thành viên dữ liệu cần giữ nguyên void main() { // ……………. cùng một giá trị tại tất cả các đối tượng của một Truy xuất Window::PainProc(); Window:: hàm thành lớp } viên tĩnh 45 46 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Thành viên tĩnh Thành viên tham chiếu Hàm thành viên tĩnh: ví dụ Tham chiếu dữ liệu thành viên: class MyClass { public: class Image { MyClass(); // Constructor Khai báo bình thường int width; ~MyClass(); // Destructor như dữ liệu thành viên int height; static void printCount();//Output current value of count int &widthRef; private: //... static int count; // count }; }; int main() class Image { { int width; There are currently 0 instance(s) of MyClass. MyClass::printCount(); int height; Khởi tạo There are currently 1 instance(s) of MyClass. MyClass* x = new MyClass; int &widthRef = width; SAI There are currently 2 instance(s) of MyClass. x->printCount(); //... There are currently 2 instance(s) of MyClass. MyClass* y = new MyClass; }; There are currently 1 instance(s) of MyClass. x->printCount(); y->printCount(); Image::Image (const int w, const int h) Khởi tạo ĐÚNG delete x; : widthRef(width) thông qua danh sách MyClass::printCount(); { //……………... } khởi tạo thành viên } 47 48 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 12
  13. Mảng các đối tượng Thành viên là đối tượng của 1 lớp Dữ liệu thành viên có thể có kiểu: Sử dụng hàm xây dựng không đối số (hàm xây dựng mặc nhiên - default constructor). Dữ liệu (lớp) chuẩn của ngôn ngữ. VD: Point pentagon[5]; Lớp do người dùng định nghĩa (có thể là chính lớp đó). Sử dụng bộ khởi tạo mảng: class Point { ……. }; class Rectangle { Rectangle VD: Point triangle[3] = public: { Point(4,8), Point(10,20), Point(35,15) }; Rectangle (int left, int top, int right, int bottom); Khởi tạo cho các //... Ngắn gọn: dữ liệu thành viên private: qua danh sách Point topLeft; Set s[4] = { 10, 20, 30, 40 }; khởi tạo thành viên Point botRight; tương đương với: }; Rectangle::Rectangle (int left, int top, int right, int bottom) Set s[4] = { Set(10), Set(20), Set(30), Set(40) }; : topLeft(left,top), botRight(right,bottom) {} 49 50 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Mảng các đối tượng Phạm vi lớp Sử dụng dạng con trỏ: Thành viên trong 1 lớp: Cấp vùng nhớ: Che các thực thể trùng tên trong phạm vi. VD: Point *pentagon = new Point[5]; Thu hồi vùng nhớ: // ……… int fork (void); // fork hệ thống delete[] pentagon; class Process { Process delete pentagon; // Thu hồi vùng nhớ đầu int fork (void); // fork thành viên fork thành viên //... che đi fork toàn cục }; trong phạm vi lớp class Polygon { Polygon Process Không cần biết public: kích thước mảng. // ……… //... int Process::func1 (void) private: { int x = fork(); // gọi fork cục bộ Point *vertices; // các đỉnh int pid = ::fork(); // gọi hàm fork hệ thống int nVertices; // số các đỉnh //... }; } 51 52 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 13
  14. Phạm vi lớp Cấu trúc và hợp Lớp toàn cục: đại đa số lớp trong C++. Cấu trúc (structure): Bắt nguồn từ ngôn ngữ C. Lớp lồng nhau: lớp chứa đựng lớp. Tương đương với class với các thuộc tính là public. Lớp cục bộ: trong 1 hàm hoặc 1 khối. Sử dụng như class. class Rectangle { // Lớp lồng nhau void Render (Image &i) Rectangle public: { class Point { Point struct Point { Rectangle (int, int, int, int); class ColorTable { ColorTable public: Point (int, int); //.. public: Point(int, int); private: ColorTable () { /* ... */ } void OffsetPt(int, int); void OffsetPt(int, int); class Point { AddEntry (int r, int g, int b) int x, y; public: int x, y; { /* ... */ } Point(int a, int b) { … } }; //... }; private: }; int x, y; ColorTable colors; }; //... Point topLeft, botRight; Point p = { 10, 20 }; Có thể khởi tạo dạng này } }; nếu không có định nghĩa Rectangle::Point pt(1,1); // sd ở ngoài ColorTable ct; // SAI hàm xây dựng 53 54 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Cấu trúc và hợp Các trường bit Điều khiển đối tượng ở mức bit. Hợp (union): VD: Truy xuất các bit trong header của gói tin. Tất cả thành viên ánh xạ đến cùng 1 địa chỉ bên trong đối tượng chính nó (không liên tiếp). typedef unsigned int Bit; Kích thước = kích thước của dữ liệu lớn nhất. class Packet { Packet Bit type : 2; // rộng 2 bit union Value { class Object { Value Object Bit acknowledge : 1; // rộng 1 bit long integer; private: Bit channel : 4; // rộng 4 bit double real; enum ObjType {intObj, realObj, Bit sequenceNo : 4; // rộng 4 bit char *string; strObj, listObj}; Bit moreData : 1; // rộng 1 bit Pair list; ObjType type; // kiểu đối tượng //... //... Value val; // giá trị của đối tượng }; // ………… }; //... enum PacketType { dataPack, controlPack, Packet p; }; supervisoryPack }; p.type = controlPack; class Pair { Pair enum Bool { false, true }; p.acknowledge = true; Value *head; Value *tail; Kích thước của Value là //... 8 bytes = sizeof(double) }; 55 56 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 14
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
3=>0