6

假设我们有一个类

class Egg
{
    static Egg e;
    int i;
    Egg(int ii):i(ii) {}
    Egg(const Egg &);    //Prevents copy-constructor to be called
  public:
    static Egg* instance() {return &e}
};

Egg Egg::e(47);

这段代码保证我们不能创建任何对象,而只能使用静态对象。但是我们如何在类中声明同一个类的静态对象。

还有一件事,因为e是一个静态对象,而静态对象只能调用静态成员函数,那么这里怎么会调用静态对象e的构造函数,它的构造函数也是私有的。

4

2 回答 2

7

但是我们如何在类中声明同一个类的静态对象。

static成员变量不存储在类的每个对象中。因此,如果您在定义类之后在类中声明static成员变量或作为命名空间级别的对象,则仅在访问(Class::varvar)和对成员的访问protected方面private有所不同。

还有一件事,因为e是静态对象,静态对象只能调用静态成员函数

我认为您正在混合static功能和static对象。在static函数内部,您只能调用static函数(除非您在对象上调用它们)。

那么如何在这里为静态对象调用构造函数e

与其他所有对象一样,也必须为static对象调用构造函数。

它的构造函数也是私有的

在 C++ 中的类级别上检查访问控制。因此,由于static对象在类内部,它可以访问private成员。

与其他一些语言不同,以下在 C++ 中是合法的,因为对私有成员的访问是从类内部进行的——即使是在另一个对象上(other在这种情况下):

 class Test {
 private:
      int i;
 public:
      Test(const Test &other)
      : i(other.i)
      {}
 };
于 2012-06-03T22:35:25.477 回答
2

但是我们如何在类中声明同一个类的静态对象。

通常你需要一个前向引用,但由于 Egg e 是静态的,它实际上是在类定义之外定义的。如果 e 不是静态的,你会得到一个错误(类似于“字段 Egg e 的类型不完整”)。

还有一件事,因为e是一个静态对象,而静态对象只能调用静态成员函数,那么这里怎么会调用静态对象e的构造函数呢。

这并不完全正确。类中的静态成员函数只能访问静态成员数据。static Egg e是 Egg 的一个实例,因此它可以访问常规 Egg 可以访问的所有成员和数据。

它的构造函数也是私有的。

任何私有成员都可以在类中使用。由于静态 Egg e被声明为 Egg 的成员,它可以使用私有构造函数。e 的定义在类之外,因为它是静态的,但它仍然是类成员。

最后,您的代码无法编译,因为您在这里遗漏了分号:

static Egg* instance() {return &e;}
于 2012-06-03T23:47:53.967 回答