MST

星途 面试题库

面试题:C++类缺省函数重载规则中的特殊场景分析

已知类 `Complex` 表示复数,具有成员变量 `double real` 和 `double imag`。若已经定义了一个接受两个 `double` 参数的构造函数 `Complex(double r, double i)`,当我们尝试在类中定义一个仅接受一个 `double` 参数的构造函数 `Complex(double r)` 时,会对类的缺省函数产生什么影响?为什么?并分析编译器如何处理这种情况。
24.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 对类的缺省函数的影响
    • 编译器不会再为类 Complex 生成默认构造函数(缺省构造函数)。因为一旦用户定义了任何构造函数(在本题中,已经有一个接受两个 double 参数的构造函数 Complex(double r, double i),又定义了一个接受一个 double 参数的构造函数 Complex(double r)),编译器就认为用户已经接管了对象的初始化工作,不再自动生成默认构造函数。
  2. 原因
    • 默认构造函数的作用是在创建对象时,如果没有提供任何初始化参数,为对象的成员变量提供默认值。但当用户定义了构造函数后,表明用户有特定的初始化需求,编译器不再“猜测”用户想要的默认初始化方式。例如在 Complex 类中,用户定义了带参数的构造函数,说明对于复数的初始化,用户有明确的规则,编译器就不再生成通用的默认构造函数。
  3. 编译器处理这种情况的方式
    • 构造函数重载处理:编译器会将新定义的 Complex(double r) 构造函数和已有的 Complex(double r, double i) 构造函数视为重载的构造函数。当代码中创建 Complex 对象并提供相应数量和类型的参数时,编译器根据参数列表来选择合适的构造函数。例如:
      Complex c1(1.0); // 调用 Complex(double r) 构造函数
      Complex c2(1.0, 2.0); // 调用 Complex(double r, double i) 构造函数
      
    • 默认构造函数处理:由于不再生成默认构造函数,如果代码中尝试使用默认构造函数创建对象(例如 Complex c3;),编译器会报错,因为没有可用的默认构造函数。要解决这个问题,用户需要显式定义一个默认构造函数,例如:
      class Complex {
      private:
          double real;
          double imag;
      public:
          Complex() : real(0.0), imag(0.0) {} // 显式定义默认构造函数
          Complex(double r, double i) : real(r), imag(i) {}
          Complex(double r) : real(r), imag(0.0) {}
      };