Mảng con trỏ và tham chiếu

35 4.3K 5
Mảng con trỏ và tham chiếu

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài giảng lập trình hướng đối tượng - Thầy Cường Học viện bưu chính viễn thông TP HCM

Chương 3 Mảng , Con trỏ Tham chiếu • Mảng các đối tượng • Con trỏ đối tượng • Con trỏ this • Toán tử new delete • Tham chiếu (reference) • Truyền tham chiếu cho đối tượng • Trả về các tham chiếu • Các tham chiếu độc lập các hạn chế Chương 3 Mảng, Con trỏ, Tham chiếu 6868 Chương 3 Mảng, Con trỏ, Tham chiếu 6969 I/ Mảng các đối tượng Các đối tượng chính là các biến , có các khả năng thuộc tính như các biến thông thường khác. Do đó, các đối tượng có thể tổ chức thành mảng. Cú pháp khai báo một mảng các đối tượng hoàn toàn giống như ngôn ngữ C. Việc truy cập mảng các đối tượ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 đối tượ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 đối tượng int i; for(i=0; i<4; i++) ob[i].set_a(i); // truy cập mảng đối tượ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 đối tượ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ương 3 Mảng, Con trỏ, Tham chiếu 7070 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 đối tượ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ương 3 Mảng, Con trỏ, Tham chiếu 7171 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 đối tượ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ương 3 Mảng, Con trỏ, Tham chiếu 7272 Bài tập I 1. Dùng khai báo lớp sau đây để tạo mảng 10 phần tử 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ử khởi đầu num với các giá trò từ 1 đến 10 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ỏ đối tượng Các đối tượ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ỏ đối tượ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 đối tượng, dùng toán tử & đặt trước đối tượng. Ví dụ p = &ob; Chương 3 Mảng, Con trỏ, Tham chiếu 7373 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ỏ đối tượng không tạo ra một đối tượng, nó chỉ tạo ra một con trỏ trỏ về đối tượng. Chương 3 Mảng, Con trỏ, Tham chiếu 7474 • Số học con trỏ : + Khi tăng con trỏ đối tượng, nó sẽ trỏ đến đối tượng tiếp theo. + Khi giảm con trỏ đối tượng, nó sẽ trỏ đến đối tượ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ương 3 Mảng, Con trỏ, Tham chiếu 7575 Bài tập II 1. Hãy viết lại ví dụ 2.2 chương 3 để 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ương 3 để 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 nó là con trỏ tới đối tượng tạo ra lời gọi hàm. Ví dụ, cho câu lệnh ob.f1() ; // ob là đối tượng Hàm f1() tự động được truyền con trỏ ob là đối tượ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ả đối tượ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ương 3 Mảng, Con trỏ, Tham chiếu 7676 { // 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ề đối tượng tạo ra lời gọi. Chương trì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) [...]... chứng tỏ cách con trỏ được dùng như một tham số để tạo ra một cơ chế truyền tham số gọi bằng tham chiếu . • Quá trình trên có thể thực hiện tự động bằng cách dùng tham số tham chiếu Chương 3 Mảng , Con trỏ Tham chiếu • Mảng các đối tượng • Con trỏ đối tượng • Con trỏ this • Toán tử new delete • Tham chiếu (reference) • Truyền tham chiếu cho đối... là các tham số của hàm. • Chương trình có một tham chiếu độc lập Chương 3 Mảng, Con trỏ, Tham chiếu 86 86 1/ Một tham chiếu là một con trỏ ẩn tác động như một tên khác đối với một biến. Khai báo : data_type & var Cách sử dụng : + Một tham chiếu có thể được truyền cho hàm (gọi là tham số tham chiếu ) . + Một tham chiếu có thể được trả về bởi hàm. + Một tham chiếu. .. biến khác. Tham chiếu độc lập phải được khởi đầu khi khai báo, do các tham chiếu không thể được gán những giá trị mới. Các lập trình viên thường ít sử dụng tham chiếu độc lập. 2/ Một số hạn chế + không thể tham chiếu đến một tham chiếu khác. + không thể có điạ chỉ của tham chiếu. + không thể tạo một mảng các tham chiếu + không thể tham chiếu một trường bit. + các tham chiếu phải được... động dùng biến được trỏ tới bởi tham số tham chiếu. Không cầân dùng ký tự *. Do đó, một tham số tham chiếu hoàn toàn thực hiện tự động cơ chế truyền đối số bằng cách gọi tham chiếu. • Không thể thay đổi những gì mà một tham chiếu trỏ tới. 3/ Ưu điểm của tham số tham chiếu Chương 3 Mảng, Con trỏ, Tham chiếu 78 78 { int t; t = add(); // call member function cout << t <<... phát ñoäng. Chương 3 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ương 3 để 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ương 3 để 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 nó là con trỏ tới đối tượng tạo ra... set_ij(int a, int b) { i=a; j=b; } Chương 3 Mảng, Con trỏ, Tham chiếu 88 88 + Từ quan điểm thực hành, không cần nhớ truyền điạ chỉ của một đối số . + Tham số tham chiếu tạo ra một giao diện đẹp hơn so với cách dùng cơ chế con trỏ. + Khi một đối tượng được truyền cho một hàm như một tham chiếu thì không có bản sao được thực hiện. • Dùng các tham chiếu để trao đổi 2 đối số nguyên Ví dụ... Hàm f1() tự động được truyền con trỏ ob là đối tượ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... được cấp phát động Chương 3 Mảng, Con trỏ, Tham chiếu 98 98 Bài tập VII 1. Hãy viết chương trình tạo mảng an toàn hai chiều 2x3 các số nguyên. 2. Đoạn chương trình sau có đúng không ? Taïi sao ? int &f(); . . . int *x; x = f(); VIII/ Caùc tham chiếu độc lập các hạn chế 1/ Tham chiếu độc lập (independent reference) là một biến tham chiếu có tác dụng chỉ là một... 0; } @ Vieäc tạo ra một con trỏ đối tượng không tạo ra một đối tượng , nó chỉ tạo ra một con trỏ trỏ về đối tượng. Chương 3 Mảng, Con trỏ, Tham chiếu 92 92 { myclass x(1); f(x); return 0; } Kết quả của chương trình Constructing 1 Received 1 Destructing 1 Destructing 1 Giải thích kết quả ? • Truyền đối tượng bằng tham chiếu cho hàm được gọi f() Ví... biến tham chiếu f() được khai báo như một tham số tham chiếu, điạ chỉ đối với số được truyền tự động cho f(). 2/ Đặc tính • Khi sử dụng tham số tham chiếu , trình biên dịch sẽ tự động truyền địa chỉ của biến được dùng như đối số. Không cần tạo ra điạ chỉ của đối số bằng cách đặt trước nó ký tự &. • Bên trong hàm, trình biên dịch tự động dùng biến được trỏ tới bởi tham số tham chiếu. . Chương 3 Mảng , Con trỏ và Tham chiếu • Mảng các đối tượng • Con trỏ đối tượng • Con trỏ this • Toán tử new và delete • Tham chiếu (reference). • Truyền tham chiếu cho đối tượ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 Mảng, Con trỏ, Tham chiếu

Ngày đăng: 21/08/2012, 15:34

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan