我有一个概念性的问题来帮助我成为一名相当新手的C ++程序员。如果有的话,C ++允许混合或“混合”声明和可执行文件的优点是什么?在我初学者时,我所能想到的只是这不是C中可用的特性。显然,你可以通过不必在特定范围的开头声明变量来组合一些代码行,而是可以声明指令本身。希望我能告诉你更多,但我真的不知道。也许推动正确的方向会有所帮助!谢谢!
答案 0 :(得分:0)
在需要从函数结果中获取引用的情况下,这是必需的。
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前C99需要,因为在没有将referant初始化为引用的情况下不能声明引用。
另一点是你可以避免“默认构建”,然后初始化一个类似的变量:
SomeType x(func());
将避免调用SomeType
的默认构造函数。
但一般情况下,编译器会负责删除不必要的构造函数,因此它比第一种情况要少得多。
答案 1 :(得分:0)
主要优点是使代码更易于阅读 - 而不是像myVar = doSomething(p1, p2, p3);
这样的语句,并且必须一直向上滚动到范围的开头以回忆myVar
是什么,你可以有一个更清晰的单一班轮MyClass myVar = doSomething(p1, p2, p3);
。
答案 2 :(得分:0)
这里至少有三个优点/好处。
没有未初始化/默认的初始值和更好的范围
int a = -1;
int b;
... // Use of `a` is meaningless here, use of `b` is also dangerous
a = f(); b = g();
VS
... // 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
VS
...
Object o(1, 2, 'a'); // ctor
RAII
mtx.lock();
...
mtx.unlock();
VS
{
std::lock_guard<mutex> guard(mtx); // implicit mtx.lock()
...
} // automatically generated mtx.unlock();