我的标题中有一个静态变量。例子:
头文件:
class Fruits{
public:
static int colour;
}
在包含头文件后的cpp文件中,最好写:
int Fruits::colour=1;
或者
int Fruits::colour(1);
有人告诉我,第一个不是变量的初始化,而是另一个变量的声明。设置初始化的正确方法和位置是什么?
我的标题中有一个静态变量。例子:
头文件:
class Fruits{
public:
static int colour;
}
在包含头文件后的cpp文件中,最好写:
int Fruits::colour=1;
或者
int Fruits::colour(1);
有人告诉我,第一个不是变量的初始化,而是另一个变量的声明。设置初始化的正确方法和位置是什么?
在设计 C++ 时,他们决定,为了与早期代码保持一致,type X = y;
将被视为等效于type X(y);
for built-in types。因此,您给出的两个静态初始化示例被编译器视为完全相同,只是编写相同内容的不同方式。
对于类,它变得更加复杂。在许多情况下,type X = y
它们type X(y)
是可以互换的,但是在某些情况下,它们会导致不同的结果。在这个问题的答案中详细讨论了这一点。
它们是相同的,除了第一个使用复制初始化语法(参见 C++11 标准的第 8.5/14 段):
T a = b;
而第二种使用直接初始化语法(参见 C++11 标准的第 8.5/15 段):
T a(b); // C++11 also supports T a{b};
对于非类类型,两者是等价的。
这两行代码是等价的,都是初始化。
对于像这样的简单类型int
,两者都是等价的。
对于类类型,有一个区别:第一个将从临时对象复制或移动初始化,而第二个将直接初始化命名变量。在实践中,复制或移动将被省略,两者将做完全相同的事情;但是如果该类既不可复制也不可移动,则第一个将无法编译。
所以最好将第二个用于类类型;而且,如果您喜欢一致性,您可能更愿意将它用于所有类型。
“但是另一个人的声明”
是的,只有当您在不同的标题中多次定义它时,它才是另一个声明。但是仅在声明它的文件中定义它,那么它是相同的。
第一个解决方案似乎一切都很好。你可以用这个。据我所知,没有使用其他方式。
见这里。
两者在操作上是等效的,尽管
int Fruits::colour(1);
在这种情况下,如果colour
是一个不同的对象,class
那么它将调用构造函数(或者如果class
提供了另一个相同的对象,它将调用复制构造函数)。
由于类型是int
基本类型之一,因此它们是等价的并且同样有效。