鉴于此:
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.
答案 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)
“对象”这个词是一个相当模糊的规范,没有更多的上下文,但通常对象有身份,行为和状态
ix
和ia
都没有; 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是对象,指针是对象,字符串文字是对象,依此类推。根据此定义,ix
,ia
和x
都是对象。但这可能不是你老师的意思。你必须是一个使用这个定义的语言律师,而且在“普通”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。无论是谁编写这样的代码都应该被教练以提高他们的易读性。”好的,这是个玩笑。
这个问题并不复杂。但在其他地方,我看到编程测试的目的是复杂的,目的是看你是否可以解决谜题。这完全没有意义,因为复杂的代码不应该且通常不存在。如果它难以阅读,那么代码编写得很糟糕。
请记住,代码不是为计算机编写的。在您阅读并理解之后,代码将为下一位开发人员编写。
不要只编写代码才能正常工作。这不是一个足够高的标准。世界上最糟糕的垃圾将会运行,但修复或升级是一场噩梦。