Thành viên static của lớp (static data member) được chia sẻ bởi tất cả đối tượng của lớp đó. Khác với thành viên thường, static member phải được định nghĩa và khởi tạo bên ngoài class.
Quy tắc
- Khai báo trong class:
static int count; - Định nghĩa/khởi tạo bên ngoài:
int MyClass::count = 0; - Truy cập qua tên lớp:
MyClass::counthoặc qua đối tượng:obj.count
Ví dụ: Đếm số đối tượng được tạo
#include <iostream>
using namespace std;
class MyClass {
private:
static int objectCount; // Khai báo static member
public:
MyClass() {
objectCount++; // Tăng khi tạo đối tượng
}
static int getCount() {
return objectCount; // Static function truy cập static member
}
};
// Định nghĩa VÀ khởi tạo static member BÊN NGOÀI class
int MyClass::objectCount = 0;
int main() {
cout << "Ban dau: " << MyClass::getCount() << endl; // 0
MyClass obj1;
MyClass obj2;
MyClass obj3;
cout << "Sau 3 doi tuong: " << MyClass::getCount() << endl; // 3
// Cũng truy cập được qua đối tượng (không khuyến khích)
cout << "Qua obj1: " << obj1.getCount() << endl;
}
Kết quả
Ban dau: 0 Sau 3 doi tuong: 3 Qua obj1: 3
Static const integral member (C++11)
Có thể khởi tạo ngay trong class nếu là const kiểu nguyên (integral):
class Constants {
static const int MAX_SIZE = 100; // OK: const integral
static const double PI = 3.14; // LỖI trước C++17: double không phải integral
};
// Vẫn cần định nghĩa bên ngoài nếu lấy địa chỉ:
// const int Constants::MAX_SIZE;
C++17: inline static member
Từ C++17, có thể định nghĩa và khởi tạo static member ngay trong class với từ khóa inline:
class ModernClass {
public:
inline static int count = 0; // Định nghĩa + khởi tạo ngay tại chỗ
inline static const string name = "Modern";
};
// Không cần định nghĩa bên ngoài!
Static member function
- Không có con trỏ
this - Chỉ truy cập được static member khác
- Gọi qua tên lớp:
MyClass::staticFunc()
class Logger {
inline static int logCount = 0;
public:
static void log(const string& msg) {
cout << "[" << ++logCount << "] " << msg << endl;
}
};
int main() {
Logger::log("Bat dau");
Logger::log("Ket thuc");
}
Tóm tắt
- Static member: Chia sẻ cho tất cả instance
- Pre-C++17: Khai báo trong class, định nghĩa bên ngoài
- C++17+:
inline staticđịnh nghĩa ngay trong class - Static const integral: Khởi tạo trong class (pre-C++17)
- Truy cập:
ClassName::member(khuyến khích) hoặcobj.member