Thành viên Static của lớp trong C++

Chúng ta có thể định nghĩa các thành viên lớp là static bởi sử dụng từ khóa static trong C++. Khi chúng ta khai báo một thành viên của một lớp là static, nghĩa là, dù cho có bao nhiêu đối tượng của lớp được tạo, thì sẽ chỉ có một bản sao của thành viên static.

Một thành viên static được chia sẻ bởi tất cả đối tượng của lớp. Tất cả dữ liệu static được khởi tạo về 0 khi đối tượng đầu tiên được tạo, nếu không có mặt sự khởi tạo khác. Chúng ta không thể đặt nó trong định nghĩa lớp, nhưng nó có thể được định nghĩa bên ngoài lớp đó như được làm trong ví dụ sau bởi việc khai báo lại biến static, sử dụng toán tử phân giải phạm vi :: để nhận diện lớp nào sở hữu nó.

Bạn thử ví dụ sau để hiểu khái niệm của thành viên static trong C++:

Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Hàm thành viên static trong C++

Bằng việc khai báo một hàm thành viên là static trong C++, bạn làm nó độc lập với bất kỳ đối tượng cụ thể nào của lớp. Một hàm thành viên static có thể được gọi ngay cả khi không có đối tượng nào của lớp tồn tại và các hàm static được truy cập chỉ bởi sử dụng tên lớp và toán tử phân giải phạm vi :: trong C++.

Một hàm thành viên chỉ có thể truy cập thành viên dữ liệu static, các hàm thành viên static khác và bất kỳ hàm khác từ bên ngoài lớp đó.

Các hàm thành viên static có một phạm vi lớp và chúng không có sự truy cập tới con trỏ this của lớp trong C++. Bạn có thể sử dụng một hàm thành viên để xác định có hay không một số đối tượng của lớp đã được tạo.

Bạn thử ví dụ sau để hiểu khái niệm của hàm thành viên static trong C++:

#include <iostream>
 
using namespace std;


class Box
{
   public:
      static int biendemDT;
      // phan dinh nghia Constructor
      Box(double dai=1.0, double rong=1.0, double cao=1.0)
      {
         cout <<"Constructor duoc goi." << endl;
         chieudai = dai;
         chieurong = rong;
         chieucao = cao;
         // gia tri cua biendemDT tang len moi khi doi tuong duoc tao
         biendemDT++;
      }
      double theTich()
      {
         return chieudai * chieurong * chieucao;
      }
      static int layBienDem()
      {
         return biendemDT;
      }
   private:
      double chieudai;     // Chieu dai cua mot box
      double chieurong;    // Chieu rong cua mot box
      double chieucao;     // Chieu cao cua mot box
};


// khoi tao thanh vien static cua lop Box
int Box::biendemDT = 0;


int main(void)
{
  
   // in tong so doi tuong duoc tao truoc khi tao cac doi tuong.
   cout << "So doi tuong ban dau la: " << Box::layBienDem() << endl;


   Box Box1(2.4, 4.2, 2.2);    // khai bao box1
   Box Box2(4.5, 2.0, 3.2);    // khai bao box2


   // in tong so doi tuong duoc tao sau khi tao cac doi tuong.
   cout << "Tong so doi tuong sau khi tao la: " << Box::layBienDem() << endl;


   return 0;
}

Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Bình luận