2013-02-20 215 views
1

我在头文件中有一个静态变量。例如:静态变量的哪个初始化是正确的

头文件

class Fruits{ 
    public: 
     static int colour; 
} 

在cpp文件包括头之后,是它更好地写:

int Fruits::colour=1; 

int Fruits::colour(1); 

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

+2

请不要标记C++问题'c'。 – 2013-02-20 15:09:52

+0

[Initializing private static members]可能的重复(http://stackoverflow.com/questions/185844/initializing-private-static-members) – egrunin 2013-02-20 15:12:15

+0

这个问题太广泛了。首先你需要这个http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-direct-initializati(还有其他问题也回答了这个问题,特别是如果你不知道这些条款),那么你需要上面发布的那个。 – djechlin 2013-02-20 15:15:20

回答

4

当C++正在设计他们决定,以保持一致性与早期代码,type X = y;将被视为等同于type X(y);为内置类型。你给出的静态初始化的两个例子因此被编译器视为完全相同,并且只是编写相同事物的不同方式。

对于类,它变得更加复杂。在很多情况下,type X = ytype X(y)是可以互换的,但是,在某些情况下会导致不同的结果。详细讨论了this question的答案。

+0

还有一个问题。我问的是,初始化一个新变量的初始化或者我在头文件中声明的相同静态的初始化会导致一些人困惑。 – kyrpav 2013-02-20 15:30:49

+0

它们对于所有类型都不是“完全相同” - 类型X = y;将无法编译为不可移动类型,而类型X(y);将适用于所有类型(适当可转换)。 – 2013-02-20 15:31:20

+0

所以你可以回答如果这是声明和一个新变量的定义不同于我在头中声明的变量?还有什么是不可移动的类型? – kyrpav 2013-02-20 15:36:19

2

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

0

第一种解决方案看起来一切正常。你可以使用这个。据我所知,另一种方式没有被使用。

请参阅here

3

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

T a = b; 

而第二个使用指示按初始化语法(见段落中的C++ 11标准的8.5/15):

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

对于非类类型,这两个是相同的。

2

对于简单的类型,如int,两者都是等效的。

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

所以最好使用第二种类的类型;如果你喜欢一致性,你可能更喜欢将它用于所有类型。

0

两者都在操作中相当于,虽然

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

由于类型是int这是一种基本类型,因此它们都是等效的并且同等有效。

1

“但另一宣言”

是的,这是另一种只有一个声明,如果你在不同的头部多次定义它。但是只在声明它的文件中定义它,那么它是一样的。