Static trong class C++ | Laptrinhcanban.com

Static trong class C++

Cùm tìm hiểu về static trong C++ . Bạn sẽ biết khái niệm static trong C++ là gì cũng như cách sử dụng biến static và hàm static trong class C++ sau bài học này.

Static trong class C++ là gì

Static trong C++ là một toán tử có tác dụng chỉ định một biến hoặc hàm thành viên trong class tồn tại ở dạng tĩnh.

Dạng tĩnh ở đây có ý nghĩa, vùng bộ nhớ dùng để lưu trữ các dữ liệu này sẽ là bất biến, không thay đổi. Đối ngược với dạng tĩnh chính là dạng động (dynamic), ví dụ như khi chúng ta tạo ra các mảng động có thể tự thay đổi kích thước chẳng hạn.

Bằng việc sử dụng static trong class C++, chúng ta sẽ có được biến statichàm static, là các thành viên được lưu tại các vùng bộ nhớ bất biến. Vì ở dạng tĩnh nên chúng sẽ tồn tại duy nhất trong class, và do đó chúng có thể được sử dụng chung cho tất cả các đối tượng được tạo ra từ class.

Khác với biến statichàm static là các hàm và biến thành viên thông thường được tạo ra khi chúng ta tạo một đối tượng (instance) từ class. Các thành viên này được lưu giữ tại các vùng bộ nhớ khác nhau và chỉ có thể được sử dụng từ chính đối tượng đã tạo ra chúng mà thôi.

Biến static trong class C++

Biến static trong C++ là biến thành viên ở dạng tĩnh và tồn tại duy nhất trong class. Biến static có khả năng được sử dụng chung cho tất cả các đối tượng được tạo ra từ class. Ngoài ra do nó ở dạng tĩnh nên chúng ta có thể sử dụng trực tiếp nó mà không cần phải tạo đối tượng từ class.

Để tạo biến static trong class C++, chúng ta thêm toán tử static vào đằng trước tên biến khi khai báo biến trong class như sau. Lưu ý là access modifier của biến static phải ở dạng public để cho phép truy cập nó từ ngoài phạm vi class.

class TestClass
{
public:
int num; //Khai báo biến thông thường

static int sNum; //Khai báo biến static

//...
};

Ưu điểm lớn nhất của biến static đó chính là chúng ta có thể sử dụng trực tiếp nó mà không cần phải tạo ra đối tượng (instance) từ class. Tuy nhiên do không tạo ra instance dẫn đến việc giá trị ban đầu của biến static cũng không được khởi tạo, nên khi dùng biến static mà không tạo ra đối tượng, chúng ta cần phải khởi tạo giá trị cho nó ở bên ngoài phạm vi class.

Ví dụ cụ thể:

#include <iostream>
#include <string>
using namespace std;

class TestClass
{
public:
int num; //Khai báo biến thông thường

static int sNum; //Khai báo biến static

public:
TestClass(){ num = 10;}
};

//Khởi tạo giá trị cho biến static
int TestClass::sNum = 100;

int main()
{
/*Truy cập các biến thành viên mà không tạo ra instance*/
cout << TestClass::sNum; // 100
cout << TestClass::num; // error: invalid use of non-static data member
}

Giống như ví dụ trên, do sNum là biến static nên chúng ta có thể trực tiếp sử dụng giá trị của nó mà không cần phải tạo ra đối tượng từ class. Tuy nhiên biến num thì chỉ là biến thành viên bình thường nên chúng ta không thể sử dụng trực tiếp nó vì lỗi sẽ xảy ra.

Lưu ý cách viết TestClass::sNum như trên sử dụng toán tử : nhằm biểu thị biến thành viên của một class. Bạn có thể tìm hiểu thêm về nó cũng như các cách sử dụng class tại bài Class trong C++.

Hàm static trong class C++

Hàm static trong C++ là hàm thành viên ở dạng tĩnh và tồn tại duy nhất trong class. Giống với biến static thì hàm static có khả năng được sử dụng chung cho tất cả các đối tượng được tạo ra từ class, và chúng ta có thể sử dụng trực tiếp nó mà không cần phải tạo đối tượng từ class.

Để tạo hàm static trong class C++, chúng ta thêm toán tử static vào đằng trước tên hàm khi khai báo hàm trong class như sau. Lưu ý là access modifier của hàm static phải ở dạng public để cho phép truy cập nó từ ngoài phạm vi class.

class TestClass
{
public:
void func1() { cout << "func1 called" <<endl } //Khai báo hàm thông thường

static void func2() { cout << "func2 called" <<endl} //Khai báo hàm static

//...
};

Ưu điểm lớn nhất của hàm static đó chính là chúng ta có thể sử dụng trực tiếp nó mà không cần phải tạo ra đối tượng (instance) từ class. Ví dụ cụ thể:

#include<iostream> 
using namespace std;

class TestClass
{
public:
static void func1() { cout<<"func1 called"; } //Khai báo hàm static
void func2() { cout<<"func2 called"; } //Khai báo hàm thông thường
};

int main()
{
/*Gọi các hàm thành viên mà không tạo ra instance*/
TestClass::func1(); //func1 called
TestClass::func2(); //error: cannot call member function
}

Giống như ví dụ trên, do func1 là hàm static nên chúng ta có thể trực tiếp gọi nó mà không cần phải tạo ra đối tượng từ class. Tuy nhiên hàm u thì chỉ là hàm thành viên bình thường nên chúng ta không thể sử dụng trực tiếp nó vì lỗi sẽ xảy ra.

Lưu ý đối với các hàm static có xử lý các biến thành viên, do chúng ta không tạo ra instance dẫn đến giá trị của các biến thành viên này sẽ không được khởi tạo, nên khi sử dụng chúng, bắt buộc phải có bước khởi tạo giá trị cho các biến thành viên. Và đương nhiên để làm được điều đó, các biến thành viên này cũng phải là biến static.

Ví dụ cụ thể:

#include<iostream> 
using namespace std;

class TestClass
{
public:
static int sNum; //Khai báo biến static
public:

// static member function
static void func1() { cout<<sNum; } ////Khai báo hàm static
};

//Khởi tạo giá trị cho biến static
int TestClass::sNum = 100;

int main()
{
/*Truy cập các hàm thành viên mà không tạo ra instance*/
TestClass::func1(); //100
}

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về static trong class C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.