• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • c++面向對象的編程入門篇--類構造函數與析構函數

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    請注意,這一節內容是c++的重點,要特別注意! 我們先說一下什么是構造函數? 上一個教程我們簡單說了關于類的一些基本內容,對于類對象成員的初始化我們始終是建立成員函數然后手工調用該函數對成員進行賦值的,那么在c++中對于類來說有沒有更方便的方式能夠
    請注意,這一節內容是c++的重點,要特別注意!


    我們先說一下什么是構造函數?

    上一個教程我們簡單說了關于類的一些基本內容,對于類對象成員的初始化我們始終是建立成員函數然后手工調用該函數對成員進行賦值的,那么在c++中對于類來說有沒有更方便的方式能夠在對象創建的時候就自動初始化成員變量呢,這一點對操作保護成員是至關重要的,答案是肯定的關于c++類成員的初始化,有專門的構造函數來進行自動操作而無需要手工調用,在正式講解之前先看看c++對構造函數的一個基本定義。

    1.C++規定,每個類必須有默認的構造函數,沒有構造函數就不能創建對象。

    2.若沒有提供任何構造函數,那么c++提供自動提供一個默認的構造函數,該默認構造函數是一個沒有參數的構造函數,它僅僅負責創建對象而不做任何賦值操作。

    3.只要類中提供了任意一個構造函數,那么c++就不在自動提供默認構造函數。

    4.類對象的定義和變量的定義類似,使用默認構造函數創建對象的時候,如果創建的是靜態或者是全局對象,則對象的位模式全部為0,否則將會是隨即的。



    我們來看下面的代碼:


    //程序作者:管寧
    //站點:www.cndev-lab.com
    //所有稿件均有版權,如要轉載,請務必著名出處和作者

    #include <iostream>
    using namespace std;
    class Student
    {
    public:
    Student()//無參數構造函數
    {
    number = 1;
    score = 100;
    }
    void show();

    protected:
    int number;
    int score;

    };

    void Student::show()
    {
    cout<<number<<endl<<score<<endl;
    }

    void main()
    {
    Student a;
    a.show();
    cin.get();
    }



    在類中的定義的和類名相同,并且沒有任何返回類型的Student()就是構造函數,這是一個無參數的構造函數,他在對象創建的時候自動調用,如果去掉Student()函數體內的代碼那么它和c++的默認提供的構造函數等價的。

    構造函數可以帶任意多個的形式參數,這一點和普通函數的特性是一樣的!

    下面我們來看一個帶參數的構造函數是如何進行對象的始化操作的。

    代碼如下:


    //程序作者:管寧
    //站點:www.cndev-lab.com
    //所有稿件均有版權,如要轉載,請務必著名出處和作者

    #include <iostream>
    using namespace std;
    class Teacher
    {
    public:
    Teacher(char *input_name)//有參數的構造函數
    {
    name=new char[10];
    //name=input_name;//這樣賦值是錯誤的
    strcpy(name,input_name);
    }
    void show();

    protected:
    char *name;

    };

    void Teacher::show()
    {
    cout<<name<<endl;
    }

    void main()
    {
    //Teacher a;//這里是錯誤的,因為沒有無參數的構造函數
    Teacher a("test");
    a.show();
    cin.get();
    }


    我們創建了一個帶有字符指針的帶有形參的Teacher(char *input_name)的構造函數,調用它創建對象的使用類名加對象名稱加擴號和擴號內參數的方式調用,這和調用函數有點類似,但意義也有所不同,因為構造函數是為創建對象而設立的,這里的意義不單純是調用函數,而是創建一個類對象。

    一旦類中有了一個帶參數的構造函數而又沒無參數構造函數的時候系統將無法創建不帶參數的對象,所以上面的代碼

    Teacher a;

    就是錯誤的?。?!

    這里還有一處也要注意:

    //name=input_name;//這樣賦值是錯誤的

    因為name指是指向內存堆區的,如果使用name=input_name;會造成指針指向改變不是指向堆區而是指向棧區,導致在后面調用析構函數delete釋放堆空間出錯!(析構函數的內容我們后面將要介紹)

    如果需要調用能夠執行就需要再添加一個沒有參數的構造函數

    對上面的代碼改造如下:


    //程序作者:管寧
    //站點:www.cndev-lab.com
    //所有稿件均有版權,如要轉載,請務必著名出處和作者

    #include <iostream>
    using namespace std;
    class Teacher
    {
    public:
    Teacher(char *input_name)
    {
    name=new char[10];
    //name=input_name;//這樣賦值是錯誤的
    strcpy(name,input_name);
    }
    Teacher()//無參數構造函數,進行函數重載
    {

    }
    void show();

    protected:
    char *name;

    };

    void Teacher::show()
    {
    cout<<name<<endl;
    }

    void main()
    {
    Teacher test;
    Teacher a("test");
    a.show();
    cin.get();
    }

    創建一個無闡述的同名的Teacher()無參數函數,一重載方式區分調用,由于構造函數和普通函數一樣具有重載特性所以編寫程序的人可以給一個類添加任意多個構造函數,來使用不同的參數來進行初始話對象!

    本新聞共4頁,當前在第1頁  1  2  3  4  

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>