代码之家  ›  专栏  ›  技术社区  ›  strager

什么可以被实例化?

  •  5
  • strager  · 技术社区  · 15 年前

    C++中的哪些类型可以被实例化?

    我知道下面的每一个都直接创建了 Foo :

    Foo bar;
    Foo *bizz = new Foo();
    

    但是,对于内置类型呢?以下是否创建了 int 或者实例是使用错误的单词,内存只是被分配?

    int bar2;
    int *bizz2 = new int;
    

    指针呢?上面的示例是否创建了 int * 或者只是为 INT* ?

    会使用像 42 3.14 也创建一个实例?

    我已经看到了这样一个论点:如果不能对一个类型进行子类化,那么它就不是一个类;如果它不是一个类,那么它就不能被实例化。这是真的吗?

    5 回复  |  直到 15 年前
        1
  •  4
  •   strager    15 年前

    只要我们谈论C++,唯一权威的来源就是ISO标准。除了类和函数模板,它从来没有用过“实例化”这个词。

    但是,它确实使用了“实例”这个词。例如:

    具有自动存储持续时间(3.7.2)的每个对象的实例与其块中的每个条目相关联。

    注意,在C++语言中, int 左值也是一个“对象”:

    C++程序中的构造创建、销毁、引用、访问和操纵对象。对象是存储区域。

    new 显然创建了存储区域,因此创建的任何内容都是一个对象,并且根据规范的先例,可以称为实例。

        2
  •  3
  •   Charles Salvia    15 年前

    据我所知,你只是在问术语。C++标准唯一真正的区别是POD类型和非POD类型,其中非POD类型具有用户定义的构造函数、成员函数、私有变量等特征,而POD类型不具有。 int float 当然是吊舱,吊舱的阵列和吊舱的C结构也是。

    除了(和重叠)C++之外,面向对象编程中的“实例”的概念通常是指在内存中分配对象的空间,然后用构造函数初始化它。无论是在堆栈上还是堆上,还是在内存中的任何其他位置上,这在很大程度上都是不相关的。

    但是,C++标准似乎考虑所有数据类型“对象”,例如,在3.9中,它表示:

    “t类型的对象表示 是n个无符号字符的序列 被类型的对象占用的对象 t,其中n等于sizeof(t)…”

    因此,基本上,C++标准本身唯一的区别是POD与非POD。

        3
  •  2
  •   pm100    15 年前

    在C++中,“实例”和“实例化”只与类关联。

    但是请注意,这些单词也是具有会话意义的英语单词。 “pointer”当然是英语用法中的一个类,指针当然是该类的一个实例。

    但是在C++中,“指针”不是一个类,指针不是一个类的实例。

    另请看-有多少天使在弹头上

        4
  •  2
  •   scotchi    15 年前

    一个“实例”的概念并不是C++所固有的东西——基本上你有“具有构造函数和不存在的东西”。

    所以,所有类型都有一个大小,例如int通常是4个字节,一个包含两个int的结构将是8,依此类推。现在,在这个结构上加上一个构造函数,它开始看起来(和行为)像一个类。更具体地说:

    int foo; // <-- 4 bytes, no constructor
    
    struct Foo
    {
      int foo;
      int bar;
    }; // <-- 8 bytes, no constructor
    
    struct Foo
    {
      Foo() : foo(0), bar(0) {}
      int foo;
      int bar;
    }; // <-- 8 bytes, with constructor
    

    现在,这些类型中的任何一个都可以 堆栈 或在 . 当你在 堆栈 与上面的“int foo;”类似,在其作用域消失后(例如在函数调用的末尾)消失。如果你用“新”创造了一些东西,它会继续 在你打电话之前都有自己的住处 删除 关于它。在这两种情况下,构造函数(如果有)都将在实例化期间调用。

        5
  •  1
  •   Jonathan Graehl    15 年前

    做“new int”是不常见的,但它是允许的。甚至可以向构造函数传递0或1个参数。我不确定“new int()”是否意味着它是0初始化的(我想是的),与“new int”不同。

    当您在堆栈上定义一个值时,通常不称之为“分配内存”(虽然理论上它在堆栈上获取内存,但该值可能只存在于CPU寄存器中)。

    文字不一定在程序内存中得到地址;CPU指令可以直接对数据进行编码(例如,将42放入寄存器B)。可能任意的浮点常量都有一个地址。