1

有四种特定情况,您必须指定默认初始化程序列表。 在这里充分讨论

简而言之,如果你有

初始化器列表 必需

  1. 非静态 const 数据成员
  2. 引用类型的数据成员
  3. 为作为其他类对象的数据成员提供参数
  4. 从派生类提供基类ctor参数。

默认参数的一个缺点似乎是默认参数必须是函数原型参数列表中的尾随参数。例如:

默认参数的缺点(???)

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)

感谢您的关注。

4

2 回答 2

0

您在这里处理两个完全不同的事情:构造函数初始化列表默认函数参数

您说的大部分内容都是正确的,但与您可能相信的相反,默认构造函数参数并不意味着使用这些值构造数据成员,除非您明确说明。因此,一种技术不能替代另一种技术,只是分离互补的东西。

例如:

// 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()
{}

关于上面的两个,为了更好的易读性,让事情变得明确总是一个好主意。正如人们常说的,给定的代码通常只写一次,但要读很多次。

于 2013-09-13T22:19:50.027 回答
0

您在这里有几个误解:

  1. 您将“构造函数初始化列表”称为initializer_lists
  2. 您似乎认为默认参数只能与“构造函数初始化列表”分开使用

让我们在这里谈谈一些原则:

  • 总是希望对所有变量使用“构造函数初始化列表”,而不仅仅是您提到的 4 种类型的变量。“构造函数初始化列表”值初始化,而不是默认初始化并要求您在构造函数主体中分配给它们
  • 在可能的情况下,您总是希望有一个默认构造函数,因为这是在标准容器中使用您的对象所必需的
  • 默认参数是防止用户定义的构造函数和用户定义的默认构造函数的代码重复的好方法

所以使用这些原则,我可以说你的问题的答案是肯定的,理想的情况是同时使用构造函数初始化列表”和默认参数。导致构造函数看起来像:

my_array(int a_number_of_elements = 0, int default_val = 0) :
    my_num_elements(a_number_of_elements),
    my_default_value(default_val) {}
于 2016-06-13T13:24:03.113 回答