我不理解在我的C++类中这两种语句的区别:
class MyClass {
public:
private:
static const int var = 0; // Option 1
const static int var = 0; // Option 2
};
选项1和选项2有什么区别?它们都可以编译。
我不理解在我的C++类中这两种语句的区别:
class MyClass {
public:
private:
static const int var = 0; // Option 1
const static int var = 0; // Option 2
};
选项1和选项2有什么区别?它们都可以编译。
它们的意思完全相同。您可以自由选择您认为更易于阅读的方式。
在C语言中,您应该将static
放在开头,但目前还不是必需的。我不确定C++是否在这方面遵循了C语言。
6.11.5 存储类说明符
1 在声明中除了在声明说明符的开始处之外放置存储类说明符是一种过时的特性。
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;
这些关键词都是合法的且具有相同的含义。
我认为在C和C++中仍然如此,但如果我没有记错,C已不建议将存储类别说明符(static
)放在除开头之外的任何位置。不管怎样,这几乎是普遍惯例,因此通常应该将 static
(和 extern
等)放在开头。
还要注意,无序仅适用于声明说明符。在随后的声明符中,cv修饰符必须跟在它们所修饰的内容后面;出于正交性的原因,你通常应该始终将cv修饰符放在它们所修改的内容之后(即 int const
而不是 const int
)。
最后,似乎广泛使用的惯例是在类型前面加上类型修饰符,其中有符号修饰符(signed
或 unsigned
)在长度修饰符(short
、long
或 long long
)之前。如果存在修饰符,则省略 int
是相当常见的做法,因此人们写 unsigned
而不是 unsigned int
,写 long
而不是 long int
。然而,这远非普遍惯例。
鉴于此,最好采用上面所述的第一种声明方式,尽管省略 int
也是完全可以接受的。
int
。如果没有至少一个类型名称,该声明将是非法的。但是有了 int
,它应该是“两者之一”或“两者都”,而不是“两者都不”。 - James Kanzeint
,但如果只有符号修饰符,则不省略。也就是说,我看到的几乎所有代码都使用 unsigned int
而不是 unsigned
。 - starblue它们是相同的。但我通常会选择选项1,因为有一个简单的原因,即关键字 const
和 int
更适合并排使用来定义数据类型。而关键字 static
则定义了该变量的可访问性。