关于默认构造函数,有趣的事

2013年5月4日 由 Creater 留言 »

构造函数,大家都很熟悉,但是关于默认构造函数,那就更有趣了,看代码:

#include <iostream>
using namespace std;
class A  
{  
public:  
    A(){}    //1
    A(int){}  //2
    ~A(){}
};  

int main()
{
	A a1;
	A a2(10);
	A a3();
	A a4(a2);
	return 0;
}

这段代码是有错误的,具体什么错误,等下再解释。
a1的定义是正确的,会默认调用1
a2的定义是正确的,会调用2
a3的定义是错误的
a4的定义是正确的,编译器生成拷贝构造函数。

那么为什么a3是错误呢?本意是想通过默认构造函数来定义对象a3,但是正是这个默认构造函数引发错误。看代码:

#include <iostream>
using namespace std;
class A  
{  
public:  
    A(){}  
    A(int){}  
    ~A(){}
};  

A a3()
{
}
int main()
{
	A a1;
	A a2(10);
	A a3();
	A a4(a2);
	return 0;
}

到这里,对于你自己来说,可能这么认为:a3是有歧义的,可以当作函数的声明,又可以当作定义对象。实际上这里只会当作函数声明,而不会当作定义,在这里a3的类型为返回值为Test的函数。

结论:在使用默认构造函数定义对象时,一定不要使用()来企图调用默认构造函数,而是直接写对象名即可。
再说直白点:默认构造函数不能手动调用,而是由编译器来自动调用。
但是在定义指针的时候,这是可以有的。比如Test *a3 = new Test();

广告位

发表评论

你必须 登陆 方可发表评论.