Tôi biết rằng bạn thường khởi tạo biến thành viên tĩnh từ bên trong tệp .cpp. Nhưng câu hỏi của tôi là: tại sao bạn lại có?Tại sao bạn _have_ để khởi tạo biến thành viên tĩnh C++?
Dưới đây là một ví dụ:
#include <vector>
using namespace std;
class A {
public:
static vector<int> x;
};
main() {
int sz = A::x.size();
}
này đưa ra một lỗi biên dịch: undefined reference to 'A::x'
Tuy nhiên, điều này:
#include <vector>
using namespace std;
class A {
public:
static vector<int> x;
};
// Initialize static member
vector<int> A::x;
main() {
int sz = A::x.size();
}
biên dịch và chạy tốt.
Tôi có thể hiểu được liệu tôi có đang khởi tạo véc-tơ bằng cách sử dụng thứ gì đó không phải là hàm tạo mặc định, nhưng tôi thì không. Tôi chỉ muốn tạo một vector có kích thước 0. Chắc chắn, bất kỳ thành viên tĩnh sẽ phải được cấp phát bộ nhớ trên khởi tạo chương trình, vậy tại sao trình biên dịch không sử dụng hàm tạo mặc định?
+1 nhưng bạn nên xóa một trong những con dups. Đối với các đối tượng, RAII làm cho khởi tạo (ngay cả khi chỉ theo constructor mặc định) một hệ quả của định nghĩa. Điều này làm việc cho con trỏ thô, các loại nội trang như 'int'? –
Tôi có nghĩa là bạn có thể thêm khởi tạo ở đó nếu bạn muốn. Tôi sẽ thêm độ chính xác. – Klaim
@Steve POD type constructor là cú pháp duy nhất, vì vậy có nó không hoạt động, nhưng nó không thực sự làm bất cứ điều gì (hoặc thậm chí chính xác hơn, nó được phép làm gì - theo tiêu chuẩn C++). –