我在头文件中有一个静态变量。例如:静态变量的哪个初始化是正确的
头文件
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);
为内置类型。你给出的静态初始化的两个例子因此被编译器视为完全相同,并且只是编写相同事物的不同方式。
对于类,它变得更加复杂。在很多情况下,type X = y
和type X(y)
是可以互换的,但是,在某些情况下会导致不同的结果。详细讨论了this question的答案。
这两行代码是等价的,都是初始化。
第一种解决方案看起来一切正常。你可以使用这个。据我所知,另一种方式没有被使用。
请参阅here。
它们是相同的,所不同的是第一个使用复制初始化语法(见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
这是一种基本类型,因此它们都是等效的并且同等有效。
“但另一宣言”
是的,这是另一种只有一个声明,如果你在不同的头部多次定义它。但是只在声明它的文件中定义它,那么它是一样的。
请不要标记C++问题'c'。 – 2013-02-20 15:09:52
[Initializing private static members]可能的重复(http://stackoverflow.com/questions/185844/initializing-private-static-members) – egrunin 2013-02-20 15:12:15
这个问题太广泛了。首先你需要这个http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-direct-initializati(还有其他问题也回答了这个问题,特别是如果你不知道这些条款),那么你需要上面发布的那个。 – djechlin 2013-02-20 15:15:20