简体   繁体   中英

c++ : why I can't assign a value to a non-const static member "inside" a class?

I'm new to C++, and I just can't understand that why I can't assign a value to a non-const static member inside a class (like we do in java static int x = 12; ) even thought I can

  • declare a non-const static member ( static int x; )
  • declare a static const member ( static const x; )
  • assign a static const member ( static const int x = 12; )

note: my class and my main() function are in the same file

In general

A static variable inside a class, just like everything else, is just a declaration by default. C++ then requires you to provide a single definition per entity that requires one, that's the One Definition Rule. The definition is where the initializer (which is not an assignment, but a construction) goes, since there should be only one as well. It is typically placed in a .cpp file so that it can't be accidentally duplicated by #include s.

The constant case

When a static member is a constant integer or enumeration, and is initialized with a compile-time expression, the initializer is allowed to be placed on the declaration, and the definition skipped. This is a result of a combination of old rules and isn't really interesting today IMO.

Proper inline initialization

Since C++17 introduced inline variables, you can use them as static members. The rules are roughly the same as inline functions, and are pretty sensible: you can provide multiple definition of an inline entity, you are responsible for ensuring that they are all strictly identical, and the implementation is responsible for collapsing them into a single definition with its initializer. Thus, what you're looking for is written:

struct Foo {
    static inline int bar = 42;
    //     ^^^^^^
};

You have to initialise the static member outside the class definition like in this example:

class Box {
   public:
      static int x;               
};

// Initialize static member of class Box outside the class definition
int Box::x = 12;

int main(void) {
...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM