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

Khởi tạo thành viên dữ liệu static trong C++

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

  1. Khai báo trong class: static int count;
  2. Định nghĩa/khởi tạo bên ngoài: int MyClass::count = 0;
  3. Truy cập qua tên lớp: MyClass::count hoặ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ặc obj.member