Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果有默认的成员初始化,为什么要使用成员初始化列表_C++_Constructor_Member Initialization - Fatal编程技术网

C++ 如果有默认的成员初始化,为什么要使用成员初始化列表

C++ 如果有默认的成员初始化,为什么要使用成员初始化列表,c++,constructor,member-initialization,C++,Constructor,Member Initialization,在C++11中,引入了。 所以,我只是想问,为什么仍然必须使用成员初始值设定项列表来支持这些 例如 如果允许的话 class apple { int i = 10; }; 为什么要用这个 class apple { int i; apple(): i(10) {} }; 有什么特殊的优点吗?成员初始值设定项列表可以使用构造函数特定的初始值设定项初始化成员 例如,初始值设定项可能取决于构造函数的参数,例如 class apple { int i; app

在C++11中,引入了。 所以,我只是想问,为什么仍然必须使用成员初始值设定项列表来支持这些

例如

如果允许的话

class apple
{
    int i = 10;
};
为什么要用这个

class apple
{
    int i;
    apple(): i(10) {}
};

有什么特殊的优点吗?

成员初始值设定项列表可以使用构造函数特定的初始值设定项初始化成员

例如,初始值设定项可能取决于构造函数的参数,例如

class apple
{
    int i;
    apple(int i_) : i(i_) {}
};
或在不同的构造函数之间进行更改,例如

class apple
{
    int i;
    apple(foo_type) : i(0) {}
    apple(bar_type) : i(1) {}
};
这两种情况都不能由一个默认成员初始值设定项处理。

这里没有“必须”,可能会根据具体情况做出决定

例如,如果初始化值不是常量,或者如果值在多个构造函数中必须不同,则使用初始值设定项列表是有意义的

如果您必须支持C++11之前的版本(这可能比您认为的在大型项目中更常见),则必须始终使用初始值设定项列表。相应地,如果大多数代码维护人员不熟悉C++11特性,那么最好使用长期机制,而不是内联初始化


如果使用C++11不是一个问题,并且您正在跨多个构造函数初始化为单个常量值,那么初始化器形式可能更有意义。

如果不想,您不必使用成员初始化器列表。此外,还可以混合使用默认成员初始化列表和成员初始值设定项列表。这不只是其中之一。默认成员初始值设定项将用于未出现在成员初始值设定项列表中的任何成员

你选择哪一个取决于很多事情

当成员应始终使用相同的值初始化时,默认成员初始化非常有用。这是一种方便的速记方式,当初始值显示在声明位置时,它会增加清晰度

另一方面,如果需要使用运行时确定的不同值初始化成员,则不能使用默认初始值设定项;您必须在构造函数中执行此操作


与C++相比,缺省成员初始化是一个相对较新的概念,java自成立以来就已经有了等价性,程序员们已经讨论了两种不同初始化机制的优点,例如,请参见。

需要引证:谁说任何事情都必须做才能有利于其他事情?使用前一种方法与替代构造函数(即复制构造函数)时是否会有任何“问题”?您可以选择您想要的,甚至可以同时使用这两种方法。如果第二个版本更常见,可能是因为现有代码、旧习惯或未修订的编码准则。如果没有调用初始化i的构造函数,则返回到默认初始化i。多才多艺。