【问题标题】:Why (or when) should I separate declaration and assignment?为什么(或何时)我应该分开声明和赋值?
【发布时间】:2011-12-14 08:26:28
【问题描述】:

我的 IDE 不断要求我这样做。我依稀记得我读过一些与构造函数中的异常有关的 C++ 论文。

Java 示例:

    void foo(){
        String result = "";
        int i = 5; // should this ever be a problem ?
    }

对于这两行 IDE 建议分开。

其他问题

1.我是按价值创造还是按引用创造有区别吗?
例如。在 C++ 中 class A{}; ... A a = ...;A* a = new...;

2. 我猜intfloat 等基本类型从来都不是问题。 POD's是一样的吗?

【问题讨论】:

  • 您已将问题标记为与语言无关,但它确实与语言相关。请下定决心。
  • @Björn:那是因为我不确定问题出在哪里。我认为它在 Java 和 C#(可能还有其他托管语言)和 C++、D、Delphi(可能还有其他可以手动管理的语言)中是相似的。因此决定将其限制为带有构造函数的语言。你认为我应该用这 5 个标签重新标记它吗?
  • 我认为就目前而言,问题的范围太大了。答案需要对每种语言进行详细解释,因为它们在处理异常和对象构造/初始化的方式上都非常不同。
  • @Björn:无论如何,我想至少了解一下 Delphi、Java 和 C++。就算有好几个答案也没关系。所以,我会在一段时间内保持现状,看看会发生什么。

标签: language-agnostic constructor


【解决方案1】:

此答案涉及 C++,其他语言的行为可能不同

您实际上应该在声明变量时对其进行初始化。

对于POD 类型,这只是为了让您不要忘记初始化它们,从而使用未初始化的数据。

对于用户类型,这样做是为了优化:

A other;

//this will first construct a, and then assign a new value to a
//the initial construction is useless and takes up processing time
A a;
a = other;

//b is only initialized once
A b = other;

1) 这不是按值或引用创建变量。它在堆栈或堆上创建它。 SO上的很多帖子中解释了这些差异。

2) 这不是问题,这更像是 POD 的习惯。答案的第一行解释了在声明的同一行中进行初始化的主要原因。

【讨论】:

  • 如果您想知道这与异常安全有何关系,请阅读RAII
  • IIUC,您的"2) It's not a problem, it's more of a habbit for POD's" 不正确。 C++ 无论如何都会调用(自动生成的)默认 c'tor,即它与习惯无关。 (我正在审查我未接受的 Q,请不要将其视为吹毛求疵)
猜你喜欢
  • 1970-01-01
  • 2013-10-16
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2010-10-14
相关资源
最近更新 更多