from http://hi.baidu.com/cosmicocean/blog/item/e9f85b2340cc87549822edfa.html
1、每个类必须有一个构造函数,否则没法创建对象;
2、若programer没有提供任何构造函数,则C++提供一个默认的构造函数,该默认构造函数是无参构造函数,它仅负责创建对象,不做任何初始化的工作;
3、只要programer定义了一个构造函数(不管是无参还是有参构造),C++就不再提供默认的默认构造函数。即如果为类定义了一个带参的构造函数,还想要无参构造函数,就必须自己定义;
4、与变量定义类似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则,对象值是随机的。
注:2所述,C++在某些情况下会提供默认构造函数,但在某些情况下并不会自动调用。
实事上,当用户没有提供自定义的构造函数的时候,声明该类的对象,以及定义包含该对象的数组,都不会调用默认构造函数;但定义包含该对象的容器时,会自动调用默认的构造函数。
举例如下:
#include <iostream>
#include <vector>
using namespace std;
class Student
{
public:
// Student() : val(6){} // 1
// Student(int val) : val(6){} // 2
int val;
ostream& Print(ostream& o) const
{
o<<"["<<val<<"]"<<endl;
return o;
}
};
ostream& operator<<(ostream& o, const Student& s)
{
return s.Print(o);
}
void main()
{
cout <<" ------------------0"<<endl;
Student s;
cout << s.val<<endl; // 编译通过,但运行时出错:the variable 's' is being used without being initialized.
// 说明没有调用默认构造函数
cout <<" ------------------1"<<endl;
Student arr[4];
cout << arr[2]<<endl; // 编译通过,但运行出错:the variable 'arr' is being used without being defined.
// 说明没有调用默认构造函数
cout <<" ------------------2"<<endl;
vector<Student> vec(5);
cout << vec[3].val << endl; //运行无误,但输出结果未定义(取决于编译器,可能是随机值或0)
// 说明调用了默认构造函数
cout <<" ------------------3"<<endl;
Student *ptr = new Student[4];
cout << ptr[1].val<<endl; //运行无误,但输出结果未定义(取决于编译器,可能是随机值或0)
// 说明调用了默认构造函数
cout <<" ------------------4"<<endl;
Student ss = Student(); // 显示调用
cout << ss.val<<endl; // 运行无误,但输出结果未定义(取决于编译器,可能是随机值或0)
// 说明调用了默认构造函数
}
若将Student定义体中的注释1去掉,即自定义无参构造函数,则main函数中的几种形式的对象定义都会调用该自定义的无参构造函数;
但只将注释2去掉,即自定义带参构造,而不提供无参构造,则main函数的几种形式的对象定义都将因为没有可用的默认构造函数而编译出错。
vc2005下的执行结果:
如果使用
class Student {
// Student() : val(6){} // 1
// Student(int val) : val(6){} // 2
};的结果:
------------------0
-858993460
------------------1
[-858993460]
------------------2
0
------------------3
-842150451
------------------4
0
--------------------------------------------------------------------
如果使用
class Student {
Student() : val(6){} // 1
// Student(int val) : val(6){} // 2
};的结果:
------------------0
6
------------------1
[6]
------------------2
6
------------------3
6
------------------4
6
--------------------------------------------------------------------
如果使用
class Student {
// Student() : val(6){} // 1
Student(int val) : val(6){} // 2
};的结果:
除vector<Student> vec(5);这一处之外的其他4处提示:error C2512: “Student”: 没有合适的默认构造函数可用
--------------------------------------------------------------------