Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Khởi tạo static member private trong C++

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

  1. Khai báo trong class (private section): static int count;
  2. Định nghĩa + khởi tạo bên ngoài: int MyClass::count = 0;
  3. 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