Khai báo đối tượng (object) trong lập trình hướng đối tượng (OOP)

Đây là bài 5/19 bài của series môn học Phương pháp lập trình hướng đối tượng

1. Khai báo đối tượng (object)

Sau khi định nghĩa lớp, ta có thể khai báo các biến thuộc kiểu lớp để tạo các đối tượng. Cú pháp như sau:

<Tên_lớp> danh_sách_đối_tượng;
Ví dụ:
Circle c1, c2;

Có thể khai báo các đối tượng khi định nghĩa lớp theo cú pháp sau:

class <Tên_lớp>{
	...
}<danh_sách_đối_tượng>;
Ví dụ:
class Circle{
	...
} c1, c2;

Điều gì xảy ra khi khai báo đối tượng???

Mỗi đối tượng sau khi khai báo sẽ được cấp phát một vùng nhớ riêng để lưu trữ các thuộc tính của nó. Không có vùng nhớ riêng để chứa các hàm thành phần của đối tượng. Các hàm thành phần được sử dụng chung cho tất cả các đối tượng cùng lớp.

Memory of object in OOP

Kích thước của lớp

Có thể xem lớp như là một kiểu dữ liệu mới được định nghĩa. Có thể sử dụng hàm sizeof() để in ra số bytes của các lớp.

#include <iostream>
using namespace std;
class Room{
public:
	double length;
	double breadth;
	double height;

public:
	double calculateArea(){
		return length * breadth;
	}
	double calculateVolume(){
		return length * breadth * height;
	}
};
class Student{
private:
	string id;
	bool gender;
	float math;
	float literature;
public:
	void setID(string str_id){
		id = str_id;
	}
	string getID(){
		return id;
	}
};

void main()
{
	cout << "Size of Room is: " << sizeof(Room) <<" bytes"<< endl;
	cout << "Size of Student is: " << sizeof(Student) <<" bytes"<< endl;
	system("pause");
}
Kết quả
Size of Room is: 24 bytes
Size of Student is: 44 bytes

Nhận xét:

Lớp Room có kích thước là tổng số bytes của 3 biến double: length, breadth, height. Mỗi biến double có kích thước là 8 bytes.

Lớp Student thì có biến id có kiểu string chiếm 32 bytes, biến gender có kiểu bool chiếm 1 byte, 2 biến mathliterature có kiểu float, mỗi biến kiểu float chiếm 4 bytes. Tổng cộng là 41 bytes. Nhưng kết quả lại là 44 bytes. Những byte được thêm vào (3 byte) gọi là byte đệm (padding byte) để giúp các thành phần dữ liệu trong lớp được truy xuất nhanh hơn.

2. Truy cập các thành phần của đối tượng

Sau khi khai báo đối tượng (object), ta sử dụng toán tử chấm “.” để truy nhập đến các thành phần của đối tượng. Cú pháp:

Tên_đối_tượng.Tên_thuộc_tính;
Tên_đối_tượng.Tên_hàm(giá_trị_các_khai_báo_tham_số);

Lưu ý:

Các thành phần có khai báo là private chỉ có thể được truy cập bởi những hàm thành phần của cùng một lớp, đối tượng của lớp không thể truy cập trực tiếp được.

Ví dụ:
#include <iostream>
using namespace std;
class Room{
private:
	int capacity;
public:
	double length;
	double breadth;
	double height;

public:
	void setSizeRoom(double rLength, double rBreadth, double rHeight){
		length = rLength;
		breadth = rBreadth;
		height = rHeight;
	}
	double calculateArea(){
		return length * breadth;
	}
	double calculateVolume(){
		return length * breadth * height;
	}
	void setCapacity(int rCapacity){
		capacity = rCapacity;
	}
	int getCapacity(){
		return capacity;
	}
};
void main()
{
	Room r;//khai báo đối tượng
	r.setSizeRoom(9.5, 7.3, 4.8);
	cout<<"Area of Room = "<<r.calculateArea();
	r.setCapacity(50);
	cout<<"\nCapacity of Room = "<<r.capacity;//Lỗi khi truy cập đến thuộc tính private
	cout<<"\nCapacity of Room = "<<r.getCapacity();//Truy cập thuộc tính private gián tiếp qua hàm
	system("pause");
}

3. Con trỏ this (tự tham chiếu)

Từ khóa this được dùng trong khi định nghĩa các hàm thành viên dùng để trỏ đến đối tượng hiện tại.

Không sử dụng con trỏ this

Hàm setRadius() trong lớp Circle có một sự nhập nhằng khi sử dụng tham số r trùng tên với thuộc tính r của lớp.

class Circle{
private:
	float r; //Bán kính, thành phần dữ liệu của từng đối tượng
public:
	void setRadius(float r)
	{
		r = r;//Nhập nhằng
	}
	float getRadius(){
		return r;
	}
};

Sử dụng con trỏ this

Có thể dùng con trỏ this để tránh sự nhập nhằng.

void setRadius(float r){
	this->r = r;
}

Con trỏ this cho phép truy cập vào đối tượng hiện tại của lớp nhằm xóa đi sự nhập nhằng giữa biến cục bộ, tham số với thành phần dữ liệu lớp. Không dùng this bên trong các khối lệnh static.

Mời bạn đánh giá bài viết
Bài trước và bài sau trong môn học<< Định nghĩa lớp trong lập trình hướng đối tượng với C++Hàm khởi tạo (constructor) và hàm hủy (destructor) của lớp trong OOP >>
Chia sẻ trên mạng xã hội:

Tác giả Vinh Lê

Vinh Lê hiện đang là biên tập viên tại Góc Học IT.

Bài viết của Vinh Lê

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.