Trang chủ » Bài 5 – Thành viên tĩnh
Lập trình hướng đối tượng

Bài 5 – Thành viên tĩnh

oop

Xin chào mọi người!

Mấy ngày nay mình được điều động vào làm 1 nhiệm vụ rất đặc biệt – đó là vào trường :)) Cảm giác giống như hè được về quê nghỉ phép, rồi lại đi nghĩa vụ. Có lẽ với mọi người thì đầu năm học lúc nào cũng uể oải và chẳng muốn học tí nào đúng không? Vậy thì bài hôm nay mình sẽ viết ngắn lại nhé (mục đích chính là người viết lười nên muốn viết ngắn thôi :v).

Mình có nhận được 1 số ý kiến của các bạn về việc có 1 vài bài tập nho nhỏ để củng cố kiến thức đã học. Vậy nên sau khi kết thúc bài này, mình sẽ làm 1 đồ án thực tế quản lý thư viện, sử dụng OOP trong C++ làm nền tảng nhé! Ở đồ án này, ta sẽ sử dụng những kiến thức đã học để có thể viết 1 chương trình console (cùi mía thôi, chưa học GUI mà 😀 ).

Có bao giờ bạn tự hỏi, giả sử ta tạo 1 lớp “nhân vật phái Thiếu Lâm”, trong đó có 1 thuộc tính MonPhai là “Thiếu Lâm”. Vậy khi ta tạo 100 nhân vật mới thuộc môn phái Thiếu Lâm, ta phải set MonPhai thành “Thiếu Lâm” 100 lần. Có cách nào khác để khắc phục điều này không?

Rất may là trong OOP có hỗ trợ static member, hay còn gọi là thành viên tĩnh. Biến static mình có nói qua trong series Lập trình C++, và hôm nay mình sẽ nói kĩ hơn về static member.

1. Khái niệm

Static member là những thành phần được khởi tạo và cấp phát vào 1 vùng nhớ cố định. Thông thường 1 thuộc tính chỉ có thể được sử dụng khi có 1 object đại diện được khởi tạo, tuy nhiên với static member, ta có thể sử dụng mà không cần phải khai báo 1 object nào cả.

#include <iostream>
#include <string>
using namespace std;
class ThanhVienTrongLop
{
public:
static int TongThanhVien;
string Ten;
bool GioiTinh;
// Constructor
ThanhVienTrongLop(string _Ten, bool _GioiTinh)
{
this->Ten = _Ten;
this->GioiTinh = _GioiTinh;
++TongThanhVien;
}
}
// Khởi tạo giá trị tĩnh
// Ta phải khởi tạo ngay bên ngoài, nếu khởi tạo bên trong sẽ bị lỗi scope
// Sử dụng toán tử phân giải phạm vi :: để truy cập đến biến static
ThanhVienTrongLop::TongThanhVien = 0;
void main()
{
ThanhVienTrongLop tv1("An", false);
ThanhVienTrongLop tv2("Thu", true);
// Ta có thể sử dụng ThanhVienTrongLop::TongThanhVien thay cho tv1.TongThanhVien
// Ngoài ra tv2.TongThanhVien cũng có dữ liệu tương tự
cout << "Trong lop co tong cong " << tv1.TongThanhVien
}

Như ta đã thấy, thuộc tính TongThanhVien luôn có dữ liệu cố định, mặc dù ta truy xuất nó từ những đối tượng khác nhau. Lý do là vì ta khai báo thuộc tính kiểu static, nó sẽ lưu vào 1 ô dữ liệu cố định, và khi ta khởi tạo những đối tượng về sau, nó vẫn lấy ô dữ liệu đó cho những thành viên static của từng đối tượng.

Tất nhiên, ta cần gán giá trị ban đầu cho thuộc tính static để có thể sử dụng. Khác với những thuộc tính thông thường, thuộc tính static phải được khai báo cùng phạm vi với class. Ta không thể khai báo class ở bên ngoài cùng mà gán giá trị ban đầu trong hàm main.

Thuộc tính static được dùng để lấy giá trị chung cho toàn class, vì vậy ta có thể dùng nó với nhiều mục đích khác nhau, chẳng hạn như trong ví dụ trên, mình sử dụng để lấy số lượng thành viên trong lớp, thay vì phải tạo 1 vòng lặp rồi đếm (rất loằng ngoằng đúng không nào 😀 ).

2. Phương thức tĩnh

Tất nhiên, trong đối tượng thì thành phần bao gồm cả thuộc tính và phương thức, vì vậy phương thức có cả kiểu static. Một điều lưu ý là phương thức này chỉ có thể truy cập thuộc tính static, các phương thức bên trong và ngoài hàm, cũng như hàm. Phương thức static không thể truy cập đến các thuộc tính, phương thức thông thường trong 1 object.

#include <iostream>
#include <string>
using namespace std;
class ThanhVienTrongLop
{
public:
static int TongThanhVien;
string Ten;
bool GioiTinh;
// Constructor
ThanhVienTrongLop(string _Ten, bool _GioiTinh)
{
this->Ten = _Ten;
this->GioiTinh = _GioiTinh;
++TongThanhVien;
}
static int getTotal()
{
return this.TongThanhVien;
}
}
ThanhVienTrongLop::TongThanhVien = 0;
void main()
{
ThanhVienTrongLop tv1("An", false);
ThanhVienTrongLop tv2("Thu", true);
// Ta có thể sử dụng tv1.getTotal() hoặc tv2.getTotal() thay cho ThanhVienTrongLop::getTotal()
cout << "Tong thanh vien: " << ThanhVienTrongLop::getTotal();
}

Trên đây là bài Thành viên tĩnh trong OOP, cảm ơn các bạn đã theo dõi! Hẹn gặp lại ở bài tập nho nhỏ lần sau 😀

Tags

About the author

Võ Hoài Sơn

Tính tình bất định
Chọc vào là bịnh
Rất yêu lập trình
Luôn code hết mình
Mình hiện đang là sinh viên của trường ĐH Khoa học tự nhiên TPHCM. Bản thân rất thích code, kiêm luôn cả mần thơ nên thường hơi hâm hâm dở dở. Ngoài ra chém gió, chém chuối, chém trái cây các kiểu cũng là sở trường của mình. Rất mong được làm quen với các bạn :D

Add Comment