[OOP] Thành phần tĩnh (static member) và hàm hằng thành viên (const member function)

Biến thành viên static (static member variables)

Như chúng ta đã biết biến static sẽ không bị hủy khi ra khỏi phạm vi truy cập của nó, mà nó sẽ tồn tại trong suốt chương trình.

Xem lại bài viết về biến static: Phạm vi truy cập biến trong C++

Ví dụ:


#include <iostream>

using namespace std;

void Func()

{

   static int val = 1;

   val++;

   cout << val << endl;

}

int main()

{

   Func();

   Func();

   Func();

   return 0;

}

Kết quả:

2 
3 
4

Ta cũng có thể định nghĩa biến của classstatic. Khi ta định nghĩa 1 biến của classstatic thì biến đó sẽ không phụ thuộc vào từng đối tượng của class. Tức là các đối tượng sử dụng biến static đó đều có giá trị giống nhau, khi 1 đối tượng thay đổi giá trị của biến static đó thì các đối tượng khác cũng thay đổi theo.

Xét ví dụ:


#include <iostream>

using namespace std;

class Test

{

public:

   int m_val = 10;

   static int s_val;

};

int Test::s_val = 1;

int main()

{

   Test t1;

   Test t2;

   t1.m_val = 20;

   t2.m_val = 30;

   t1.s_val = 2;

   cout << "[T1] m_val = " << t1.m_val << endl;

   cout << "[T2] m_val = " << t2.m_val << endl;

   cout << "[T1] s_val = " << t1.s_val << endl;

   cout << "[T2] s_val = " << t2.s_val << endl;

   return 0;

}

Kết quả:

[T1] m_val = 20 
[T2] m_val = 30 
[T1] s_val = 2 
[T2] s_val = 2

Như ví dụ trên

Biến m_val là biến non static, biến m_val sẽ phụ thuộc vào từng đối tượng của class Test.

Biến s_val là biến static, nó không phụ thuộc vào đối tượng nên khi đối tượng t1 thay đổi giá trị của biến s_val thì biến s_val của đối tượng t2 cũng thay đổi theo.

Chú ý:

Ta có thể truy cập biến static thông qua đối tượng của class. Tuy nhiên ta nên truy cập trực tiếp biến static từ class, không thông qua đối tượng nào.

Ví dụ:


#include <iostream>

using namespace std;

class Test

{

public:

   static int s_val;

};

int Test::s_val = 20;

int main()

{

   Test::s_val = 30;

   cout << Test::s_val << endl;

   return 0;

}

Kết quả:

30

Khi ta khai báo biến static trong class, để nói với trình biên dịch rằng tồn tại 1 biến static, nó chưa thực sự được định nghĩa (giống như forward declaration). Vì vậy trước khi sử dụng biến static đó ta phải định nghĩa 1 cách tường mình biến static đó bên ngoài class, trong phạm vi global.

Ví dụ:


class Test

{

public:

   static int s_val;

};

int Test::s_val = 20;

Hàm thành viên tĩnh (static member function)

Cũng giống như biến ta cũng có thể khai báo hàm trong class là static. Với 1 hàm là static ta có thể truy cập trực tiếp đến hàm thông qua tên class:

Ví dụ:


#include <iostream>

using namespace std;

class Test

{

private:

   static int s_val;

public:

   static void SFunc()

   {

      cout << s_val << endl;

   }

};

int Test::s_val = 20;

int main()

{

   Test::SFunc();

   return 0;

}

Kết quả:

 20

Chú ý:

Biến thành viên sử dụng trong hàm static phải là biến static.

Ví dụ:


class Test

{

private:

   static int s_val;

   int m_val;

public:

   static void SFunc()

   {

      cout << s_val << endl; // Correct

      cout << m_val << endl; //Error

   }

};

int Test::s_val = 20;

Hàm hằng thành viên(const member function)

Hàm hằng thành viên là hàm định nghĩa trong class mà ta không thể thay đổi giá trị các biến thành viên trong đó.

Để định nghĩa hàm hằng ta thêm const vào sau danh sách các tham số và trước thân hàm.

Ví dụ:


#include <iostream>

using namespace std;

class Test

{

private:

   int m_val;

public:

   void SetVal(int val)

   {

      m_val = val;

   }

   int GetVal() const

   {

      return m_val;

   }

   void Display() const

   {

      cout << "m_val = " << m_val << endl;

   }

};

int main()

{

   Test t; t.SetVal(40);

   t.Display();

   return 0;

}

Kết quả:

m_val = 40

Chú ý:

Ta nên sử dụng hàm hằng thành viên để trả về giá trị của biến thành viên private.

Was this article helpful?

Leave A Comment?