Các thành phần tĩnh (static member) trong lớp (class)

Đây là bài 9/19 bài của series môn học Lập trình hướng đối tượng

1. Thành phần dữ liệu tĩnh

Các thuộc tính trong lớp được khai báo bằng từ khoá static được gọi là thành phần dữ liệu tĩnh. Các thuộc tính này được cấp phát một vùng nhớ cố định, tồn tại ngay cả khi lớp chưa có một đối tượng nào cả. Dữ liệu tĩnh là thành phần chung cho cả lớp, không của riêng từng đối tượng.

Ví dụ:
#include <iostream>
using namespace std;

class AClass{
private:
	static int x;//Thành phần dữ liệu tĩnh
	int y;
};

void main()
{
	AClass a, b; //Khai báo 2 đối tượng a, b
	system("pause");
}

Khi đối tượng a và b thuộc lớp AClass được tạo ra, a.y và b.y có 2 vùng nhớ khác nhau. Còn a.x và b.x chỉ là một (chung một vùng nhớ), thành phần x tồn tại ngay khi a và b chưa được khai báo.

Để truy cập thành phần tĩnh, ta có thể dùng tên lớp:

AClass::x;

Khai báo và khởi tạo giá trị cho thành phần tĩnh như sau:

int AClass::x;//Khởi tạo cho x giá trị 0 (mặc định của kiểu int)
int AClass::x = 10;//Khởi tạo cho x giá trị 10
Ví dụ sử dụng thành phần dữ liệu tĩnh:
#include <iostream>
using namespace std;

class AClass{
private:
	static int x;//Thành phần dữ liệu tĩnh
	int y;
public:
	AClass(){
		y=0;
	}
	void getxy(){
		x = x + 100;
		cout<<"Value of x = "<<x<<endl;
		y = y + 10;
		cout<<"Value of y = "<<y<<endl;
	}
};
int AClass::x = 0;//gán giá trị cho dữ liệu tĩnh x
void main()
{
	AClass a;
	cout<<"Get x and y of a:"<<endl;
	a.getxy();
	AClass b;
	cout<<"Get x and y of b:"<<endl;
	b.getxy();
	system("pause");
}
Kết quả
Get x and y of a:
Value of x = 100
Value of y = 10
Get x and y of b:
Value of x = 200
Value of y = 10

Có thể thấy, biến x thuộc về lớp Aclass, bất kỳ đối tượng nào thuộc lớp Aclass đều có thể dùng x và làm x thay đổi (x tăng lên 100 rồi 200). Biến y thì được cấp phát bộ nhớ riêng cho từng đối tượng, biến y của a không liên quan gì biến y của b.

2. Hàm thành phần tĩnh

Các hàm trong lớp được khai báo bằng từ khoá static được gọi là hàm thành phần tĩnh. Hàm thành phần tĩnh là chung cho toàn bộ lớp và không lệ thuộc vào một đối tượng cụ thể. Nó tồn tại ngay khi lớp chưa có đối tượng nào được tạo ra.

Cú pháp định nghĩa hàm thành phần tĩnh:

static Kiểu_dữ_liệu Tên_hàm(Các_tham_số){
//các lệnh
}

Lời gọi hàm thành phần tĩnh như sau:

Tên_lớp::Tên_hàm_thành_phần_tĩnh(Các_tham_số);

Lưu ý: Hàm thành phần tĩnh chỉ được sử dụng các thuộc tính static có trong lớp.

#include <iostream>
using namespace std;

class AClass{
private:
	static int x;//Thành phần dữ liệu tĩnh
	int y;
public:
	AClass(){
		y=0;
		x = x + 100;
	}
	static void getx(){//Hàm thành phần tĩnh
		cout<<"Value of x = "<<x<<endl;
	}
};
int AClass::x = 0;//gán giá trị cho dữ liệu tĩnh x
void main()
{
	AClass a;
	AClass::getx();//Gọi hàm thành phần tĩnh
	AClass b;
	AClass::getx();//Gọi hàm thành phần tĩnh
	system("pause");
}
Kết quả
Value of x = 100
Value of x = 200
5/5 - (3 bình chọn)
Bài trước và bài sau trong môn học<< Khai báo và sử dụng con trỏ đối tượng trong C++Hàm bạn (friend function) trong lập trình hướng đối tượng với C++ >>
Chia sẻ trên mạng xã hội:

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.