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ỏ 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 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
và 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ử
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ỏ đố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
và 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ỏ 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... 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 8686 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 7878 { int t; t = add(); // call member function cout << t <<... phát ñoäng. 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
và 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 8888 + 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 9898 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
và 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 9292 { 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