1

我的标题中有一个静态变量。例子:

头文件:

class Fruits{
    public:
        static int colour;
}

在包含头文件后的cpp文件中,最好写:

int Fruits::colour=1;

或者

int Fruits::colour(1);

有人告诉我,第一个不是变量的初始化,而是另一个变量的声明。设置初始化的正确方法和位置是什么?

4

7 回答 7

4

在设计 C++ 时,他们决定,为了与早期代码保持一致,type X = y;将被视为等效于type X(y); for built-in types。因此,您给出的两个静态初始化示例被编译器视为完全相同,只是编写相同内容的不同方式。

对于类,它变得更加复杂。在许多情况下,type X = y它们type X(y)是可以互换的,但是在某些情况下,它们会导致不同的结果。在这个问题的答案中详细讨论了这一点。

于 2013-02-20T15:14:01.180 回答
3

它们是相同的,除了第一个使用复制初始化语法(参见 C++11 标准的第 8.5/14 段):

T a = b;

而第二种使用直接初始化语法(参见 C++11 标准的第 8.5/15 段):

T a(b); // C++11 also supports T a{b};

对于非类类型,两者是等价的。

于 2013-02-20T15:13:28.503 回答
2

这两行代码是等价的,都是初始化。

于 2013-02-20T15:11:38.943 回答
2

对于像这样的简单类型int,两者都是等价的。

对于类类型,有一个区别:第一个将从临时对象复制或移动初始化,而第二个将直接初始化命名变量。在实践中,复制或移动将被省略,两者将做完全相同的事情;但是如果该类既不可复制也不可移动,则第一个将无法编译。

所以最好将第二个用于类类型;而且,如果您喜欢一致性,您可能更愿意将它用于所有类型。

于 2013-02-20T15:13:39.897 回答
1

“但是另一个人的声明”

是的,只有当您在不同的标题中多次定义它时,它才是另一个声明。但是仅在声明它的文件中定义它,那么它是相同的。

于 2013-02-20T15:17:42.263 回答
0

第一个解决方案似乎一切都很好。你可以用这个。据我所知,没有使用其他方式。

这里

于 2013-02-20T15:11:49.477 回答
0

两者在操作上是等效的,尽管

int Fruits::colour(1);在这种情况下,如果colour是一个不同的对象,class那么它将调用构造函数(或者如果class提供了另一个相同的对象,它将调用复制构造函数)。

由于类型是int基本类型之一,因此它们是等价的并且同样有效。

于 2013-02-20T15:15:21.720 回答