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函數的幾種形式的對 象定義都將因為沒有可用的默認構造函數而編譯出錯。