C ++定义和实例化有什么区别?

时间:2016-10-31 15:34:03

标签: c++

定义和实例化有什么区别?

子问题:"变量定义"和"变量实例化"一样吗?

{{1}}

上面的代码可以被称为变量定义和变量实例化,对吗?如果是这样,我的问题是这两个术语是否是同义词? (或者它们之间有不同的关系吗?)

3 个答案:

答案 0 :(得分:2)

经过一些编辑和Johannes Schaub的修正后:

  1. 某种类型的变量的定义会创建该类型的变量。就Stroustrup而言,这也适用于某个类的对象的定义,因为类只不过是(非本机)类型。 (这很有道理,虽然它不是一般的OO术语。)
  2. 面向对象的一般术语:类的实例化创建该类的对象。专门的C ++术语:模板的实例化创建了一个“完全普通的”(Stroustrup)类。
  3. 类是一种类型,在代码中定义,而不是语言的一部分。
  4. 实现是一个具体的类,它实现了从中派生的抽象类中指定的功能。
  5. 声明是变量或函数的规范,不为其分配内存或为其生成代码。
  6. 所以@Riko,在learncpp.com上定义一个定义实现一个标识符的定义不是很准确。可以实现接口,而不是类型或类。但定义的一部分是有价值的:定义通常与内存分配密切相关。您可以根据需要随时声明一个函数或变量(例如头文件中的声明),但您只需定义一次。如果声明一个函数,则给出签名(名称,返回类型和参数,但不是正文)。

    如果你声明一个变量,你曾经在一个头文件中将extern这个词放在它前面,但是由于面向对象和类接管,所以不再经常这样做。另一方面,在头文件中定义变量可能会导致变量的多个实例,因为在编译不同的源文件期间会读取相同的头。由于C ++使用独立编译并且只是文本包含标题,因此变量在多个文件中定义,因此在同一名称下有几个变量。林克斯不喜欢这种模棱两可的态度,会抱怨。

    虽然术语实例化通常意味着“创建类的对象”,但Stroustrup(C ++的制造者)在特殊意义上使用它:类是一个模板的实例,其所有参数都已解析。然而,在许多关于C ++的文本中,单词实例化被用于一般的面向对象意义上,这是令人困惑的。

    @Jonannes Schaub。虽然我对C ++术语偏离一般的OO术语不太满意,但我认为在这里跟随Stroustrup是正确的,因为毕竟他创造了这种语言。

答案 1 :(得分:1)

有:

1)变量定义,

2)变量/对象实例化,以及

3)模板实例化。

1& 3是特定的C ++术语。 2是可能与C ++一起使用的更通用的术语。它不是正式的#34;为C ++定义的术语。

我知道你的问题是1和2,但不是3. 3与2不同,但意义相关。我没有进一步解决3,因为我不相信这是你问题的一部分。

实例化是对象实例的创建。在引用类对象时使用术语比使用int或double更常见。

C ++变量定义确实会导致实例化所定义类型的对象。但是,在C ++中,可以通过变量定义来实例化一个对象。

示例1:

std::string name;

定义变量 name ,一个std :: string,并且(在运行时)实例化。

示例2:

std::string *namePointer;

变量 namePointer 是一个指针,它被定义并且可以说(在运行时)被实例化(虽然没有初始化)。没有std :: string变量,也没有实例化std :: string。

//simple example, not what one should usually write in real code
namePointer = new std::string("Some Text");

未定义其他变量。实例化std :: string对象(在运行时),并且单独且预先存在的namePointer变量也设置其值。

答案 2 :(得分:0)

定义声明是编译时间问题。 标识符的声明和定义在编译程序时发生。

声明:声明告诉编译器有关在其他地方定义的标识符的类型,但可以在此处引用。

定义:标识符只能有一个定义。这是实际定义的东西。所有声明都引用了这个定义。

大多数情况下,这只是我们对类的区别,因为已经定义了内置类型(编译器已经知道int是什么)。我能想到的唯一例外是当我们将变量声明为extern时。

实例化,这在运行时发生。

  • 对象是类的实例。
  • 实例化是创建新对象的行为。

在运行程序时会发生对象的实例化。实例化是指创建类的新实例(对象)。

在C ++中,当一个类实例化时,将为该对象分配内存,并运行类构造函数。在C ++中,我们可以用两种方式实例化对象,在堆栈​​上作为变量声明,或在堆上使用 new 关键字。因此,对于类A,以下两个都创建了类的实例(实例化它)

struct A {
    int a;
};

A inst1;
A* inst2 = new A();
  • inst1是一个局部变量,它引用刚刚在堆栈上创建的A类实例。
  • inst2是一个局部变量,它包含一个指向刚刚在堆上创建的A类实例的指针。

可能存在一些混淆,因为第一个在Java或C#中是不可能的,只有第二个。在C ++中,实例化(创建新的运行时实例)A类。两者之间的唯一区别是作用域和分配内存的位置。