关于对象的哪些陈述是真的?

时间:2010-01-20 01:33:28

标签: c++ object

鉴于此:

struct { int x; } ix;

struct A { A() {}; int x; };
A ia;

其中哪一项属实?

a. ix is an object
b. ia is an object
c. both are objects
d. both are not objects.

9 个答案:

答案 0 :(得分:10)

其中许多答案都忽略了C ++标签。在C ++中,“一个对象是一个存储区域。[注意:一个函数不是一个对象,无论它是否以与对象相同的方式占据存储空间。]”(C ++标准,1.8 / 1)。

如果家庭作业问题是关于C ++的,那么对象的其他定义都不适用,甚至不是“任何可见或有形且形式相对稳定的东西”(dictionary.reference.com)。它不是要求你对OOP原则的看法,它实际上是在询问ix和ia是否是变量。

由于它是作业,我不会告诉你答案,但要注意struct { int x; } ix; struct ix { int x; };相同。

另一方面,如果家庭作业是关于OOP原则的,那么你可以用你的讲师给你的“对象”定义来解决自己的问题。既然我不知道那是什么,我不能告诉你他认为正确的答案......

答案 1 :(得分:3)

鉴于C++标签,答案几乎就是“采取您的选择。”

C标准将对象定义为(实质上)具有地址的任何内容,包括本机/基元类型的所有实例(例如int)。由于C ++在很大程度上依赖于C语言,因此该定义在C ++中仍然具有一定的重要性。根据这个定义,基本上每个变量都是一个对象,还有一些其他的东西(例如字符串文字,动态分配的内存块)。

在Smalltalk(相反的极端)中,答案是没有一个是对象 - 一个对象永远不会有公共数据。它的行为完全根据对消息的响应来定义。

答案 2 :(得分:1)

“对象”这个词是一个相当模糊的规范,没有更多的上下文,但通常对象有身份行为状态

ixia都没有; ix失败,因为它缺少身份或行为,ia失败,因为它没有行为。两者基本上只是一团子数据。

答案 3 :(得分:1)

如果没有额外的说明,这些问题是无法回答的。问题是标记为C ++,这意味着该语言应该是C ++。

在这种情况下,如果声明是在命名空间范围内进行的,则ix声明无效。使用未命名的类类型(没有链接)来声明具有外部链接的对象是非法的。 ix的声明将在本地范围内起作用

void foo() {
  struct { int x; } ix; // OK, no linkage
}

如果在命名空间范围内使用内部链接声明ix

,它也可能有效
static struct { int x; } ix; // OK? Internal linkage?

虽然我个人认为这也是不合格的(Comeau不知怎的允许)。

但是具有外部链接的命名空间范围声明是错误的

// In namespace scope
struct { int x; } ix; // ERROR

因此,如果假设命名空间作用域,并且上述声明是作为单个代码使用的,则对这些问题没有有意义的答案。整个代码完全无效。这毫无意义。它不是C ++。

否则,如果声明ix没有链接(本地)或内部链接,那么ix就是一个对象。

至于ia,它是一个对象,无论它在何处声明,因为类类型是名为

请注意,C ++中 object 的概念与类无关。 C ++中的对象是存储区域(内存)。例如,int类型的变量是C ++中的对象。

稍后添加:关于ix声明合法性的一点是一个有趣的问题。显然C ++ 98允许这样的声明,建议在DR#132中取缔。然而,后来该提案被拒绝(出于一个相当奇怪的原因)并且事情保持不变。然而,Comeau Online拒绝接受具有未命名类型的外部链接的对象的声明(内部链接是可以的)。它很可能是Comeau编译器中的一个正式错误(不是我会抱怨它)。

甚至稍后添加:哦,我发现有一个甚至更晚的DR#389,最终取消了此类声明,但此DR的状态仍为CD1。

答案 4 :(得分:1)

C ++中有两个常用的“对象”定义。

根据C ++标准,一个是正式的,并且说为它分配存储的所有东西都是一个对象。结构是对象,int是对象,bool是对象,指针是对象,字符串文字是对象,依此类推。根据此定义,ixiax都是对象。但这可能不是你老师的意思。你必须是一个使用这个定义的语言律师,而且在“普通”C ++用户中并不广为人知。对于刚刚学习语言的人来说,它也不是一个非常相关的定义。

您希望可能使用的定义是面向对象意义上的“对象”定义。在这里(至少在C ++语言系列中),一个对象通常意味着是一个类的实例。

这留下了下一个显而易见的问题:结构的实例也是一个对象吗?要看。在C ++中,类和结构本质上是相同的,所以在语义上,是的,但从技术上讲,你没有使用class关键字,所以在语法上,可能不是。

简而言之:这是一个愚蠢且措辞严厉的问题,只有你知道你的老师意味着什么或想要听到什么,因为你是参加课程的人,而不是我们。我们所能做的只是猜测认为定义一个类。

答案 5 :(得分:0)

根据我的定义,我会说一个对象有属性和方法。名词和动词。

你可以踢球,你可以入侵一个国家,你可以吃,挤奶或打牛。因此,这些是对象。

你可能有一个表示球(半径),国家(人口)或牛(每日牛奶输出量)的属性的数据结构,但是这个数据结构在你看来并不代表我的想法。告诉它如何处理相关行为。

我认识到这个定义在100%的情况下可能不起作用,但它足够接近我的需要。

答案 6 :(得分:0)

从技术上讲,对象是类的实例,但对象的真正用处在于它们封装信息和帮助系统设计的能力。它们是一种分析工具。

答案 7 :(得分:0)

对象是一种类型的实例(无论是POD还是类)。

因此,您可以提取对象的地址。所有对象至少占用一个字节。这样做的原因是您不必添加用于处理零大小对象的特殊代码,因为内存中的每个对象都有一个目标地址(通过使所有内容至少为一个字节,编译器将自动为每个对象提供唯一的地址)。

int main()
{
    struct { int x; } ix; 

    struct A { A() {}; int x; }; 
    A ia;

    ix.x = 5; // Assigned a value.
              // Thus it has state and thus is an object.

    ia.x = 6; // Assigned a value.
}

所以他们都是对象。

答案 8 :(得分:-1)

真正的答案是“e。无论是谁编写这样的代码都应该被教练以提高他们的易读性。”好的,这是个玩笑。

这个问题并不复杂。但在其他地方,我看到编程测试的目的是复杂的,目的是看你是否可以解决谜题。这完全没有意义,因为复杂的代码不应该且通常不存在。如果它难以阅读,那么代码编写得很糟糕。

请记住,代码不是为计算机编写的。在您阅读并理解之后,代码将为下一位开发人员编写。

不要只编写代码才能正常工作。这不是一个足够高的标准。世界上最糟糕的垃圾将会运行,但修复或升级是一场噩梦。