类如何不是C ++中的对象?

时间:2012-06-29 16:31:56

标签: c++ class

我正在阅读“Design Patterns: Elements of Reusable Object-Oriented Software”,(特别是关于原型设计模式的章节)并且它声明......

  

“Prototype对于静态语言(如C ++,其中类不是对象)特别有用,并且在运行时很少或没有类型信息可用。” (第121页)

(强调我的)

我一直认为类是对象的同义词,我对这个语句的含义感到困惑。类如何不是对象,为什么语言是静态的呢?

9 个答案:

答案 0 :(得分:5)

C ++中的类不是对象:类是如何构建对象的描述,以及对对象类型的引用。

与Python之类的语言比较:在python中,就像在C ++中一样,从类中实例化一个对象。与C ++不同,您使用的类也是一个对象:它通常具有类型type,您可以在运行时创建新的类,像任何其他对象一样操作它们,甚至创建自己具有不同类型的类的对象

您可能想知道为什么要这样,通常您不需要它 - 就像C ++模板元编程一样,只有在需要它时才需要它,因为你可以以任何其他方式实现你的目标。您可能也会遇到使用模板元编程在C ++中使用meta-classes在Python中解决的问题。

答案 1 :(得分:3)

在C ++中,这声明了一个类:

class A {
public:
  int a;
};

虽然这声明了一个对象:

A a;

一个人不能在运行时询问一个类,因为可以询问一个对象。有意义地说,“对象'a',你的地址是什么?请调用operator+等。”在C ++中,使用静态类型,没有必要说“A类,你的成员列表是什么?请添加一个新成员,”b“。”

在其他语言中(Python可以想到),可以用这种方式操作类,因为每个类也是一个对象。除了作为对象的模板之外,类本身是一个对象 - 它可以打印,修改等。

答案 2 :(得分:2)

扩展Andrew Aylett所说的内容。

  

C ++中的类不是对象:类是如何构建对象的描述,以及对对象类型的引用。

此外,在Python或smalltalk等语言中。一切都是对象。函数是对象,类是对象。因此,这些语言是动态类型的,这意味着在运行时检查类型,变量可以采用任何类型。

C ++是静态类型的。变量只能采用一种类型,并且在编译时执行类型检查。

因此,在python中,您可以动态修改类。添加函数和字段,因为它是一个对象,可以修改。

答案 3 :(得分:2)

例如,一个类可以描述一本书是什么:名称,作者,出版日期,描述。

“书”类的一个对象将是一本特定的书:C ++ Primer Plus,Stephen Prata,2005,一本教C ++的书。

因此,类与对象不同。

答案 4 :(得分:1)

这句话所指的是类不是像C ++这样的语言中的一阶实体。在其他语言中,您可以将类作为参数传递给函数,例如,将对象或函数作为参数传递的方式相同。

作为一阶实体的实体有没有更多的含义,例如,在运行时修改类的可能性,或者检查类的完整内部等等。

通常发现类是动态语言中的一阶实体,如ruby,或者是lisp等的元对象协议。

希望这能澄清一点。

答案 5 :(得分:1)

当一个类被称为一个对象时,它意味着有一个对象在运行时表示该类。在C ++中,类在编译时被解散。它们的实例(即对象)只是保存对象字段的字节序列,而不是对类本身的任何引用。现在,C ++确实通过RTTI在运行时提供了一些类型信息,但这仅适用于多态类型,并且不被视为类对象。

缺少在运行时表示类的对象是C ++中没有反射的原因 - 没有办法获取有关某个类的信息,因为没有对象代表它。

BTW,C ++被认为是一种2级语言:对象是类的实例,但是类不是任何实例,因为它们只存在于编译类型中。在C#和Java等3级语言中,类也是运行时的对象,因此,它们本身就是另一个类的实例(Java中的类,C#中的类型)。最后一个类是它自己的一个实例,因此该语言只有3个级别。有些语言有更多级别,但这超出了这个问题的范围......

答案 6 :(得分:1)

类与Objects不同。类是(或多或少)类型,Object是实例,类似于以下内容:

int i;
YourClass object;

此处您不会说iint相同 - YourClassobject

该声明想要说的是:许多面向对象的语言都是非常面向对象的,因此他们开始将所有(或几乎所有)一个对象(一个或另一个类)。因此,在许多语言中,class将是某个class class的实例(因此是对象)(这可能令人困惑)。

这有时会有优势,因为您可以像处理任何其他对象一样对待这些语言中的类(类型)。你可以用它们做非常动态的东西,比如将它们存储在变量中,甚至在运行时操作类(例如创建程序发现需要的新类)。

看看这个c ++ - 类似的伪代码:

YourClass myObject = new YourClass();                // creates an object (an instance)
Class baseClass = myObject.get_class();              // store the class of myObject in baseClass. That's storing a type in a variable (more or less)
Class subClass = myObject.inherit();                 // dynamically create a new class, that only exists in variable subClass (a Class-object), inheriting from baseClass
subClass.add_method(some_function);                  // extend the new class by adding a new method
subClass.get_class() subClass.create_instance();     // declare a new variable (object) of your newly created type 
BaseClass another_onne = subClass.create_instance(); // also valid, since you inherited

由于c ++的严格打字,这显然不能很好地转换为c ++。其他语言在打字方面更具动态性,并且这种灵活性可以派上用场(并且使思考更复杂;有时两者同时进行)。如果你理解c ++,我仍然认为它解释了原理。

答案 7 :(得分:1)

  

我一直认为类是对象的同义词

OOP文献中的语言有时并不具体。编程语言对于对象的概念有些不同也无济于事。

类是从中创建对象(该类的实例)的模板或定义。也就是说,一个类提供该类对象的结构,类型签名和行为(或者稍后再输入......)

对象只是该类实例的内存中的一个位置。

维基百科提供了很好的文档。我建议你阅读它:

http://en.wikipedia.org/wiki/Class_(computer_programming

http://en.wikipedia.org/wiki/Object_(object-oriented_programming

此外,还有类型的概念。类型(或某些文献或编程语言中有时称为的接口)通常是类型/方法签名(以及可能的行为)的集合。像Java接口和C ++纯虚拟类这样的东西往往代表类型(但不完全相同)。

然后,符合类型(无论是接口还是纯虚拟类)的类是类型实现

该类,类型实现只是如何在内存中构造该类/类型的对象的方法。

当你实例化一个类/类型时,你需要在内存中重新构造该类的实例(对象)。

在C ++中,类不是对象,因为类本身未实例化。 C ++类不是其他类的实例(参见上面的定义。)

OTH,在像Java这样的语言中,类本身由原始类(java.lang.Class)的实例表示。所以类X在内存中有一个对象(一个java.lang.Class实例)。使用它,使用“class”对象,您可以(理论上)实例化或制造类/类型X的另一个实例(或对象)。

可能会让人感到困惑。我强烈建议您搜索和阅读有关类,类型,原型和对象/实例的文献。

  

我对这句话的含义感到困惑。课程怎么样?   对象,

如上所述。类不是对象。对象是一个实例,一个由类或类型的“配方”构造和初始化的内存。

  

为什么语言是静态的呢?

本书的这一部分有点误导,例如,Java是静态类型的,但是类本身可以是对象。也许文本是指动态类型语言(如JavaScript),其中类也可以是对象或实例。

我的建议是永远不要使用单词object,并简单地将词汇量限制为“类”和“实例”。但那是我个人的偏爱。其他人可能不同意,所以就这样吧。

答案 8 :(得分:1)

我可以更简单地让你理解它:

对象是类的“物理”实例。它在程序运行时消耗内存。

一个类描述了一个对象:层次结构,属性,方法。一个类就像一个用于创建对象的“模板”。