如何定义一个类但不创建它的任何实例?

时间:2010-02-24 02:19:34

标签: c++

我正在学习一些COM代码,以下代码使我感到困惑。

    STDMETHODIMP _(ULONG) ComCar::Release() 
    { 
      if(--m_refCount==0)
       {
         delete this; // how could this "suicide" deletion be possible? 
         return 0;
       }
      return m_refCount; 
    } 

是。这是来自here的类似代码。我在那里询问如何使用memeber方法删除其所属对象。现在我在考虑这两种情况。

1-如果我定义一个类而不创建它的实例。在运行时是否存在与此类型相关的任何数据?

2-如果我只创建了1个类的实例,并通过上面的代码使单个对象自杀。删除对象后,对象的方法可以保留在哪里?或者我是否过分关注封装错觉?

我想知道类方法是否首先被名称化,然后存储在程序的代码/文本段中,而不考虑是否存在任何类型的对象。所以只要你定义类方法就存在类方法。

2 个答案:

答案 0 :(得分:2)

  

1-如果我定义一个类而不创建它的实例。这种类型会在运行时存在吗?

编辑OP的编辑和gnud的评论:

类是用户定义的类型。即使您不在代码中使用任何浮点数,该类型也将是float类型。类型信息将存在。特别是当gnud指出,如果这是一个抽象基类,你将无法创建该类型的任何对象但是具有派生类对象。基类的成员信息将被适当地复制/更新到派生类对象(前提是你定义了适当的ctors)。

  

2-如果我只做1个实例   类和制作非常单一的对象   通过上面的代码自杀。   删除对象后,在哪里   该方法可以保留吗?

方法是可执行代码的一部分。类对象具有所有成员函数指针的表。创建对象以指向二进制文件的适当区域时,将更新此表。删除对象后,二进制文件仍然存在,无法访问它。

修改:delete this上的更多内容非常合法:这是常见问题16.15。此外,请注意,这仅在极少数情况下有用 - 引用计数对象就是这样(如您在代码中显示的那样)。

答案 1 :(得分:2)

成员函数的代码与类相关联,而不与类的实例相关联。无论创建了多少个实例(零,一,一百万,等等),都有一个代码副本。执行delete this;会破坏一个实例,但它对该类的代码完全没有任何作用。成员职能。

1:this指针仅存在于非静态成员函数中,因此除非代码是此类函数的一部分,否则代码将无法编译。它必须在实例上调用。如果程序中没有任何东西可以创建类的实例,则没有任何东西可以调用该函数,但该函数的代码仍然存在于运行时;它只是没有被执行。

2:正如您所猜测的,类方法存储在程序的文本段中,而不是其数据段中。它们一直存在于程序的整个生命周期中。 (实际上,文本段通常是只读的,不能在运行时修改。)