一:默认构造函数(default constructor)的定义
就是在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。如果定义某个类的变量时没有提供初始化时就会使用默认构造函数。(摘自百度百科)
由以上定义可得默认构造函数分两种:1,不带参的构造函数。2,所有形参提供默认实参的构造函数。
二:问题
如果一个类中上述两种构造函数共存,那么哪一个是默认构造函数呢?
如下面的代码块
#include <iostream>
using namespace std;
class A
{
private:
int a;
public:
A(){cout<<"First"<<endl;}
A(int ta=1){a=ta;cout<<"Second:a="<<a<<endl;}
};
int main()
{
// A a1;//compile failure
A a2();
A a3(10);
return 0;
}
在类A中有两个显示的构造函数,A()和A(int ta = 1)。按照定义,两个都是默认构造函数。
在main函数中。我实例化对象a1,a2,a3。
先PO结果
result:
Second:a=10
实例化a1:编译出错。理由是:error: call of overloaded 'A()' is ambiguous|(重载的A()调用模糊);
实例化a2:编译正确。调用隐士的构造函数(即非上述两个构造函数),没有任何输出。
实例化a3:编译正确。调用A(int ta = 1),输出“Second:a=10”
问题1:实例化a2可以调用A(),A(int ta = 1)两个显示的构造函数,为什么调用隐式构造函数呢?
问题2:实例化a1时编译器的error提示什么意思?模糊指的是哪几个构造函数模糊?为什么这种模糊不会在实例化a2的时候出现呢?
以上问题,百思不得解。还请前辈不吝指导。