Con trỏđối tượng là con trỏ trỏđến địa chỉ của một đối tượng có kiểu lớp. Các thao tác liên quan đến con trỏđối tượng bao gồm:
• Khai báo con trỏđối tượng
• Cấp phát bộ nhớ cho con trỏđối tượng
• Sử dụng con trỏđối tượng
• Giải phóng bộ nhớ cho con trỏđối tượng
Khai báo con trỏđối tượng
Con trỏđối tượng được khai báo tương tự như khai báo các con trỏ có kiểu thông thường:
<Tên lớp> *<Tên con trỏ đối tượng>;
Ví dụ, muốn khai báo một con trỏđối tượng có kiểu của lớp Car, ta khai báo như sau:
Car *myCar;
Khi đó, myCar là một con trỏđối tượng có kiểu lớp Car.
Cấp phát bộ nhớ cho con trỏđối tượng
Con trỏđối tượng cũng cần phải cấp phát bộ nhớ hoặc trỏ vào một địa chỉ của một đối tượng lớp xác định trước khi được sử dụng. Cấp phát bộ nhớ cho con trỏđối tượng cũng bằng thao tác new:
Ví dụ, nếu lớp Car có hai hàm khởi tạo như sau:
class Car{ public:
Car();
Car(int, char[], float); };
thì ta có thể cấp phát bộ nhớ theo hai cách, tương ứng với hai hàm khởi tạo của lớp:
myCar = new Car(); // Khởi tạo không tham số myCar = new Car(100, “Ford”, 3000); // Khởi tạo đủ tham số
Lưu ý:
• Các đối số truyền phải tương ứng với ít nhất một trong các hàm khởi tạo của lớp.
• Khi sử dụng hàm khởi tạo không có tham số, ta vẫn phải sử dụng cặp ngoặc đơn “()” trong thao tác new.
• Khi lớp không có một hàm khởi tạo tường minh nào, sẽ dùng hàm khởi tạo ngầm định của C++ và cú pháp tương tự như sử dụng hàm khởi tạo tường minh không có tham số.
• Có thể vừa khai báo, vừa cấp phát bộ nhớ cho con trỏđối tượng. Ví dụ:
Car myCar = new Car(); // Khởi tạo không tham số
Sử dụng con trỏđối tượng
Con trỏđối tượng được sử dụng qua các thao tác:
• Trỏđến địa chỉ của một đối tượng cùng lớp
• Truy nhập đến các phương thức của lớp
Con trỏđối tượng có thể trỏđến địa chỉ của một đối tượng có sẵn, cùng lớp theo cú pháp sau:
<Tên con trỏ đối tượng> = &<Tên đối tượng có sẵn>;
Ví dụ, ta có một con trỏ và một đối tượng của lớp Car:
Car *ptrCar, myCar(100, “Ford”,3000);
Khi đó, có thể cho con trỏ ptrCar trỏ vào địa chỉ của đối tượng myCar như sau:
ptrCar = &myCar;
Khi muốn truy nhập đến các thành phần của con trỏđối tượng, ta dùng cú pháp sau:
<Tên con trỏ đối tượng> -> <Tên thành phần lớp>([<Các đối số>]);
Ví dụ, đoạn chương trình sau sẽ thực hiện phương thức giới thiệu xe của lớp Car thông qua con trỏ ptrCar:
Car *ptrCar = new Car(100, “Ford”,3000); ptrCar->show();
Lưu ý:
• Danh sách các đối số phải tương thích với tên phương thức tương ứng.
• Các quy tắc phạm vi truy nhập vẫn áp dụng trong truy nhập các thành phần lớp thông qua con trỏ.
Giải phóng bộ nhớ cho con trỏđối tượng
Con trỏđối tượng cũng được giải phóng thông qua thao tác delete:
delete <Tên con trỏ đối tượng>;
Ví dụ:
Car *ptrCar = new Car();// Khai báo và cấp phát bộ nhớ … // Sử dụng con trỏ ptrCar delete ptrCar; // Giải phóng bộ nhớ.
Lưu ý:
• Thao tác delete chỉ được dùng khi trước đó, con trỏ được cấp phát bộ nhớ qua thao tác
new:
Car *ptrCar = new Car();
delete ptrCar; // Đúng.
Nhưng không được dùng delete khi trước đó, con trỏ chỉ trỏ vào một địa chỉ của đối tượng có sẵn (tĩnh):
Car *ptrCar, myCar(100, “Ford”, 3000); ptrCar = &myCar;
delete ptrCar; // Không được
Chương trình 5.6 minh họa việc dùng con trỏđối tượng có kiểu lớp là Car.
Chương trình 5.6 #include<stdio.h> #include<conio.h> #include<string.h> /* Định nghĩa lớp */ class Car{ private: int speed; // Tốc độ char mark[20]; // Nhãn hiệu float price; // Giá xe public:
// Khởi tạo với các giá trị ngầm điịnh cho các tham số Car(int speedIn=0, char markIn[]=””, float priceIn=0); void show(); // Giới thiệu xe
};
/* Khai báo phương thức bên ngoài lớp */
Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn;
strcpy(mark, markIn); price = priceIn;
}
void Car::show(){ // Phương thức giới thiệu xe cout << “This is a ” << mark << “ having a speed of ”
<< speed << “km/h and its price is $” << price << endl; return;
}
// Hàm main, chương trình chính void main(){
clrscr();
// Khai báo con trỏ, cấp phát bộ nhớ dùng hàm khởi tạo đủ tham số Car *myCar = new Car(150, “Mercedes”, 5000);
// Giới thiệu xe
cout << “Gioi thieu xe: ” << endl; myCar->show();
// Giải phóng con trỏ delete myCar;
return; }
Chương trình 5.6 hiển thị ra thông báo là một lời giới thiệu xe;
Gioi thieu xe:
This is a Mercedes having a speed of 150km/h and its price is $5000