【问题标题】:Initialisation or instantiation初始化或实例化
【发布时间】:2013-10-18 19:48:57
【问题描述】:

最能描述以下内容的:

一个();
A a;

“A”在哪里是泛型类?我一直认为您正在为该类初始化一个对象,但是,其他人似乎想到了实例化 - 我只在 VB.net 中真正遇到过。

请问有什么想法吗? :)

【问题讨论】:

  • 两者都不是。这是一个函数声明。
  • 我的 C++ 相当生锈,但我相信它正在声明和初始化“A”类型的自动变量“a”。
  • 你初始化了一个变量,但是对象被实例化了。 [stackoverflow.com/questions/2330767/…[1]:stackoverflow.com/questions/2330767/…
  • C++ 中没有“泛型类”这样的东西。 C++ 中的类是类型,类型总是特定的。
  • @HotLicks 不,它声明了一个无参数函数a,它返回一个A。 C++ 有时有点奇怪。

标签: c++ oop object


【解决方案1】:

假设你的完整程序是:

class A
{
};

A a;

那么答案是“两者”。

C++ 的术语不一定与其他语言相同。使用 C++ 术语,declaration A a 声明 type Aobject a

这个声明也是一个定义A 类型必须是完整的

[注意:如果A 类型是一个模板特化(例如typedef X<int> A),那么该特化将隐式实例化。]

在 C++ 术语中,initialization 表示为对象赋予初始。在示例中,对象a 将被默认初始化,这可能导致不执行实际初始化。

术语“实例化”的字典definition 是描述此声明的适当方式。声明“实例化”了一个对象a,它是A 类的一个“实例”。

【讨论】:

    【解决方案2】:
    A a(); 
    

    它声明了一个返回A 类型的函数。这让很多用户感到意外。这与Most vexing parse有关。

    下面两个例子,意图很明显

    A a(3);    // an object a, of type A, initialized with 3
    A a(int);  // a *function* a, taking an int parameter and returning A
    

    但是当括号为空时,默认是函数声明。如果你想要一个变量,你应该删除();

    A a;
    

    【讨论】:

    • 不,它可以使用默认构造函数定义A类型的变量a
    • @IlyaBursov 你应该尝试在你的代码中调用a 成员来找出答案。
    • 我已经扩展了答案,希望你不介意@billz。随意撤消我所做的。
    • 我的错,忘了A a;语法
    【解决方案3】:

    这是大多数情况下的声明。这声明了一个名为 a 的函数,它返回类型 A 并且不接受任何参数。

    由于 A 可能是宏或奇怪的东西,我不会说它总是一个声明。

    【讨论】:

    • “对于大多数情况下,如果 A 是类型”是什么意思?! A 可能是什么其他
    • 偷偷摸摸,但真实 :-) 虽然如果问题中的任何标记都可能是宏,那么很难说 任何东西。据我们所知,该代码可能是一个 bittorrent 客户端。
    • 事实上,我会假设对于关于 SO 的一般 C++ 问题,没有明确显示为宏的标记实际上都不是宏,因为那真的只是让每个问题完全无法回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2013-11-10
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多