我正在尝试做一些有条件的工作:
Type object;
if (cond) {
doSomeStuff();
object = getObject();
doMoreStuff();
} else {
doSomeOtherStuff();
object = getDifferentObject();
doEvenMoreStuff();
}
use(object);
Run Code Online (Sandbox Code Playgroud)
我能想到解决这个问题的唯一方法是复制use代码(它实际上是我的应用程序中的内联代码)并object在if块的每个分支中声明。如果我想避免重复代码,我必须将它包装在一些 use 函数中,就像上面一样。在实际情况下,此use函数可能需要 5 个以上的参数来基本上继承上下文。这一切看起来很混乱,无法维护。
if (cond) {
doSomeStuff();
Type object = getObject();
doMoreStuff();
use(object);
} else {
doSomeOtherStuff();
Type object = getDifferentObject();
doEvenMoreStuff();
use(object);
}
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方法是什么?Type没有默认构造函数,因此片段 1 无法编译。
其他一些语言支持片段 1 - 相关问题:Forcing uninitialised Declaration of member with a default constructor
这是 Java 涵盖的一个用例:
int x; // UNINITIALISED
if (condition){
x = 0; // init x;
}
else return;
use(x); // INITIALISED
Run Code Online (Sandbox Code Playgroud)
笔记:
null或0- 但是这不会泄漏到运行时;我认为编译器会在编译时重构代码,因此仅在必要时才x在减速时初始化。x可能在代码中未初始化,但是在运行时它保证会被初始化(这就是为什么在初始化之前尝试使用它时会出现错误的原因)。据我所见/所闻,C++ 不支持这一点,并且将始终运行默认构造函数 - 如果可用 - 即使它是不必要的。
有趣的是,当默认构造函数不可用时,您实际上会在 Java 中使用未初始化的变量获得相同的行为。因此,C++ 编译器显然可以处理这种行为(因为它的类没有默认构造函数)。那么,为什么不完全支持呢?
我认为类似int x = delete或[[no-default]] int x为此的语法(为了不破坏任何现有代码)将非常直观。
请注意,在 Java 中int x和int x = 0-之间存在差异。与@akuzminykhs 评论相反,它不是“初始化为 0”-我不知道为什么人们会赞成它 …