我在书中看到了这样一句话:
当你声明一个静态成员时,你不需要初始化它;如果你没有这样做,C++会调用默认构造函数。
这让我很困惑,它是指仅限于对象成员吗?如果是,那么在什么时候会调用默认构造函数呢?此外,如果没有默认构造函数,如何初始化静态成员对象?
我在书中看到了这样一句话:
当你声明一个静态成员时,你不需要初始化它;如果你没有这样做,C++会调用默认构造函数。
这让我很困惑,它是指仅限于对象成员吗?如果是,那么在什么时候会调用默认构造函数呢?此外,如果没有默认构造函数,如何初始化静态成员对象?
让我们来分解一下。假设有一个class Foo;
在某个地方。现在我们将它作为我们类的静态成员。
class Star
{
static Foo z;
// ...
};
基本上,这声明了一个全局对象Foo Star :: z
--那么它是如何实例化的呢?标准告诉你:它被默认构造。但请记住,在你的翻译单元之一中必须提供实际的对象实例:
// in, say, star.cpp
Foo Star::z; // OK, object lives here now
现在假设 Foo
实际上没有默认构造函数:
class Foo
{
public:
Foo(char, double); // the only constructor
// ...
};
现在有一个问题:我们如何构造Star::z
?答案是“就像上面一样”,但现在我们必须调用特定的构造函数:
// again in star.cpp
Foo Star::z('a', 1.5);
标准实际上有两个不同的"初始化"(语法概念)和"构造"(函数调用)的概念,但我认为我们现在不需要进入这个问题。
int
,我在 cpp 中只写了 int Star::z;
,它会被默认初始化为 0 吗? - 463035818_is_not_a_numberSomeObject SomeClass::x; // default initialization, class types will have the default constructor called
vs
SomeObject SomeClass::x = blah; // copy initialization
blah
转换为临时 SomeObject
之后调用复制构造函数,有时会跳过调用复制构造函数的步骤,但它必须是可访问的。如果不想调用默认或复制构造函数,请使用直接初始化语法:SomeObject SomeClass::x(blah); // direct initialization
class Star
{
static Foo z;
// ...
};
到
class Star
{
static int z;
// ...
};
// again in star.cpp
int Star::z;
SomeObject myObj;
隐式调用,也可以通过显式定义 SomeObject myObj{}; // 或 ()
调用。 - underscore_d编辑:将评论移至答案。
member 的定义总是一个 对象成员,因为它意味着作为对象成员声明的变量。也就是说,静态成员需要进行前向声明,并且通常最好显式初始化变量。这是哪本书?
// SomeObject.h
class SomeObject
{
public:
SomeObject(); // default constructor
private:
// declare members
int m_intMember;
static int m_staticIntMember;
};
// SomeObject.cpp
#include "SomeObject.h"
// forward declaration and initializing of static member
int SomeObject::m_staticIntMember(42);
SomeObject::SomeObject() : m_intMember(7) // initializing other member
{
}