C++ 如何定义一个类,但不做它的任何实例?

C++ 如何定义一个类,但不做它的任何实例?,c++,C++,我正在学习一些COM代码,下面的代码让我很困惑 STDMETHODIMP _(ULONG) ComCar::Release() { if(--m_refCount==0) { delete this; // how could this "suicide" deletion be possible? return 0; } return m_refCount; } 对。这是

我正在学习一些COM代码,下面的代码让我很困惑

    STDMETHODIMP _(ULONG) ComCar::Release() 
    { 
      if(--m_refCount==0)
       {
         delete this; // how could this "suicide" deletion be possible? 
         return 0;
       }
      return m_refCount; 
    } 
对。这是来自的类似代码。在那里,我问memeber方法如何删除它所属的对象。现在我考虑这两种情况

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

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

我想知道类方法是否会被名字弄乱,然后存储在程序的代码/文本段中,而不考虑其类型的任何对象的存在。因此,只要您定义类方法,它们就存在

1-如果我定义了一个类而没有创建它的实例。运行时是否存在此类型

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

类是用户定义的类型。即使您的代码中没有使用任何浮点,该类型也将与
float
类型一样可用。将显示类型信息。特别是正如gnud所指出的,如果这是一个抽象基类,那么您将无法创建任何该类型的对象,而是拥有派生类对象。基类的成员信息将被适当地复制/更新到派生类对象中(当然,前提是您定义了适当的系数)

2-如果我只做一个 类并生成非常单一的对象 通过上述代码自杀。 删除对象后,其中 这种方法能保持下去吗

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


编辑:有关
的详细信息删除此
完全合法:这是常见问题解答。此外,请注意,这仅在极少数实例中有用——引用计数对象就是这样的对象(如代码中所示)。

成员函数的代码与类关联,而不是与类的实例关联。代码有一个副本,不管创建了多少实例(零个、一个、一百万个,随便什么。)执行
删除此操作
销毁实例,但它对类的成员函数的代码没有任何作用

1:this
指针只存在于非静态成员函数中,因此代码不会编译,除非它是此类函数的一部分。必须在实例上调用它。如果程序中没有创建类实例的内容,那么就没有调用函数的内容,但是函数的代码在运行时仍然存在;它只是没有被执行


2:类方法存储在程序的文本段中,而不是您猜测的数据段中。在项目的整个生命周期中,他们都在那里。(事实上,文本段通常是只读的,不能在运行时修改。)

通常(即,在大多数实现中),类类型对象只有一个指向函数表的指针(即“vtable”),如果它是多态的(即,它有一个或多个虚拟函数)。对于非多态类类型,不需要函数指针表。您对
1
的回答并不总是正确的-如果类具有虚拟方法,则在运行时内存中可能存在vtable。但是你不能用它做任何事情:)@James McNellis:是的,没错。在非虚拟的情况下,
这个
指针是隐式传递的,我们所拥有的只是成员中的一个普通函数。然而,COM的
IUknown::Release
就是一个很好的例子,我更倾向于使用更一般的情况。谢谢你提起这个@gnud:我没有注意到这个问题被巧妙地修改了。这方面有很多困惑——请参阅我的最新帖子。此外,静态成员变量类似于名称空间范围全局变量,而非静态成员变量是特定于实例的。即使不创建实例,也可以访问静态成员变量,但不能访问非静态成员变量。