Con trỏ đối tượng

Một phần của tài liệu Tài liệu NGÔN NGỮ LẬP TRÌNH C++ (Dùng cho sinh viên) docx (Trang 104 - 107)

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.

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

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ỏ.

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

<< 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 Tài liệu NGÔN NGỮ LẬP TRÌNH C++ (Dùng cho sinh viên) docx (Trang 104 - 107)