1、每个类必须有一个构造函数,否则没法创建对象;
2、若programer没有提供任何构造函数,则C++提供一个默认的构造函数,该默认构造函数是无参构造函数,它仅负责创建对象,不做任何初始化的工作;
3、只要programer定义了一个构造函数(不管是无参还是有参构造),C++就不再提供默认的默认构造函数。即如果为类定义了一个带参的构造函数,还想要无参构造函数,就必须自己定义;
4、与变量定义类似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则,对象值是随机的。
注:2所述,C++在某些情况下会提供默认构造函数,但在某些情况下并不会自动调用。
实事上,当用户没有提供自定义的构造函数的时候,声明该类的对象,以及定义包含该对象的数组,都不会调用默认构造函数;但定义包含该对象的容器时,会自动调用默认的构造函数。
举例如下:
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
class Student
{
public:
// Student() : val(6){} // 1
// Student(int val) : val(6){} // 2
int val;
};
void main()
{
Student s;
cout << s.val; // 编译通过,但运行时出错:the variable 's' is being used without being defined.
// 说明没有调用默认构造函数
Student arr[4];
cout << arr[2]; // 编译通过,但运行出错:the variable 'arr' is being used without being defined.
// 说明没有调用默认构造函数
vector<Stu> vec(5);
cout << vec[3].val << endl; //运行无误,但输出结果未定义(取决于编译器,可能是随机值或0)
// 说明调用了默认构造函数
Student *ptr = new Student[4];
cout << ptr[1].val; //运行无误,但输出结果未定义(取决于编译器,可能是随机值或0)
// 说明调用了默认构造函数
Student ss = Student(); // 显示调用
cout << ss.val; // 运行无误,但输出结果未定义(取决于编译器,可能是随机值或0)
// 说明调用了默认构造函数
}
若将Student定义体中的注释1去掉,即自定义无参构造函数,则main函数中的几种形式的对象定义都会调用该自定义的无参构造函数;
但只将注释2去掉,即自定义带参构造,而不提供无参构造,则main函数的几种形式的对象定义都将因为没有可用的默认构造函数而编译出错。
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!