Static data members (C++ only)
Việc kê khai của một thành viên dữ liệu tĩnh trong danh sách thành viên của một lớp không phải là một định nghĩa. Bạn phải định nghĩa thành viên tĩnh bên ngoài khai báo lớp, trong phạm vi không gian tên. Ví dụ:
class X
{
public:
static int i;
};
int X::i = 0; // definition outside class declaration
Khi bạn xác định thành viên dữ liệu tĩnh, nó tồn tại mặc dù không có đối tượng tồn tại của lớp dữ liệu tĩnh tồn tại. Trong ví dụ trên, không có đối tượng nào của lớp X tồn tại mặc dù thành viên dữ liệu tĩnh X :: i đã được định nghĩa.
Thành phần dữ liệu tĩnh của một lớp trong phạm vi không gian tên có liên kết bên ngoài. Trình khởi tạo cho một thành viên dữ liệu tĩnh nằm trong phạm vi của lớp khai báo thành viên.
Thành viên dữ liệu tĩnh có thể thuộc bất kỳ loại nào ngoại trừ khoảng trống hoặc khoảng trống đủ điều kiện với const hoặc dễ bay hơi. Bạn không thể khai báo một thành viên dữ liệu tĩnh là có thể thay đổi được.
Bạn chỉ có thể có một định nghĩa về thành viên tĩnh trong chương trình. Các lớp, lớp chưa được đặt tên trong các lớp chưa đặt tên và các lớp địa phương không thể có các thành viên dữ liệu tĩnh.
Thành viên dữ liệu tĩnh và người khởi tạo của họ có thể truy cập các thành viên riêng tư và được bảo vệ khác trong lớp học của họ. Ví dụ sau đây cho thấy làm thế nào bạn có thể khởi tạo các thành viên tĩnh nhờ sủ dụng các thành viên tĩnh khác, mặc dù các thành viên là cá nhân:
class C {
static int i;
static int j;
static int k;
static int l;
static int m;
static int n;
static int p;
static int q;
static int r;
static int s;
static int f() { return 0; }
int a;
public:
C() { a = 0; }
};
C c;
int C::i = C::f(); // initialize with static member function
int C::j = C::i; // initialize with another static data member
int C::k = c.f(); // initialize with member function from an object
int C::l = c.j; // initialize with data member from an object
int C::s = c.a; // initialize with nonstatic data member
int C::r = 1; // initialize with a constant value
class Y : private C {} y;
int C::m = Y::f();
int C::n = Y::r;
int C::p = y.r; // error
int C::q = y.f(); // error
các initializations của C :: p và C :: q nguyên nhân sai lầm vì y là một đối tượng của một lớp có nguồn gốc riêng từ C, và các thành viên của nó không thể truy cập được đối với các thành viên của C.
Nếu thành viên dữ liệu tĩnh là loại tách rời hoặc kiểu liệt kê, bạn có thể chỉ định bộ khởi tạo không đổi trong khai báo thành viên dữ liệu tĩnh. Bộ khởi tạo hằng số này phải là một biểu thức hằng số không thể thiếu. Lưu ý rằng bộ khởi tạo không đổi không phải là định nghĩa. Bạn vẫn cần xác định thành viên tĩnh trong một không gian tên bao quanh. Ví dụ sau đây minh họa điều này:
#include <iostream>
using namespace std;
struct X {
static const int a = 76;
};
const int X::a;
int main() {
cout << X::a << endl;
}
Mã thông báo = 76 ở cuối khai báo thành viên dữ liệu tĩnh a là bộ khởi tạo không đổi.
Có, những gì bạn có (nhưng chỉ dành cho các loại tích phân). – UncleBens
Chỉ muốn thêm rằng 'static' không liên quan gì đến các hàm tạo vì các thành viên' static' không cụ thể cho một cá thể đã cho và tồn tại bên ngoài nó. – ereOn
Trong thực tế, bạn * phải * khởi tạo const statics bên ngoài một hàm tạo lớp. Nếu không nó sẽ không phải là một const tĩnh. DUCY? –