面向对象编程中的类型

时间:2011-06-01 06:33:30

标签: java c++ c oop

我对为什么将类视为数据类型感到困惑。

我知道它们中的一部分是“数据”,另一部分是方法。他们为什么称为数据类型?

程序编程语言(如C)中的过程有时会包含一种或多种基本数据类型。但它们并不称为数据类型。

5 个答案:

答案 0 :(得分:7)

鉴于维基百科的定义:

  

[...]数据类型(或数据类型)是一种分类,用于标识确定该类型可能值的各种类型数据(如浮点数,整数或布尔值)之一;可以对该类型的值进行的操作;以及可以存储该类型的值的方式。

我认为类很适合定义,而像C这样的过程编程中的过程根本不适合。

类表示一组可能的值(对象),并定义可以对此类型的值执行的可能操作。它还清楚地说明了如何在内存中表示类的对象。

然而,C中的程序并未确定一组可能的值,并且说有定义说明可以对程序执行哪些操作是没有意义的。

也许你的困惑源于函数式编程的一些文本,其中一个过程(或函数)被视为具有特定类型的第一类值。

答案 1 :(得分:1)

面向对象编程中的类不仅仅是数据类型,它们是抽象数据类型(ADT)。所以你应该问:

  

什么是抽象数据类型(ADT)?

ADT包含对数据进行操作的数据和操作。数据和操作都是ADT的一部分。

维基百科says

  

在计算中,抽象数据类型(ADT)是具有相似行为的某类数据结构的数学模型;或者对于具有类似语义的一种或多种编程语言的某些数据类型。 抽象数据类型是间接定义的,只能通过可能对其执行的操作以及对这些操作的影响(以及可能的成本)的数学约束来定义。

换句话说,不同的类是不同抽象数据类型的不同表示,它们由数据(通常是OOP中称为private内部数据)以及操作(通常称为< em>方法或成员函数)。

答案 2 :(得分:1)

过程不“保留”数据类型。它可以在运行时临时定义一个用于它自己的用途,但它实际上并没有保留它。您可以使用静态变量对它进行非常差的近似,但是您不能将它们公开 - 它们仍然适用并且仅对其过程可见。当然,全球变量并非由他们的程序“保留”。

另一方面,类的功能更像是数据类型。他们确实有方法,但方法的概念是围绕这样的想法设计的,即他们将以明确定义的方式操纵或返回类数据(无论如何,如果你正确地编写了你的​​类,那么定义良好)。它们可以实例化为数据类型,并像原语一样传递给函数:

class Foo
{
    ...
};
void main()
{
     Foo bar;
     Foo *baz = new Foo;
     delete baz;
}
void useFoo(Foo &blah)
{
     blah.doSomething();
     ...
}

简而言之,它们被认为是数据类型,因为它们是数据类型,它们的行为类似于数据类型,并且它们存储指定类型的数据。它们以特定方式对数据进行操作的事实不会改变它(毕竟,“+”运算符对整数或双精度具有指定的效果。)

答案 3 :(得分:1)

粗略地说,您可以将数据类型视为名称加上该类型的实现。 该实现定义了您可以对该类型的实体执行何种操作,而该名称用于确保在期望另一个类型时不使用类型。

现在,一切都可以成为一种类型。你说“程序”不是类型 - 它通常可能是这样 - 但你可以定义一个类型,它对应于某种函数(或程序),如下所示:

typedef void (*function_type)(void *);

将此与指向该类型函数的指针的简单声明进行对比:

void(*pf)(void *);

如您所见,诀窍是由定义typedef类型的关键字function_type完成的。在该类型的实体上,您可以执行非常少的操作:提取地址,调用...

同样,粗略地说,诀窍是“给出一个名字”,以便能够告诉另一个实体。

对于类,推理是一样的,但没有理由不将它们视为数据类型,因为它们定义了一个名称,并允许您将一组操作与该名称相关联,以便您可以检查实体的方式使用该类型。

答案 4 :(得分:-2)

混淆,错误整合,数据和程序的混淆以及非必需品的定义是OOP方法的全部内容。

谷歌“面向对象编程出了什么问题”得到了一些直接答案。