【问题标题】:C++ mixing of variable declarations and executables advtantageC++ 混合变量声明和可执行文件的优势
【发布时间】:2015-12-31 21:24:25
【问题描述】:

作为一个相当新手的 C++ 程序员,我有一个概念性问题可以帮助我。如果有的话,C++ 允许声明和可执行文件混合或“混合”的优势是什么?作为我的初学者,我能想到的只是这不是 C 中可用的功能。显然,您可以通过不必在特定范围的开头声明变量来组合一些代码行,而是您可以在指令本身。希望我能告诉你们更多,但我真的不知道。也许朝着正确的方向推动会有所帮助!谢谢!

【问题讨论】:

  • 我不明白。您所说的“可执行文件”实际上是指非声明性语句吗?你在问为什么 C++ 允许我们在函数顶部以外的点声明变量?
  • FWIW,C99 从 C 中删除了该限制。那是 16 年前的事了。

标签: c++


【解决方案1】:

在您需要从函数结果中获取引用的情况下,这是必需的。

 SomeType& func();
....

... 
    ... Some code that is needed to make `func` work, for example 
    ... opening a file or initializing some global variables.
    SomeType& x = func();
...

在块的开头声明 x 是行不通的,因为 C pre-C99 要求在这种情况下,因为如果不将引用初始化到引用中就无法声明引用。

另外一点是可以避免“默认构造”,然后初始化一个变量,这个是类似的:

SomeType x(func());

会避免调用SomeType的默认构造函数。

但一般来说,编译器会删除不必要的构造函数,因此与第一种情况相比,它的问题要小得多。

【讨论】:

    【解决方案2】:

    主要优点是使代码更易于阅读 - 而不是像 myVar = doSomething(p1, p2, p3); 这样的语句并且必须一直滚动到范围的开头来回忆 myVar 是什么,你可以有一个,更清晰,一个班轮MyClass myVar = doSomething(p1, p2, p3);

    【讨论】:

    • 然后你可以通过写auto myVar = doSomething(p1, p2, p3)来彻底毁掉它,因为你懒得使用类型系统:(
    【解决方案3】:

    这里至少有三个优点/好处。

    没有未初始化/默认的初始化值和更好的范围

    int a = -1;
    int b;
    ...   // Use of `a` is meaningless here, use of `b` is also dangerous
    a = f(); b = g();
    

    对比

    ...  // Uses of `a` and `b` are compiler errors
    int a = f(), b = g();
    

    更有效的对象创建

    Object o;                // default ctor
    ...
    o = Object(1, 2, 'a');   // ctor + move-assignement operator
    

    对比

    ...
    Object o(1, 2, 'a');     // ctor
    

    RAII

    mtx.lock();
    ...
    mtx.unlock();    
    

    对比

    {
        std::lock_guard<mutex> guard(mtx);  // implicit mtx.lock()
        ...
    }  // automatically generated mtx.unlock();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 2017-07-22
      相关资源
      最近更新 更多