Thành viên static private của lớp cũng cần được định nghĩa và khởi tạo bên ngoài class, giống như static public. Chỉ khác ở chỗ: không truy cập trực tiếp từ bên ngoài.
Quy trình
- Khai báo trong class (private section):
static int count; - Định nghĩa + khởi tạo bên ngoài:
int MyClass::count = 0; - Truy cập qua static member function public
Ví dụ hoàn chỉnh
#include <iostream>
using namespace std;
class MyClass {
private:
static int objectCount; // Private static member
public:
MyClass() {
objectCount++; // Tăng khi tạo đối tượng
}
// Static member function public để truy cập
static int getCount() {
return objectCount;
}
};
// Định nghĩa VÀ khởi tạo static member BÊN NGOÀI class
// Dù private, vẫn định nghĩa ở namespace scope
int MyClass::objectCount = 0;
int main() {
cout << "Ban dau: " << MyClass::getCount() << endl; // 0
MyClass obj1, obj2, obj3;
cout << "Sau 3 doi tuong: " << MyClass::getCount() << endl; // 3
// cout << MyClass::objectCount; // LỖI: private
}
Kết quả
Ban dau: 0 Sau 3 doi tuong: 3
C++17: inline static (Đơn giản hơn)
class ModernClass {
private:
inline static int count = 0; // Định nghĩa + khởi tạo ngay tại chỗ
public:
ModernClass() { count++; }
static int getCount() { return count; }
};
// Không cần định nghĩa bên ngoài!
Static const integral (Pre-C++17)
class Constants {
private:
static const int MAX_SIZE = 100; // OK: const integral, khởi tạo trong class
// static const double PI = 3.14; // LỖI pre-C++17: double không phải integral
public:
static int getMax() { return MAX_SIZE; }
};
// Vẫn cần định nghĩa bên ngoài nếu lấy địa chỉ:
// const int Constants::MAX_SIZE;
Truy cập private static từ friend
class MyClass {
private:
inline static int secret = 42;
friend void reveal(MyClass*);
};
void reveal(MyClass* obj) {
// Có thể truy cập private static qua tên lớp
std::cout << MyClass::secret; // OK vì friend
}
Tóm tắt
- Private static member: Vẫn phải định nghĩa bên ngoài class (pre-C++17)
- C++17:
inline staticđịnh nghĩa ngay trong class - Truy cập qua public static member function
- Static const integral: Khởi tạo trong class (pre-C++17)
- Friend function/class có thể truy cập private static