首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一类中类的静态成员对象

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

Stack Overflow用户
提问于 2012-06-04 06:11:02
回答 2查看 6.4K关注 0票数 6

假设我们有一个类,比如

代码语言:javascript
复制
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调用构造函数,因为它的构造函数是私有的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-04 06:35:25

,但是我们如何在类中声明相同类的静态对象呢?

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

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

我认为你把static函数和static对象混在一起了。在static函数中,您只能调用static函数(除非您在对象上调用它们)。

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

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

的构造函数也是私有的。

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

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

代码语言:javascript
复制
 class Test {
 private:
      int i;
 public:
      Test(const Test &other)
      : i(other.i)
      {}
 };
票数 7
EN

Stack Overflow用户

发布于 2012-06-04 07:47:54

,但是我们如何在类中声明相同类的静态对象呢?

通常你需要一个前向引用,但是因为Egg e是静态的,所以它实际上是在类定义之外定义的。如果e不是静态的,你会得到一个错误(类似于"field Egg e has incomplete type")。

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

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

的构造函数也是私有的。

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

最后,您的代码不能编译,因为您在这里遗漏了一个分号:

代码语言:javascript
复制
static Egg* instance() {return &e;}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10874317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档