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

时间:2012-06-03 22:11:02

标签: c++ static constructor

假设我们有一个类

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

2 个答案:

答案 0 :(得分:7)

  

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

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

  

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

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

  

那么如何在静态对象static

中调用构造函数

与其他每个对象一样,也必须为e个对象调用构造函数。

  

它的构造函数也是私有的

在C ++的类级别上检查访问控制。因为static对象在类中,所以它可以访问static个成员。

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

other

答案 1 :(得分:2)

  

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

通常你需要一个前向引用,但由于Egg e是静态的,它实际上定义了类定义的。如果e不是静态的,则会出现错误(例如“ field Egg e的类型不完整”)。

  

还有一件事,因为e是一个静态对象,静态对象只能调用静态成员函数,所以如何在静态对象e中调用构造函数。

这不是真的。类中的静态成员 function 只能访问静态成员数据。 static Egg e 是Egg的实例,因此它可以访问普通Egg可以访问的所有成员和数据。

  

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

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

最后你的代码没有编译,因为你在这里遗漏了一个分号:

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