c ++默认参数与初始化列表

时间:2013-09-13 21:59:38

标签: c++ default-value default-constructor initialization

有四种特定情况,您必须在其中指定默认初始值设定项列表。 Fully discussed here

简而言之,如果你有

初始化程序列表必需

  1. 非静态const数据成员
  2. 参考类型的数据成员
  3. 为作为其他类
  4. 对象的数据成员提供params
  5. 从派生类提供基类ctor参数。
  6. 默认参数的一个缺点似乎是默认参数必须是函数原型参数列表中的尾随参数。例如:

    缺点(???)默认参数

    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)
    

    感谢您的光临。

2 个答案:

答案 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)

你有几个误解:

  1. 您将"Constructor Initializer Lists"称为initializer_lists
  2. 您似乎认为默认参数只能与"构造函数初始化列表分开使用"
  3. 让我们在这里谈谈一些原则:

    • 总是想要使用"构造函数初始化列表"对于你所有的变量,不仅仅是你提到的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) {}