Lập trình C++ - Con trỏ đối tượng

Con trỏ đối tượng 

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: 

<Tên con trỏ đối tượng> = new <Tên lớp>([<Các đối số>]); 


Ví dụ, nếu lớp Car có hai hàm khởi tạo như sau: 

class Car{ 
  public: 
      Car(); 
      Car(int, string, 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 

     

Ví dụ: Dùng con trỏ đối tượng có kiểu lớp là Car. 

#include<iostream>
#include<string>

using namespace std;
/* Định nghĩa lớp */
class Car {
private:
	int  speed;               // Tốc độ  
	string  mark;           // Nhãn hiệu
	float price;               // Giá xe 
public:	
			Car(int, string, float);// Khởi tạo thông tin về xe
	void	show();               // Hiển thị thông tin về xe
};

/* Khai báo phương thức bên ngoài lớp */
 Car::Car(int speed, string mark, float price) {
	this->speed = speed;
	this->mark = mark;
	this->price = price;
	return;
}

void Car::show() {                // Phương thức hiển thị xe
	cout << "This is a" << mark << "having a speed of  " << speed << "km/h and its price is $" << price << endl;
	return;
}

// Hàm main, chuong trình chính 
int main() {

	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; 
	system("pause");
	return 0;
}

Kết quả:

Gioi thieu xe :
This is aMercedeshaving a speed of  150km/h and its price is $5000