static const与const static

Big*_*r00 45 c++ const class

我不明白我的C++类中这两个语句之间的区别:

class MyClass {
  public:
  private:
     const static int var = 0;            // Option 1
     static const int var = 0;            // Option 2
};
Run Code Online (Sandbox Code Playgroud)

b/w选项1和选项2有什么区别?他们都编译.

小智 57

他们的意思完全相同.您可以自由选择您认为更容易阅读的内容.

在C中,您应该放在static开头,但它还不是必需的.我不确定C++在这方面是否遵循C语言.

6.11.5存储类说明符

1在声明中声明说明符开头之外的存储类说明符的放置是一个过时的功能.


Jam*_*nze 35

static,const(这里,无论如何)和类型(例如int)都是声明说明符的一部分. 从历史上看,声明说明符是关键字和类型名称的无序列表,因此:

static unsigned int const var;
static unsigned const int var;
static int unsigned const var;
static int const unsigned var;
static const unsigned int var;
static const int unsigned var;
unsigned static int const var;
unsigned static const int var;
unsigned int static const var;
unsigned int const static var;
unsigned const static int var;
unsigned const int static var;
int static unsigned const var;
int static const unsigned var;
int unsigned static const var;
int unsigned const static var;
int const static unsigned var;
int const unsigned static var;
const static unsigned int var;
const static int unsigned var;
const unsigned static int var;
const unsigned int static var;
const int static unsigned var;
const int unsigned static var;
Run Code Online (Sandbox Code Playgroud)

都是合法的,都意味着同样的事情.

我认为在C和C++中仍然如此,但是如果我没有弄错的话,C已经弃用了将存储类说明符(static)置于开头的任何地方.无论如何,这几乎是一种普遍的惯例,所以你通常应该把static (和extern等)放在一开始.

另请注意,无序仅适用于声明说明符.在随后的声明者中,cv-qualifier 必须遵循他们的资格; 出于正交性的原因,通常应该将cv限定符放在他们修改的内容之后(即int const,不是const int).

最后,它似乎是类型之前呈现型改性剂,与所述符号性改性剂(一种普遍惯例signedunsigned)长度改性前述(short,longlong long).这也是相当频繁掉落int,如果改性剂的存在,这样的人写的unsigned,而不是unsigned intlong,而不是long int.然而,这远非普遍.

鉴于此,上面写出声明的第一种方式是首选,尽管删除它是完全可以接受的int.


Ed *_*eal 6

他们是一样的.但是我总是选择选项2,原因很简单,因为关键字constint并置在他们定义数据类型时更合适.关键字static定义该变量的可访问性的位置.