同一类中类的静态成员对象

Static member object of a class in the same class

本文关键字:静态 成员对象 一类      更新时间:2023-10-16

>假设我们有一个类

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 调用构造函数,它的构造函数也是私有的。

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

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

还有一件事,因为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)
      {}
 };

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

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

还有一件事,因为 e 是一个静态对象,而静态对象

只能调用静态成员函数,所以这里怎么能为静态对象 e 调用构造函数。

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

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

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

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

static Egg* instance() {return &e;}