有四种特定情况,您必须在其中指定默认初始值设定项列表。 Fully discussed here
简而言之,如果你有
初始化程序列表必需
默认参数的一个缺点似乎是默认参数必须是函数原型参数列表中的尾随参数。例如:
缺点(???)默认参数
void f(int, int = 2, int = 3); // trailing defaults
void g(int = 1, int = 2, int c); // error
void h(int, int = 3, int); // error
我的问题是,如果我的代码不属于初始化列表的4个必需案例之间并且总是要求所有参数都有默认值,即不会导致默认参数的缺点,我应该选择哪一个以及为什么?什么是最佳做法?
一个例子是
// option -1: for the default argument list
// my_array.h
my_array(int a_number_of_elements = 0, int default_val = 0);
//option-2 : default initalizer list
// my_array.h
my_array(int a_number_of_elements, int default_val);
//my_array.cpp
my_array:: my_array(int a_number_of_elements, int default_val)
: my_num_elements(a_num_elements), my_default_value(default_val)
感谢您的光临。
答案 0 :(得分:0)
您在处理两个完全不同的事情:构造函数初始化列表 vs 默认函数参数。
你得到了正确的说法,但与你可能认为的相反,默认构造函数参数并不意味着使用这些值构造数据成员,除非你明确说明。因此,一种技术不能替代另一种技术,只是单独的互补事物。
例如:
// my_array.h
my_array(int a_number_of_elements = 1, int default_val = 0);
//my_array.cpp
my_array:: my_array(int a_number_of_elements, int default_val)
: my_num_elements(a_num_elements), my_default_value(default_val)
将[预计]使用一个零值元素初始化一个数组。
如果没有显式调用数据成员的构造函数,那么将调用它们的默认构造函数(如果可用),因此以下两个是等效的。
//implicitly default constructing members
my_array:: my_array()
{}
//explicitly default constructing members
my_array:: my_array() :
my_num_elements(), my_default_value()
{}
关于上述两个问题,为了更好的易读性而保留明确的内容总是一个好主意。正如常说的那样,给定的代码通常会写一次,但会多次读取。
答案 1 :(得分:0)
你有几个误解:
initializer_list
s 让我们在这里谈谈一些原则:
因此,使用这些原则我可以说你的问题的答案是肯定的,理想的情况是使用两个"构造函数初始化列表"和默认参数。导致构造函数看起来像:
my_array(int a_number_of_elements = 0, int default_val = 0) :
my_num_elements(a_number_of_elements),
my_default_value(default_val) {}