php外貿網(wǎng)站模板如何開發(fā)自己的小程序
一、構造函數(shù)
1.什么是構造函數(shù)
構造函數(shù)是特殊的成員函數(shù),需要注意的是,構造函數(shù)雖然名稱叫構造,但是構造函數(shù)的主要任 務并不是開空間創(chuàng)建對象,而是初始化對象。
2.特征
- 函數(shù)名與類名相同。
- 無返回值。(void 也不行)
- 對象實例化時編譯器自動調用對應的構造函數(shù)。
- 構造函數(shù)可以重載。
class Date
{
public://構造函數(shù)Date(int year ,int month , int day ){_year = year;_month = month;_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date d1(2023, 8, 12);d1.Print();}
除了上面,也可以用多種構造函數(shù),來完成初始化
class Date
{
public://構造函數(shù)Date(int year ,int month , int day ){_year = year;_month = month;_day = day;}//無參構造函數(shù)Date(){_year = 2023;_month = 4;_day = 17;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date d1(2023, 8, 12);d1.Print();Date d2;d2.Print();
}
但是當這樣寫的時候,就會出現(xiàn)問題
class Date
{
public://全缺省構造函數(shù)Date(int year = 1 ,int month = 1, int day = 1 ){_year = year;_month = month;_day = day;}//無參構造函數(shù)Date(){_year = 2023;_month = 4;_day = 17;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date d1(2023, 8, 12);d1.Print();Date d2;d2.Print();}
錯誤原因:對于不帶參數(shù)的對象,既可以調用全缺省構造,也可以調用無參構造,但是編譯器會不知道調用哪一個。
3.默認構造函數(shù)
如果類中沒有顯式定義構造函數(shù),則C++編譯器會自動生成一個無參的默認構造函數(shù),一旦用戶顯式定義編譯器將不再生成。
1、無參構造(沒有形參的構造函數(shù))稱之為默認構造函數(shù)
2、全缺省構造(形參都有缺省值)也稱之為默認構造函數(shù)
3、編譯器自動生成的默認構造函數(shù)
對于編譯器自己生成的,該類中的成員變量會被初始化為隨機值
class Date
{
public:全缺省構造函數(shù)//Date(int year = 1 ,int month = 1, int day = 1 )//{// _year = year;// _month = month;// _day = day;//}無參構造函數(shù)//Date()//{// _year = 2023;// _month = 4;// _day = 17;//}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{/*Date d1(2023, 8, 12);d1.Print();*/Date d2;d2.Print();return 0;
}
關于編譯器生成的默認成員函數(shù),很多人會有疑惑:不實現(xiàn)構造函數(shù)的情況下,編譯器會
生成默認的構造函數(shù)。但是看起來默認構造函數(shù)又沒什么用?
對象調用了編譯器生成的默認構造函數(shù),但是對象_year/_month/_day,依舊是隨機值。也就說在這里編譯器生成的默認構造函數(shù)并沒有什么用??
解答:C++把類型分成內置類型(基本類型)和自定義類型。內置類型就是語言提供的數(shù)據(jù)類
型,如:int/char…,自定義類型就是我們使用class/struct/union等自己定義的類型,看看
下面的程序,就會發(fā)現(xiàn)編譯器生成默認的構造函數(shù)會對自定類型成員_t調用的它的默認成員
函數(shù)。
class Time
{
public:Time(){cout << "Time()" << endl;_hour = 0;_minute = 0;_second = 0;}
private:int _hour;int _minute;int _second;
};class Date
{
public:全缺省構造函數(shù)//Date(int year = 1 ,int month = 1, int day = 1 )//{// _year = year;// _month = month;// _day = day;//}無參構造函數(shù)//Date()//{// _year = 2023;// _month = 4;// _day = 17;//}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private://內置類型int _year;int _month;int _day;//自定義類型Time _t;
};int main()
{/*Date d1(2023, 8, 12);d1.Print();*/Date d2;d2.Print();return 0;
}
說明:_year,_month,_day都是隨機值,而Time _t這個變量是class Time自定義類型,編譯器會走到Time類中,調用該類的構造函數(shù)。
typedef int STDateType;
class Stack
{
public:Stack(size_t capacity = 4){cout << "Stack()" << endl;_array = (STDateType*)malloc(sizeof(STDateType) * capacity);if (_array == nullptr){perror("malloc fail");return;}_capacity = capacity;_size = 0;}void Push(STDateType x){//CheckCapacity()_array[_size++] = x;}//析構函數(shù)~Stack(){cout << "~Stack()" << endl;free(_array);_array = nullptr;_capacity = _size = 0;}
private:STDateType* _array;int _capacity;int _size;
};class MyQueue
{Stack _pushST;Stack _popST;};int main()
{MyQueue q;return 0;
}
對于MyQueue來說,成員變量都為自定義類型,編譯時會去調用Stack中的構造函數(shù)
二、析構函數(shù)
1.定義
析構函數(shù)與構造函數(shù)功能相反,析構函數(shù)不是完成對對象本身的銷毀,局部對象銷毀工作是由編譯器完成的。而對象在銷毀時會自動調用析構函數(shù),完成對象中資源的清理工作。
2.特性
- 析構函數(shù)名是在類名前加上字符 ~。
- 無參數(shù)無返回值類型。
- 一個類只能有一個析構函數(shù)。若未顯式定義,系統(tǒng)會自動生成默認的析構函數(shù)。注意:析構 函數(shù)不能重載。
- 對象生命周期結束時,C++編譯系統(tǒng)系統(tǒng)自動調用析構函數(shù)。
typedef int STDateType;
class Stack
{
public:Stack(size_t capacity = 4){cout << "Stack()" << endl;_array = (STDateType*)malloc(sizeof(STDateType) * capacity);if (_array == nullptr){perror("malloc fail");return;}_capacity = capacity;_size = 0;}void Push(STDateType x){//CheckCapacity()_array[_size++] = x;}//析構函數(shù)~Stack(){cout << "~Stack()" << endl;free(_array);_array = nullptr;_capacity = _size = 0;}
private:STDateType* _array;int _capacity;int _size;
};class MyQueue
{Stack _pushST;Stack _popST;};int main()
{Stack s;s.Push(1);return 0;
}
析構函數(shù)的調用是在執(zhí)行return 0后,函數(shù)即將銷毀時自動調用它,然后堆區(qū)空間就會被釋放,且其他變量清零。
4.默認析構類型
默認析構函數(shù)與默認構造函數(shù)同理,都是我們不生成時,編譯器自動生成一個析構函數(shù),但編譯器生成的也只能處理一些簡單類型的成員變量,例如日期類:
class Date
{
public://全缺省構造函數(shù)Date(int year = 1 ,int month = 1, int day = 1 ){_year = year;_month = month;_day = day;}無參構造函數(shù)//Date()//{// _year = 2023;// _month = 4;// _day = 17;//}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private://內置類型int _year;int _month;int _day;//自定義類型Time _t;
};int main()
{Date d1(2023, 8, 13);return 0;
}
對于復雜類型的成員變量,編譯器自動生成的析構函數(shù)并不能完成最后的清理工作,比如:對于堆區(qū)空間的生成…所以還需要自己去寫析構函數(shù)