面试题答案
一键面试- 对类的缺省函数的影响:
- 编译器不会再为类
Complex
生成默认构造函数(缺省构造函数)。因为一旦用户定义了任何构造函数(在本题中,已经有一个接受两个double
参数的构造函数Complex(double r, double i)
,又定义了一个接受一个double
参数的构造函数Complex(double r)
),编译器就认为用户已经接管了对象的初始化工作,不再自动生成默认构造函数。
- 编译器不会再为类
- 原因:
- 默认构造函数的作用是在创建对象时,如果没有提供任何初始化参数,为对象的成员变量提供默认值。但当用户定义了构造函数后,表明用户有特定的初始化需求,编译器不再“猜测”用户想要的默认初始化方式。例如在
Complex
类中,用户定义了带参数的构造函数,说明对于复数的初始化,用户有明确的规则,编译器就不再生成通用的默认构造函数。
- 默认构造函数的作用是在创建对象时,如果没有提供任何初始化参数,为对象的成员变量提供默认值。但当用户定义了构造函数后,表明用户有特定的初始化需求,编译器不再“猜测”用户想要的默认初始化方式。例如在
- 编译器处理这种情况的方式:
- 构造函数重载处理:编译器会将新定义的
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) {} };
- 构造函数重载处理:编译器会将新定义的