類的數據成員是不能在聲明的時候初始化的,因爲類並不是一個實體,而是一種抽象類型,並不佔用內存空間,顯然無法容納數據。
如果一個類的成員都是共有的,則可以這樣定義:
#include <iostream>
using namespace std;
class A
{
public:
int a_, b_, c_;
void display()
{
cout<<a_<<" "<<b_<<" "<<c_<<endl;
}
};
int main()
{
A a={1,2,3}; //一般都不這樣,這樣破壞了類的封裝
a.display();
return 0;
}
構造函數是一種特殊的成員函數,與其他成員函數不同,不需要用戶來調用,而是在建立對象時自動執行。保證類的每個成員變量都能正確的初始化。
構造函數的名字必須與類名相同,無返回值類型
注意:
(1)在類對象進入作用域時調用構造函數
(2)構造函數沒有返回值,因此不需要再定義構造函數時聲明類型,void也不要
(3)不能被用戶調用,系統自動調用。
(4)一般構造函數定義爲public,也有private(比如singleton模式)
(5)如果用戶沒有定義構造函數,系統會默認添加一個空的無參的構造函數,一旦用戶定義了,系統就不會提供
(6)可以有任意個數的參數,可以重載
(7)默認參數的構造函數最好不要和構造函數的重載一塊使用,以免產生二義性
析構函數:當對象的生命週期結束時,會自動執行析構函數。
無返回值,無參數,無函數類型,由於沒有參數,所以就不能被重載。
析構函數可以顯式的調用
一般情況下:先構造的後析構,後構造的先析構,具體情況還要看對象的作用域
#include <iostream>
using namespace std;
class Time
{
public:
Time()
{
hour_ = 0;
minute_ = 0;
second_ = 0;
cout<<"Init"<<" "<<hour_<<endl;
}
Time(int hour) //構造函數重載
{
hour_ =hour;
minute_ = 0;
second_ = 0;
cout<<"Init"<<" "<<hour_<<endl;
}
Time(int hour, int minute):hour_(hour),minute_(minute),second_(0) //初始化列表,對const成員必須使用初始化列表初始化
{
cout<<"Init"<<" "<<hour_<<endl;
}
Time(int hour, int minute, int second) //構造函數的重載
{
hour_ = hour;
minute_ = minute;
second_ = second;
cout<<"Init"<<" "<<hour_<<endl;
}
~Time()
{
cout<<"destoryed"<<" "<<hour_<<endl;
}
private:
int hour_;
int minute_;
int second_;
};
Time T4(30); //Init 30 ,先於main函數
int main()
{
cout<<"begin main"<<endl;
Time t; //Init 0說明構造函數是自動調用的
Time t5(); //error不是創建對象的方式 雖然不報錯,但是這句是不調用構造函數的,這句的意思是聲明瞭一個普通函t5,返回值類型爲Time
Time t1(12,12,12); //Init 12
Time *t2 = new Time(10); //Init 10調用構造函數,()是傳參
Time *t3 = new Time[3]; //定義一個包含三個Time類的數組 【】是數組元素個數
//Time a[3] = {12,12,12}; //容易引起歧義,最好不要這樣定義
//t.Time(); //構造函數不能顯示的調用,且每個對象只能調用一次構造函數
delete t2;
delete[] t3;
cout<<"main end"<<endl;
return 0;
}
程序運行結果見下圖