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.
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 math và literature 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
.