C++ 面试题 目录

C++11 中委托构造函数 (delegating constructor) 的用法?

推荐答案

在C++11中,委托构造函数允许一个构造函数调用同一个类中的另一个构造函数,从而减少代码重复并提高代码的可维护性。以下是一个简单的示例:

-- -------------------- ---- -------
----- ------- -
-------
    ----------- -- - ----- ---- -
        -- -----
    -

    ----------- -- --- -- - ---------- -
        -- --------------
        - - --
    -

--------
    --- --
    --- --
--

在这个示例中,MyClass(int a, int b) 委托构造函数调用了 MyClass(int a),从而避免了重复初始化 x 的代码。

本题详细解读

委托构造函数的定义

委托构造函数是C++11引入的一个特性,它允许一个构造函数调用同一个类中的另一个构造函数。这种机制可以帮助减少代码重复,尤其是在有多个构造函数需要执行相似的初始化操作时。

使用场景

委托构造函数通常用于以下场景:

  1. 减少代码重复:当多个构造函数需要执行相同的初始化操作时,可以将这些操作放在一个构造函数中,然后让其他构造函数委托给它。
  2. 简化复杂初始化:当类的初始化逻辑较为复杂时,可以通过委托构造函数将初始化逻辑分解到多个构造函数中,从而提高代码的可读性和可维护性。

注意事项

  1. 委托链:委托构造函数可以形成一个委托链,即一个构造函数委托给另一个构造函数,后者再委托给第三个构造函数,依此类推。但是,必须确保委托链不会形成循环,否则会导致编译错误。

  2. 成员初始化列表:在委托构造函数中,成员初始化列表只能包含对另一个构造函数的委托调用,不能包含其他成员初始化。例如,以下代码是错误的:

  3. 构造函数执行顺序:在委托构造函数中,首先执行被委托的构造函数,然后执行委托构造函数的主体。因此,委托构造函数的主体可以覆盖被委托构造函数的部分初始化结果。

示例代码解析

-- -------------------- ---- -------
----- ------- -
-------
    ----------- -- - ----- ---- -
        -- -----
    -

    ----------- -- --- -- - ---------- -
        -- --------------
        - - --
    -

--------
    --- --
    --- --
--

在这个示例中:

  • MyClass(int a) 是一个普通的构造函数,它初始化了 xy
  • MyClass(int a, int b) 是一个委托构造函数,它首先调用 MyClass(int a) 来初始化 xy,然后在构造函数主体中修改 y 的值。

通过这种方式,MyClass(int a, int b) 避免了重复初始化 x 的代码,并且可以在构造函数主体中对 y 进行进一步的初始化或修改。

纠错
反馈