Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 35 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
35
Dung lượng
61,88 KB
Nội dung
Chương3 Mảng , Con trỏ và Tham chiếu • Mảng các đốitượng • Con trỏ đốitượng • Con trỏ this • Toán tử new và delete • Tham chiếu (reference) • Truyền tham chiếu cho đốitượng • Trả về các tham chiếu • Các tham chiếu độc lập và các hạn chế Chöông 3 Maûng, Con troû, Tham chieáu 68 68 Chương3 Mảng, Con trỏ, Tham chiếu 69 69 I/ Mảng các đốitượng Các đốitượng chính là các biến , có các khả năng và thuộc tính như các biến thông thường khác. Do đó, các đốitượng có thể tổ chức thành mảng. Cú pháp khai báo một mảng các đốitượng hoàn toàn giống như ngôn ngữ C. Việc truy cập mảng các đốitượng cũng giống như mảng của các loại biến khác. Ví dụ 1.1 Mảng các đốitượng #include <iostream.h> class samp { int a; public: void set_a(int n) { a = n; } int get_a() { return a; } }; int main() { samp ob[4] ; // khai báo mảng đốitượng int i; for(i=0; i<4; i++) ob[i]. set_a(i); // truy cập mảng đốitượng for(i=0; i<4; i++) cout << ob[i].get_a( ); return 0; } • Nếu kiểu lớp có hàm tạo, thì mảng đốitượng có thể được khởi đầu . Ví dụ 1.2 // Initialize an array. #include <iostream.h> class samp { int a; public: samp(int n) { a = n; } Chương3 Mảng, Con trỏ, Tham chiếu 70 70 int get_a() { return a; } }; int main() { samp ob[4] = { -1, -2, -3, -4 } ; int i; for(i=0; i<4; i++) cout << ob[i].get_a() << ' '; return 0; } @ Một cách viết khác (dài hơn) samp ob[4] = { samp(-1), samp(- 2), samp(-3), samp(- 4) }; @ Cách khởi đầu ở trên chỉ làm việc với các mảng có hàm tạo chỉ nhận một đối số . • Khởi đầu mảng đốitượng nhiều chiều. Ví dụ 1.3 // Create a two-dimensional array of objects. #include <iostream.h> class samp { int a; public: samp(int n) { a = n; } int get_a() { return a; } }; int main() { samp ob[4][2] = { 1, 2, 3, 4, 5, 6, 7, 8 }; int i; Chương3 Mảng, Con trỏ, Tham chiếu 71 71 for(i=0; i<4; i++) { cout << ob[i][0]. get_a() << ' '; cout << ob[i][1]. get_a() << "\n"; } return 0; } • Khi khởi đầu một mảng đốitượng có hàm tạo nhận nhiều đối số , cần phải dùng dạng khởi đầu khác. Vídụ 1.4 #include <iostream.h> class samp { int a, b; public: samp(int n, int m) { a = n; b = m; } int get_a() { return a; } int get_b() { return b; } }; int main() { samp ob[4][2] = { samp(1, 2), samp(3, 4), samp(5, 6), samp(7, 8), samp(9, 10), samp(11, 12), samp(13, 14), samp(15, 16) } ; int i; for(i=0; i<4; i++) { cout << ob[i][0]. get_a() << ' '; cout << ob[i][0]. get_b() << "\n"; cout << ob[i][1]. get_a() << ' '; cout << ob[i][1]. get_b() << "\n"; } return 0; } Chương3 Mảng, Con trỏ, Tham chiếu 72 72 Bài tập I 1. Dùng khai báo lớp sau đây để tạo mảng 10 phần tử và khởi đầu phần tử ch với các giá trò từ A đến J. Hãy chứng tỏ mảng chứa các giá trò này. #include <iostream.h> class letters { char ch; public: letters(char c) { ch = c; } char get_ch() { return ch; } }; 2. Dùng khai báo lớp sau đây để tạo mảng 10 phần tử và khởi đầu num với các giá trò từ 1 đến 10 và hãy khởi đầu spr đối với bình phương của num. #include <iostream.h> class squares { int num, sqr; public: squares(int a, int b) { num = a; sqr = b; } void show() {cout << num << ' ' << sqr << "\n"; } }; II/ Con trỏ đốitượng Các đốitượng có thể được truy cập thông qua con trỏ, toán tử -> sẽ được dùng. Khai báo một con trỏ đốitượng giống như khai báo một con trỏ hướng về kiểu biến bất kỳ. Ví dụ samp *p; Để có điạ chỉ của một đốitượng , dùng toán tử & đặt trước đối tượng. Ví dụ p = &ob; Chương3 Mảng, Con trỏ, Tham chiếu 73 73 Ví dụ 2.1 #include <iostream.h> class myclass { int a; public: myclass(int x); // constructor int get(); }; myclass::myclass(int x) { a = x; } int myclass::get() { return a; } int main() { myclass ob(120); // create object myclass *p ; // create pointer to object p = &ob ; // put address of ob into p cout << "Value using object: " << ob.get() << "\n" ; cout << "Value using pointer: " << p->get() ; return 0; } @ Việc tạo ra một con trỏ đốitượng không tạo ra một đốitượng , nó chỉ tạo ra một con trỏ trỏ về đối tượng. Chương3 Mảng, Con trỏ, Tham chiếu 74 74 • Số học con trỏ : + Khi tăng con trỏ đốitượng , nó sẽ trỏ đến đốitượng tiếp theo. + Khi giảm con trỏ đốitượng , nó sẽ trỏ đến đốitượng đứng trước. Ví dụ 2.2 // Pointers to objects. #include <iostream.h> class samp { int a, b; public: samp(int n, int m) { a = n; b = m; } int get_a() { return a; } int get_b() { return b; } }; int main() { samp ob[4] = { samp(1, 2), samp(3, 4), samp(5, 6), samp(7, 8) }; int i; samp *p; p = ob ; // get starting address of array for(i=0; i<4; i++) { cout << p->get_a() << ' '; cout << p->get_b() << "\n"; p++ ; // advance to next object } return 0; } Chương3 Mảng, Con trỏ, Tham chiếu 75 75 Bài tập II 1. Hãy viết lại ví dụ 2.2 chương3 để cho nó hiển thò nội dung của mảng ob theo thứ tự ngược lại. 2. Hãy viết lại ví dụ 1.3 chương3 để truy cập mảng hai chiều qua con trỏ. III/ Con trỏ this this là con trỏ được truyền tự động cho bất kỳ hàm thành viên nào khi được gọi và nó là con trỏ tới đốitượng tạo ra lời gọi hàm. Ví dụ, cho câu lệnh ob.f1() ; // ob là đốitượng Hàm f1() tự động được truyền con trỏ ob là đốitượng tạo ra lời gọi hàm. Con trỏ này được xem là this . Chỉ có các hàm thành viên được truyền con trỏ this. Hàm friend không có con trỏ this . Con trỏ this có nhiều sử dụng, kể cả việc giúp quá tải các toán tử. • Khi một hàm thành viên tham chiếu một hàm thành viên khác của lớp, nó thực hiện mà không xác đònh tham chiếu với hoặc một lớp hoặc một đặc tả đốitượng . Ví dụ 3.1 // Demonstrate the this pointer. #include <iostream.h> #include <string.h> class inventory { char item[20]; double cost; int on_hand; public: inventory(char *i, double c, int o) Chương3 Mảng, Con trỏ, Tham chiếu 76 76 { // tham chiếu trực tiếp các biến item[], cost, on_hand strcpy(item, i); cost = c; on_hand = o; } void show(); }; void inventory::show() { cout << item; cout << ": $" << cost; cout << " On hand: " << on_hand << "\n"; } int main() { inventory ob("wrench", 4.95, 4); ob.show(); return 0; } • Khi một hàm thành viên được gọi, nó tự động được truyền con trỏ this trỏ về đốitượng tạo ra lời gọi . Chươngtrình có thể viết lại : Ví dụ 3.2 #include <iostream.h> #include <string.h> class inventory { // Demonstrate the this pointer. char item[20]; double cost; int on_hand; public: inventory(char *i, double c, int o)