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