面向對象簡介及c++類的四個默認成員函數

1、什麼是面向對象?

面向對象程序設計
概念:(Object Oriented Programming,縮寫:OOP)是一種程序設計範型,同時也是一種程序開發的方法。 對象指的是類的實例,將對象作爲程序的基本單元,將程序和數據封裝其中,以提高軟件的重用性、靈活性和擴展性。
C++不是純面嚮對象語言,而是基於面向對象的語言 (ps:因爲它包含C的部分,C是面向過程)
面向對象的三大特性: 封裝、繼承、多態

2、類的大小?爲什麼要內存對齊?內存對齊的計算?空類的計算

1) 每個對象的大小爲類中所有成員變量的大小之和,當然這裏也遵循內存對齊原則。
內存對齊原則請查看:http://blog.csdn.net/adzn1/article/details/78619851
2)內存對齊是爲了提高程序運行速度(浪費空間換時間)

這裏寫圖片描述

3)空類的大小爲1

3、隱含的this指針
這裏寫圖片描述

4、四個默認成員函數詳解
1、構造函數

成員變量爲私有的,要對它們進行初始化,必須用一個公有成員函數來進行。同時這個函數應該有且僅在頂yi時自動執行一次。
特點:
1)函數名與類名相同;
2)無返回值
3)對象構造時系統自動調用對應的構造函數
4)可以重載
5)可在類內定義,也可在類外定義
6)若在類中沒有定義構造函數,則c++編譯器自動產生一個缺省的構造函數,定義了系統就不會自動產生。
7)無參的構造函數和全缺省值的構造函數都認爲是缺省構造函數,並且缺省的構造函數只能有一個。

無參構造函數&帶參的構造函數
class Date
 {
  public :    
   // 1.無參構造函數 
       Date () 
      {}
   // 2.帶參構造函數     
   Date (int year, int month , int day )                    {          
   _year = year ;          
   _month = month ;          
   _day = day ;    
   } 
   private :
   int _year ;     
   int _month ;     
   int _day ; 
   };
void TestDate1 () 
{
        Date d1 ;          // 調用無參構造函數        Date d2(2015, 1, 1);   // 調用帶參的構造函數
}
帶缺省參數的構造函數
class Date 
{
 public :     
 // 3.缺省參數的構造函數     
 Date (int year = 2000, int month = 1, int day = 1)    
 {          
 _year = year ;          
 _month = month ;          
 _day = day ;    
 }

2、拷貝構造函數
創建對象時使用同類來進行初始化,這時所用的構造函數稱爲拷貝構造函數,拷貝構造函數是特殊的構造函數。
特徵:
1)拷貝構造函數其實是一個構造函數的重載。
2)拷貝構造函數的參數必須使用引用傳參,使用傳值方式會引發無窮遞歸引用。
3)若未寫,系統會默認缺省的拷貝構造函數,依次拷貝類成員進行初始化。

class Date 
{ 
    public :
     Date()
         {}
     // 拷貝構造函數  
     Date (const Date& d)
            {          
            _year = d ._year;          
            _month = d ._month;         
             _day = d ._day;    
             } 
     private :     
     int _year ;     
     int _month ;     
     int _day ; 
   };

     void TestDate1 () 
     {     
     Date d1 ;// 下面兩種用法都是調用拷貝構造函數,是等價的。
     Date d2 (d1);    // 調用拷貝構造函數     
     Date d3 = d1;    // 調用拷貝構造函數 
     }

3、析構函數:
當一個對象的生命週期結束時,C++編譯系統會自動調用一個成員函數,這個特殊的成員函數即析構函數
特徵:
1、析構函數在類名加上字符~;
2、析構函數無參數無返回值。
3、一個類有且只有一個析構函數,若未顯示,系統會自動生成缺省的析構函數
4、對象生命週期結束時,c++編譯系統自動調用析構函數
5、注意析構函數體內並不是刪除對象,而是做一些清理工作
先構造後析構,後析構先構造

class Date 
{
 public :     // 析構函數    
 ~Date()    
 {} 
 private :     
 int _year ;    
 int _month ;     
 int _day ; 
 };
EXP0
class Array 
{
 public :    
 Array (int size)    
 {          
 _ptr = (int *)malloc( size*sizeof (int));    
 }
     // 這裏的析構函數需要完成清(shi)理(fang)工(kong)作(jian)。    
     ~ Array ()    
    {          
     if (_ptr )         
     {              
     free(_ptr );              
     _ptr = 0;         
     }    
    } 
   private :     
   int* _ptr ; 
};

4、運算符重載:
爲了增強程序的可讀性,C++支持運算符重載。
運算符重載特徵:
1. operator+ 合法的運算符 構成函數名(重載<運算符的函數名:operator< )。
2. 重載運算符以後,不能改變運算符的優先級/結合性/操作數個數。
筆試題考點 5個C++不能重載的運算符:
.*/::/sizeof/?:/.
【賦值運算符重載】
拷貝構造函數是創建的對象,使用一個已有對象來初始化這個準備創建的對象。 賦值運算符的重載是對一個已存在的對象進行拷貝賦值。

class Date 
{
 public :     
 Date()   
  {}
     // 拷貝構造函數    
      Date (const Date& d)         
       _year(d._year)         
       _month(d._month)         
        _day(d._day)    
{}
     // 賦值操作符的重載     
     // 1.思考爲什麼operator=賦值函數需要一個 Date&的返回值,使用void做返回值可以嗎?請驗證    
      Date& operator = (const Date& d)   
       {           
        // 2.這裏的if條件判斷是在檢查什麼?          
        if (this != &d)        
         {              
         this->_year = d. _year;              
         this->_month = d. _month;              
         this->_day = d. _day;         
         }
          return *this ;    
          } private:     
          int _year ;     
          int _month ;     
          int _day ; 
       };
void Test () 
{     
     Date d1 ;     
     Date d2 = d1; // 調用拷貝構造函數
     Date d3 ;     
     d3 = d1 ;    // 調用賦值運算符的重載
}

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章