【问题标题】:Do class objects have data types in c++? [closed]类对象在 C++ 中有数据类型吗? [关闭]
【发布时间】:2018-09-29 19:36:23
【问题描述】:

我知道这是一个愚蠢的问题,但我忍不住要问。来自类的对象是否具有 C++ 中的数据类型?它是某种定义的类型吗?还有,一个对象数组可以有多种数据类型吗?

例如:正常(无对象)

#include <iostream>
using namespace std;
int main() {
    int array1[5] = { 1,2,3,4,5 };
}

所以.. 普通对象

#include <iostream>
using namespace std;

class thisIsRandom {    /*Useful code */ };
int main() 
{
    thisIsRandom array1[5]; // = has multiple data types, like int, double..?
}

【问题讨论】:

  • 来自cppreference“类是用户定义的类型。”
  • 在 C++ 中,第一个示例中的内容具有对象,因为 int 和 int 数组是对象。
  • 是,是,不是。另请参阅:多态性和变体。

标签: c++ class object


【解决方案1】:

我认为您对 C++ 与其他语言相比的工作方式存在误解:

术语“对象”在 C++ 中的含义与语言不同:在 C++ 中,每个值都是一个“对象”,无论该值是否是 class 的实例(或struct) 与否。

与其他语言比较:

  • JavaScript/ECMASCript:Object 专门指派生自 Object 内置的复杂/非标量值,但不是其他类型,如 Number
  • C# / .NET:派生自 System.Object 的类型的实例(即每个 class 实例)以及每个非标量 struct 值和“装箱”值类型。
  • Java:派生自 java.Object 的类型的实例(即每个 class 实例)但不是未装箱的值。

C++ 对术语“对象”有严格的定义,来自 2013 年规范(1.8“C++ 对象模型”部分)(强调我的):

C++ 程序中的构造创建、销毁、引用、访问和操作对象。 对象是一个存储区域。 [注意:函数不是对象,无论它是否像对象那样占用存储空间。 ——尾注]。 对象由定义 (3.1)new-expression (5.3.4) 或在需要时由实现 (12.2) 创建。对象的属性是在创建对象时确定的。一个对象可以有一个名称(第 3 条)。对象具有影响其生命周期 (3.8) 的存储持续时间 (3.7)。 一个对象有一个类型 (3.9)。术语对象类型是指创建对象的类型。一些对象是多态的(10.3);该实现生成与每个此类对象相关联的信息,从而可以在程序执行期间确定该对象的类型。对于其他对象,其中找到的值的解释取决于用于访问它们的表达式的类型(第 5 条)

所以所有这些都是“对象”:

int x                // object of type 'int' named 'x'
vector<my_class> y   // object of type 'vector<my_class>' named 'y'

在其他语言(如 VB6 和一些 JavaScript 实现)中,与用户定义的类型(通常为Record 或 Struct 类型,如果您使用更灵活的语言,可能是多态类和接口),C++ 没有这种区别(尽管它对像 int 这样的内在函数有特殊处理)。

关于您发布的这段代码,您声称“没有对象”:

#include <iostream>
using namespace std;

int main() {
    int array1[5] = {1,2,3,4,5};
}

...它实际上确实有对象,它至少有7个对象:

  • 对象 1:array1 类型的数组 int[5](C++ 中数组的“类型”包括其 const 长度)
  • 对象 2 到 6:数组中的每一项都是int 类型的对象
  • 对象 7:int 类型的函数返回值(在这种情况下它是隐含的,因为您没有显式返回值)。
  • 在头文件或编译器特定文件中定义的程序中其他地方可能存在其他对象。

【讨论】:

  • 可能是“用classstruct 定义的类型”?
  • @juanchopanza 我已经重写了我的答案,以引用 C++ 语言规范以获得准确的答案。
  • 是的,我很难理解对象,所以感谢您的解释。
  • @juanchopanza 标准使用术语“结构类型”。
  • 如果我的问题得到了很多反对,为什么他们的回答会得到支持?我的问题很奇怪?
【解决方案2】:

在 C++ 中,所有对象都有一个类型。 “对象”一词的所有含义都是“类型的实例”。

我们来看几个例子:

int foo;

在这种情况下,foo 是一个类型为 int 的对象。

int foo[5];

在这种情况下,foo 是一个对象,其类型是“五个ints 的数组”。 foo[n]foo 的子对象,其类型为int

struct Foo {
    int a;
};

Foo foo;

在这种情况下,foo 是一个类型为Foo 的对象。 foo.afoo 的子对象,其类型为int

struct Foo {
    int a;
};

Foo foo[5];

在这种情况下,foo 是一个对象,其类型是“五个Foos 的数组”。 foo[n]foo类型为Foo的子对象,foo[n].afoo[n]类型为int的子对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2018-10-10
    • 2015-03-23
    • 1970-01-01
    相关资源
    最近更新 更多