Các lớp
lượt xem 11
download
Các lớp Lớp là một phương thức logic để tổ chức dữ liệu và các hàm trong cùng một cấu trúc. Chúng được khai báo sử dụng từ khoá class, từ này có chức năng tương tự với từ khoá của C struct nhưng có khả năng gộp thêm các hàm thành viên. Dạng thức của nó như sau: class class_name { permission_label_1: member1; permission_label_2: member2; ... } object_name; trong đó class_name là tên của lớp ( kiểu người dùng tự định nghĩa) và trường mặc định object_name là một hay một vài tên đối tượng hợp lệ. Phần thân của...
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Các lớp
- Các lớp Lớp là một phương thức logic để tổ chức dữ liệu và các hàm trong cùng một cấu trúc. Chúng được khai báo sử dụng từ khoá class, từ này có chức năng tương tự với từ khoá của C struct nhưng có khả năng gộp thêm các hàm thành viên. Dạng thức của nó như sau: class class_name { permission_label_1: member1; permission_label_2: member2; ... } object_name; trong đó class_name là tên của lớp ( kiểu người dùng tự định nghĩa) và trường mặc định object_name là một hay một vài tên đối tượng hợp lệ. Phần thân của khai báo chứa các thành viên của lớp, đó có thể là dữ liệu hay các hàm và có thể là các nhãn cho phép ( permission labels) là một trong những từ khoá sau đây: private:, public: hoặc protected:. • Các thành viên private của một lớp chỉ có thể được truy xuất từ các thành viên khác của lớp hoặc từ các lớp "bạn bè". • Các thành viên protected có thể được truy xuất từ các thành viên trong cùng một lớp và các lớp bạn bè, thêm vào đó là từ các thành viên của các lớp thừa kế • Cuối cùng, các thành viên public có thể được truy xuất từ bất kì chỗ nào mà lớp nhìn thấy. Nếu chúng ta khai báo các thành viên của một lớp trước khi thêm vào các nhãn cho phép thì các thành viên đó được coi là private. Ví dụ: class CRectangle { int x, y; public: void set_values (int,int); int area (void); } rect;
- Khai báo lớp CRectangle và một đối tượng có tên rect có kiểu là lớp CRectangle. Lớp này chứa bốn thành viên: hai viến có kiểu int (x và y) trong phần private (vì private là sự cho phép mặc định) và hai hàm trong phần public: set_values() và area(), ở đây chúng ta chỉ mới khai báo mẫu. Hãy chú ý sự khác biệt giữa tên lớp và tên đối đối tượng: Trong ví dụ trước, CRectangle là tên lớp còn rect là tên một đối tượng có kiểu CRectangle. Trong các phần tiếp theo của chương trình chúng ta có thể truy xuất đến các thành viên public của đối tượng rect như là đối với các hàm hay các biến thông thường bằng cách đặt tên của đối tượng rồi sau đó là một dấu chấm và tên thành viên của lớp (như chúng ta đã làm với các cấu trúc của C). Ví dụ: rect.set_value (3,4); myarea = rect.area(); nhưng chúng ta không có khả năng truy xuất đến x hay y vì chúng là các thành viên private của lớp và chúng chỉ có thể được truy xuất từ các thành viên của cùng một lớp. Bối rối? Đây là ví dụ đầy đủ về lớp CRectangle: // classes example area: 12 #include class CRectangle { int x, y; public: void set_values (int,int); int area (void) {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a; y = b; } int main () { CRectangle rect; rect.set_values (3,4); cout
- rect.area(); } Một điều mới trong đoạn mã này là toán tử phạm vi :: được dùng trong khai báo set_values(). Nó được sử dụng để khai báo ở bên ngoài các thành viên của một lớp. Chú ý rằng chúng ta đã định nghĩa đầy đủ hàm area() ngay bên trong lớp trong khi hàm set_values() mới chỉ được khai báo mẫu còn định nghĩa của nó nằm ở ngoài lớp. Trong phần khai báo ở ngoài này chúng ta bắt buộc phải dùng toán tử ::. Sự khác biệt duy nhất giữa việc khai báo đầy đủ một hàm bên trong lớp và việc chỉ khai báo mẫu là trong trường hợp thứ nhất hàm sẽ được tự động coi là inline bởi trình dịch, còn trong trường hợp thứ hai nó sẽ là một hàm thành viên bình thường. Lý do khiến chúng ta khai báo x và y là các thành viên private vì chúng ta đã định nghĩa một hàm để thâótc với chúng (set_values()) và không có lý do gì để truy nhập trực tiếp đến các biến này. Có lẽ trong ví dụ rất đơn giản này bạn không thấy được một tiện ích lớn khi bảo vệ hai biến này nhưng trong các dự án lớn hơn nó có thể là rất quan trọng khi đảm bảo được rằng các giá trị đó không bị thay đổi một cách không mong muốn. Một ích lợi nữa của lớp là chúng ta có thể khai báo một vài đối tượng khác nhau từ nó. Ví dụ, tiếp sau đây là ví dụ trước về lớp CRectangle, tôi chỉ thêm phần khai báo thêm đối tượng rectb. // class example rect area: 12 #include rectb area: 30 class CRectangle { int x, y; public: void set_values (int,int); int area (void) {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a;
- y = b; } int main () { CRectangle rect, rectb; rect.set_values (3,4); rectb.set_values (5,6); cout
- CRectangle (int,int); int area (void) {return (width*height);} }; CRectangle::CRectangle (int a, int b) { width = a; height = b; } int main () { CRectangle rect (3,4); CRectangle rectb (5,6); cout
- Destructor đặc biệt phù hợp khi mà một đối tượng cấp phát bộ nhớ động trong quá trình tồn tại của nó và trong thời điểm bị huỷ bỏ chúng ta muốn giải phóng bộ nhớ mà nó sử dụng. // example on constructors rect area: 12 and destructors rectb area: 30 #include class CRectangle { int *width, *height; public: CRectangle (int,int); ~CRectangle (); int area (void) {return (*width * *height);} }; CRectangle::CRectangle (int a, int b) { width = new int; height = new int; *width = a; *height = b; } CRectangle::~CRectangle () { delete width; delete height; } int main () { CRectangle rect (3,4), rectb (5,6); cout
- Như bất kì hàm nào khác, một constructor có thể được quá tải bởi một vài hàm có cùng tên nhưng khác kiểu hay khác số tham số. Nhớ rằng ở một thời điểm trình dịch chỉ thực hiện một hàm phù hợp (xem phần 2.3, Hàm-II). Do vậy chỉ một hàm constructor phù hợp được gọi vào thời điểm một đối tượng lớp được khai báo. Trong thực tế, khi khai báo một lớp mà chúng ta không chỉ định một hàm constructor nào thì trình dịch sẽ tự động tạo ra hai constructor quá tải ("constructor mặc định" và "copy constructor"). Ví dụ, đối với lớp: class CExample { public: int a,b,c; void multiply (int n, int m) { a=n; b=m; c=a*b; }; }; trình dịch sẽ tự động cho rằng lớp có hai constructor sau: • Constructor rỗng Đây là một constructor không có tham số. Nó chẳng làm gì cả. CExample::CExample () { }; • Copy constructor Đây là một constructor có một tham số cùng kiểu với lớp. Nó thực hiện một việc là gán tất cả các biến thành viên không tĩnh (nonstatic) của lớp giá trị của biến tương ứng của đối tượng tham số. • CExample::CExample (const CExample& rv) { • a=rv.a; b=rv.b; c=rv.c; } Cần phải nhấn mạnh rằng các constructor mặc định này chỉ tồn tại nếu không có constructor được khai báo. Tất nhiên là bạn có thể quá tải constructor của nó để cung cấp các constructor khác nhau cho các mục đích khác nhau: // overloading class rect area: 12 constructors rectb area: 25 #include class CRectangle { int width, height; public: CRectangle ();
- CRectangle (int,int); int area (void) {return (width*height);} }; CRectangle::CRectangle () { width = 5; height = 5; } CRectangle::CRectangle (int a, int b) { width = a; height = b; } int main () { CRectangle rect (3,4); CRectangle rectb; cout
- CRectangle * prect; là một con trỏ trỏ tới một đối tượng của lớp CRectangle. Tương tự với cấu trúc, để tham chiếu trực tiếp tới một thành viên của một đối tượng được trỏ bởi một con trỏ bạn nên dùng toán tử ->. Đây là một ví dụ: // pointer to classes a area: 2 example *b area: 12 #include *c area: 2 d[0] area: 30 class CRectangle { d[1] area: 56 int width, height; public: void set_values (int, int); int area (void) {return (width * height);} }; void CRectangle::set_values (int a, int b) { width = a; height = b; } int main () { CRectangle a, *b, *c; CRectangle * d = new CRectangle[2]; b= new CRectangle; c= &a; a.set_values (1,2); b->set_values (3,4); d->set_values (5,6); d[1].set_values (7,8); cout
- c->area()
CÓ THỂ BẠN MUỐN DOWNLOAD
-
BÁO CÁO XÂY DỰNG MÔ HÌNH 3 LỚP HỆ THỐNG HỌC PHÍ
13 p | 346 | 98
-
LẬP TRÌNH THEO KIẾN TRÚC 3 LỚP
10 p | 289 | 92
-
Động lực học lập trình Java, Phần 1: Các lớp Java và việc nạp các lớp Quan sát các lớp và những gì xảy ra khi chúng được một JVM nạp
13 p | 175 | 52
-
Chương 17: Kế thừa form và tạo các lớp cơ sở
9 p | 412 | 31
-
Thực hành Phân tích thiết kế hướng đối tượng - Bài thực hành 02: Thực hành xây dựng biểu đồ lớp, biểu đồ trạng thái
13 p | 311 | 26
-
Phân lớp đối tượng
1 p | 197 | 20
-
XÂY DỰNG LỚP - ĐỐI TƯỢNG phần 1
10 p | 152 | 17
-
Các lớp .NET Framework
5 p | 96 | 16
-
Quan hệ giữa các lớp
10 p | 162 | 15
-
C# và các lớp cơ sở Reflection – Phần 1
10 p | 115 | 14
-
Phần 2: Ngôn ngữ lập trình C++ Chương 5: Các lớp nhập/xuất trong C++
19 p | 124 | 12
-
Bài giảng Ngôn ngữ lập trình C và C++ (Phần 2: Ngôn ngữ lập trình C++) - Chương 5: Các lớp nhập/xuất trong C++
19 p | 132 | 7
-
Các thành viên ảo - Đa hình
8 p | 128 | 7
-
Hàm và lớp template trong Lập trình hướng đối tượng
6 p | 98 | 6
-
Bài giảng Hướng dẫn lập trình VB.NET - Chương 17: Kế thừa Form và tạo các lớp cơ sở
9 p | 86 | 5
-
Bài giảng Lập trình mạng với Java - Chương 5: Lập trình mạng với các lớp InetAddress, URL và URLConnection
17 p | 72 | 4
-
Bài giảng Lab 8: Xây dụng lớp truy xuất cơ sở dữ liệu
4 p | 40 | 4
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn