Thành phần tĩnh static trong C++

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

4 Likes

nó chỉ cho gán giá trị khi có từ khóa const thôi a ơi

@Canh_Huynh1 em đọc đi đã, sao mấy bạn trẻ sống gấp gáp thế nhỉ, chưa đọc đã kết luận.

2 Likes

Em quên cái này hì :grin:

1 Like

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 :smiley:

7 Likes

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

5 Likes

Vì quy tắc, tiêu chuẩn nó không cho đặt thế.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?