Cho mình hỏi tại sao khai báo biến static trong class như thế này sẽ lỗi ạ. Còn khi mình thêm từ kháo const vào nó không lỗi thế ạ?
Code:
class T
{
public:
static int a = 3;
};
Cho mình hỏi tại sao khai báo biến static trong class như thế này sẽ lỗi ạ. Còn khi mình thêm từ kháo const vào nó không lỗi thế ạ?
Code:
class T
{
public:
static int a = 3;
};
Dùng constructor để gán giá trị chứ không gán trong khai báo
Tại sao thế ạ? Mình dùng static const int a = 3; thì được ý
@nguyen2812 Từ C++11 cho phép gán giá trị ngay trong class em nhé.
@Canh_Huynh1 https://stackoverflow.com/questions/3531060/how-to-initialize-a-static-const-member-in-c
nó chỉ cho gán giá trị khi có từ khóa const thôi a ơi
Em quên cái này hì
Em vẫn chưa hiểu lắm mn
Đây em, có câu này: “The declaration of a static data member in the member list of a class is not a definition. You must define the static member outside of the class declaration, in namespace scope”
Nói chung đó là biến static thì nên tập để ngoài class declaration, trong file .cpp. Vì khai báo static const int = 3 như em chỉ đúng với biến int thôi, các biến khác đều ko làm được (anh mới test), cho nên ko nên vì 1 trường hợp cá biệt như vậy mà làm khác đi
C++17 em có thể thêm inline
vào phía trước và khởi tạo luôn giá trị được :V
inline static int a = 3; // C++17
trong đây ghi đầy đủ hết nè em :V https://en.cppreference.com/w/cpp/language/static#Static_data_members
với static const trước C++17 vẫn có thể phải khai báo ko có khởi tạo ngoài class nè:
If a const non-inline (since C++17) static data member or a constexpr static data member (since C++11)(until C++17) is odr-used, a definition at namespace scope is still required, but it cannot have an initializer. A definition may be provided even though redundant (since C++17).
struct X {
static const int n = 1;
static constexpr int m = 4;
};
const int *p = &X::n, *q = &X::m; // X::n and X::m are odr-used
const int X::n; // … so a definition is necessary
constexpr int X::m; // … (except for X::m in C++17)
nếu sử dụng static const int như 1 “biến” :V :V (lấy địa chỉ, reference tới) thì vẫn phải khai báo nó ngoài class (trước C++17) :V
Vì quy tắc, tiêu chuẩn nó không cho đặt thế.