定义一个class而没有明确定义构造函数的时候,编译器会自动假设两个重载的构造函数

本文详细解释了在C++中当未显式定义构造函数时,编译器如何默认提供空构造函数和复制构造函数。并通过一个具体示例说明了这两种构造函数的工作原理及其存在的条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实际上,当我们定义一个class而没有明确定义构造函数的时候,


编译器会自动假设两个重载的构造函数
 (默认构造函数"default constructor" 和复制构造函数"copy constructor")。


例如,对以下class:

   class CExample {
public:
int a,b,c;
void multiply (int n, int m) { a=n; b=m; c=a*b; };
};

没有定义构造函数,


编译器自动假设它有以下constructor 成员函数:

  • Empty constructor

    它是一个没有任何参数的构造函数,被定义为nop (没有语句)。它什么都不做。

    CExample::CExample () { };
  • Copy constructor

    它是一个只有一个参数的构造函数,该参数是这个class的一个对象,这个函数的功能是将被传入的对象(object)的所有非静态(non-static)成员变量的值都复制给自身这个object。

       CExample::CExample (const CExample& rv) {
    a=rv.a; b=rv.b; c=rv.c;
    }

必须注意:这两个默认构造函数(empty construction 和 copy constructor )

只有在没有其它构造函数被明确定义的情况下才存在。

如果任何其它有任意参数的构造函数被定义了,这两个构造函数就都不存在了。

在这种情况下,

如果你想要有empty construction 和 copy constructor ,

就必需要自己定义它们。

### C++ 中多构造函数重载解析规则 当一个定义了多个构造函数时,编译器会通过参数匹配来决定调用哪个构造函数。以下是具体的规则: #### 参数匹配优先级 1. **精确匹配**:如果某个构造函数的形参列表能够与实际传入的实参完全一致,则该构造函数被选中[^1]。 2. **标准转换**:如果没有找到精确匹配,编译器尝试使用内置的标准类型转换(如 `int` 到 `double` 的隐式转换)。这种情况下会选择最接近的构造函数。 3. **用户自定义转换**:在前两者都失败的情况下,允许使用用户定义的类型转换操作符或单参数构造函数实现隐式转换。注意,这类转换通常只允许一次间接转换。 #### 模糊匹配处理 - 如果存在两个或者更多的候选者都可以接受相同的输入但无法判断哪一个更优,则会发生歧义错误,导致编译失败。 - 当没有任何可用选项满足上述条件之一时,也会引发编译期错误提示缺少合适的构造方法。 下面是一个简单的例子展示如何工作: ```cpp class Example { public: // 无参构造函数 Example() {} // 带 int 类型参数的构造函数 Example(int value) {} // 带 double 和 string 参 数的构造 函数 Example(double d, std::string s) {} }; // 创建对象实例的不同方式及其对应调用情况分析如下: Example e0; // 调用了默认构造函数 (Exact Match) Example e1(42); // 调用了带整数参数的那个版本 (Exact Match) Example e2(3.14,"test"); // 明确指定了双精度浮点数加字符串形式的数据结构化赋值语句 (Exact Match) // 下面这行代码会产生编译错误因为有多种可能的选择路径可供考虑从而造成二义性问题 // Example e3('c'); // 'char' can be converted to both 'int' and 'double' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值