1. 程式人生 > >類與物件2

類與物件2

一、類的6個預設成員函式
在這裡插入圖片描述

建構函式是特殊的成員函式,他是一種隨物件建立二自動被呼叫的公有成員函式,有且僅在定義物件的時候執行一次,用途是為物件初始化。
特徵:
1.可以初始化私有的成員變數;
2.函式名就是類名;
3.無返回值;
4.可以過載;
5.類中和類外定義均可;
6.如果類中沒有給出建構函式,那麼編譯器就會自動產生一個預設的建構函式(同第一點所說的預設成員函式),但是隻要給出了建構函式,那麼類中就不會自動生成預設建構函式;
7.無參建構函式和全預設值的建構函式都被認為是預設建構函式。
(1)無參建構函式

class Date
{
public:
 //無參建構函式
 Date()
 {}
private:
 int _year;
 int _month;
 int _day;
}
int main()
{
 Date d1;//呼叫無參建構函式
 return 0;
}

(2)帶參建構函式

class Date
{
public:
 Date(int year, int month, int day)
 {
  _year = year;
  _month = month;
  _day = day;
 }
private:
 int _year;
 int _month;
 int _day;
}
int main()
{
 Date d2(2018,11,06);//呼叫帶參建構函式
 return 0;
}

(3)帶預設引數的建構函式

class Date
{
public:
 Date(int year = 2018, int month = 11, int day = 06)
 {
  _year = year;
  _month = month;
  _day = day;
 }
private:
 int _year;
 int _month;
 int _day;
}
int main()
{
 Date d3;//呼叫帶預設引數建構函式
 return 0;
}

二、解構函式
當一個物件的生命週期結束時,編譯器會自動生成一個這個成員函式,類似於C語言中釋放記憶體的效果,但是解構函式不是刪除物件,只是做刪除物件前的清理工作。另外注意,當未開闢新的記憶體空間時,解構函式基本不用,解構函式在之後動態記憶體開闢時會再次用到。
特徵:
1.類名前加上~就是解構函式;
2.無引數無返回值;
3.一個類有且只有一個(若是未定義,編譯器會自動生成一個預設的解構函式)。

class Date
{
public:
 Date(int year = 2018, int month = 11, int day = 06)
 {
  _year = year;
  _month = month;
  _day = day;
 }
 //解構函式
 ~Date()
 {}
private:
 int _year;
 int _month;
 int _day;
}
int main()
{
 Date d3;
 return 0;
}

四、類的拷貝建構函式(複製建構函式)
特徵:
1.函式名同構造函式名,引數不同;
2.建立類物件時用同類物件進行初始化;
3.引數只有一個且必須要用引用傳參,否則會引起無窮遞迴(就是無窮呼叫自己);
4.若未顯示定義,編譯器也會產生一個預設拷貝建構函式,按照成員的宣告次序依次拷貝類成員進行初始化。

class Date
{
public:
 Date()
 {}
 //拷貝建構函式
 Date(const Date &d)
 {
  _year = d._year;
  _month = d._month;
  _day = d._day;
 }
private:
 int _year;
 int _month;
 int _day;
}
int main()
{
 Date d;
 return 0;
}

五、操作符過載
特徵:
1.operator+合法的運算子 構成函式名
2.過載以後不能改變優先順序/結合性/運算元個數

class Date
{
public:
 Date()
 {}
 Date(const Date &d)
 {
  _year = d._year;
  _month = d._month;
  _day = d._day;
 }
 bool operator == (const Date &d)
 {
  return _year == d._year 
   && _month == d._month 
   && _day == d._day;
 }
private:
 int _year;
 int _month;
 int _day;
}
int main()
{
 Date d1;
 Date d2 = d1;//呼叫拷貝建構函式
 d2 == d1;//呼叫“==”運算子
 return 0;
}

還有其他的操作符在部落格主頁會全部整理。
六、類的const成員函式
const修飾類成員:
1.const修飾類的成員變數,該變數必須在建構函式的初始化列表中初始化;
2.const修飾類的成員函式,實際修飾成員函式隱含的this指標,該成員函式中不能對類的任何成員進行修改。
3.在const修飾的成員函式可能需要對類的某個成員變數進行修改,該成員變數只需被mutable關鍵字修飾即可。

class Date 
{ 
public:  
 void Display()  
 {   
   cout << "Display()" << endl;
   cout << "year:" << _year << endl;
   cout << "month:" << _month << endl;
   cout << "day:" << _day << endl;
   }
  void Display() const
  {
  cout << "Display() const" << endl;
  cout << "year:" << _year << endl;
  cout << "month:" << _month << endl;
  cout << "day:" << _day << endl << endl;
  }
private:
 int _year;
 int _month;
 int _day;
 };
 void Test()
 { 
 Date d1;
 d1.Display();
 const Date d2;
 d2.Display();
}
int main()
{
 Test();
 system("pause");
 return 0;
}

七、類的取地址操作符過載&const修飾的取地址操作符過載
這兩個預設成員一般不用重新定義,編譯器會預設生成。
只有一種情況下,才會需要過載這兩個操作符,那就是你只想讓別人獲取你指定的內容!