1. 程式人生 > >C++之類與函式

C++之類與函式

1.類的作用域:①每個類都有自己的作用域,類成員都在類的作用域內,成員函式內可任意訪問成員變數和其他成員函式②物件可以通過.直接訪問公有成員,指向物件的指標通過->也可以直接訪問物件的公有成員③在類體外定義成員,需要使用 :: 作用域解析符指明成員屬於哪個類域。

//類體外定義成員

class Student{

    public:

            char* _name;

    public:

            void show();

}

void Student::show()

{

    cout<<_name<<endl;

}

//類內定義成員函式

class Student{

    public:

            char* _name;

    public:

            void show()

            {

                cout<<_name<<endl;

            }

}


int main()

{

    Student s1;

    s1._name="peter";

    s1.show();

    Student s2;

    s2._name="edwin";

    s2.show();

    return 0;

}

2.沒有成員的類空間大小為1

        結構體記憶體對其規則: ①第一個成員在與結構體變數偏移量為0的地址處。②其他成員變數要對齊到某個數字(對齊數)的整數倍的地址處。對齊數 = 編譯器預設的一個對齊數 與 該成員大小的較小值。 VS中預設的值為8    gcc中的預設值為4 ③結構體總大小為最大對齊數(每個成員變數除了第一個成員都有一個對齊數)的整數倍。 ④如果嵌套了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體 的對齊數)的整數倍。

3.隱含的this指標:①每個成員都有一個指標形參②編譯器會對成員函式進行處理,在物件呼叫成員函式時,物件地址作實參傳遞給成員函式的第一個形參this指標。③this指標是成員函式隱含指標形參,我們不能在成員函式的形參中新增this指標的引數定義,也不能在呼叫時 顯示傳遞物件的地址給this指標。

void display()

{

    cout<<_year<<endl;

}

void display(data*  this)

{

    cout<<this->_year<<endl;

}


4.建構函式:成員變數變成私有的,需對它們進行初始化化,必須用一個公有成員函式來進行。同時這個函式應該有且僅在定義物件時自動執行一次,這時 呼叫的函式稱為建構函式(constructor) 

   建構函式是特殊的成員函式:①函式名與類名同名②無返回值③建構函式可以過載④物件構造(物件例項化)時系統自動呼叫對應的建構函式⑤ 建構函式可以在類中定義,也可以在類外定義⑥如果類定義中沒有給出建構函式,則C++編譯器自動產生一個預設的建構函式,但只要我們定義了一個建構函式,系統就不會自動 生成預設的建構函式⑦無參的建構函式和全預設值的建構函式都認為是預設建構函式,並且預設的建構函式只能有一個

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);   // 呼叫帶參的建構函式    

     Date d3 ();        // 注意這裡沒有呼叫d3的建構函式定義出 d3

}

帶預設引數的建構函式:

class Date {

     public :     // 3.預設引數的建構函式  

   Date (int year = 2000, int month = 1, int day = 1)   

   {      

    _year = year ;       _month = month ;      _day = day ;    

   }

     // 4.半預設引數的建構函式(不常用)    

 Date (int year, int month = 1)  

  {    

      _year = year ;          _month = month ;          _day = 1; 

  } 

 private :    

     int _year ;     int _month ;     int _day ;

 };

void Test() {  

   Date d1 ;               // 呼叫預設建構函式   

  Date d2 (2015, 1, 9);   // 呼叫預設建構函式

 }

注:若預設引數宣告和定義分離,則可以在宣告或定義中給預設參

5.拷貝建構函式(建立物件時使用同類物件來進行初始化,這時所用的建構函式稱為拷貝建構函式(Copy Constructor),拷貝建構函式是特殊的建構函式。):一個建構函式的過載。建構函式無this。它的引數傳參必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。若未顯示定義,系統會預設預設的拷貝建構函式。預設的拷貝建構函式會,依次拷貝類成員進行初始化。

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;    // 呼叫拷貝建構函式

 }

eg;

class date

{

    public:

        date(const date& d)

        {

            _year=d._year;

            _month=d._month;

            _day=d._day;

        }

}

        在類的成員變數中可以直接訪問同類物件的私有/保護成員,C++的訪問限定符是以類為單位的,也就是說在這個單位內的成員可以互相訪問。