Con trỏ đối tượng

Một phần của tài liệu Bài giảng Ngôn ngữ lập trình C++: Phần 1 - TS. Nguyễn Duy Phương (Trang 125 - 129)

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

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, 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

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: (adsbygoogle = window.adsbygoogle || []).push({});

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):

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; char mark[20]; // Tốc độ // 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 */ (adsbygoogle = window.adsbygoogle || []).push({});

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

Một phần của tài liệu Bài giảng Ngôn ngữ lập trình C++: Phần 1 - TS. Nguyễn Duy Phương (Trang 125 - 129)