day4--C++,構造函數和析構函數

再此記錄自己學習的過程,如有錯誤,歡迎大家指出。

類的構造函數是類的一種特殊的成員函數,它會在每次創建類的新對象時執行。

構造函數的名稱與類的名稱是完全相同的,並且不會返回任何類型,也不會返回 void。構造函數可用於爲某些成員變量設置初始值。

接下來用實例來看看構造函數的作用。


#include <iostream>
#include <cstring>
using namespace std;
class Person  
{
private:
    char *name;
    int age;
    char *work;
public:
    void setName(char *name);
    void setAge(int age);
    void setWork(char *work);
    void cpp_printinfo(); //類中可以有函數成員
    //如果不聲明構造函數  構造函數任然存在,只不過是空函數 Person(){}
    Person(); //構造函數  可以重載
    Person(char *name);
    Person(char *name,int age,char *work="none");
   
};

int main(int argc,char **argv)
{
//創建不同的對象執行相對應的構造函數
    Person per1;//調用無參構造數  //在創建類的對象時  構造函數將會執行
    Person per2("c++");//創建這個對象時,調用Person(char *name);函數輸出對應語句
    Person per3("cpp",18);//創建這個對象時,Person(char *name,int age,char *work="none");函數輸出對應語句
   // 指針對象同上
    Person *per4 = new Person;
    Person *per5 = new Person();

    Person *per6 = new Person[2];

    Person *per7 = new Person("c",15,"language");
    Person *per8 = new Person("c++",10);

    delete per4;
    delete per5;
    delete []per6;
    delete per7;
    delete per8;
    return 0;
}
void Person::setName(char *name)
{
    this->name=name;//給人的感覺就是當前使用的對象的name等於這個形參的值,兩個是不一樣的
}
void Person::setAge(int age)
{
    this->age=age;
}
void Person::setWork(char *work)
{
    this->work=work;
}
void Person::cpp_printinfo() //類中可以有函數成員
{
  cout << "name=" <<this->name<<" age="<<this->age <<" work="<<this->work << endl;
}

Person::Person()
{
    this->name=NULL;
    this->work=NULL;
    cout<<"person()"<<endl;
}
Person::Person(char *name)
{
    cout<<"person(char)"<<endl;

    this->name=new char[strlen(name)+1];
    strcpy(this->name,name);
    this->work=NULL;
}
 Person::Person(char *name,int age,char *work)
{
    this->name=new char[strlen(name)+1];
    strcpy(this->name,name);

    this->age=age;

    this->work=new char[strlen(work)+1];
    strcpy(this->work,work);
    cout<<"Person(char *name,int age,char *work)"<<endl;
}

運行結果:在創建對象的時候自動執行構造函數


 

在上面的實例中,main函數中申請的空間被我們用delete釋放掉,但是類中得函數申請的空間沒有手動釋放,雖然在程序結束時會自動釋放空間,但是這是一種很危險的方法。C++提供了析構函數。

類的析構函數是類的一種特殊的成員函數,它會在每次刪除所創建的對象時執行。

析構函數的名稱與類的名稱是完全相同的,只是在前面加了個波浪號(~)作爲前綴,它不會返回任何值,也不能帶有任何參數。析構函數有助於在跳出程序(比如關閉文件、釋放內存等)前釋放資源。例如在建立對象時用new開闢了一片內存空間,應該調用delete手動釋放內存,否則即使某一子程序結束,析構函數也不會被調用,所以new出來的內存空間應該用delete手動釋放,delete會自動調用析構函數後釋放內存。


#include <iostream>
#include <cstring>
//#include <windows.h>
using namespace std;
class Person  
{
private:
    char *name;
    int age;
    char *work;
public:
    void setName(char *name);
    void setAge(int age);
    void setWork(char *work);
    void cpp_printinfo(); //類中可以有函數成員
    Person(); //構造函數  可以重載
    Person(char *name);
    Person(char *name,int age,char *work="none");
    ~Person();//析構函數
};

void test_Fun()
{
    cout<<"-----構造函數-----"<<endl;
    Person per1;//調用無參構造數  //在創建類的對象時  構造函數將會執行
    Person per2("c++");//創建這個對象時,調用Person(char *name);函數輸出對應語句
    Person per3("cpp",18);//創建這個對象時,Person(char *name,int age,char *work="none");函數輸出對應語句
   // 指針對象同上

    Person *per4 = new Person;
    Person *per5 = new Person();

    Person *per6 = new Person[2];

    Person *per7 = new Person("c",15,"language");
    Person *per8 = new Person("c++",10);
    cout<<"-----析構函數-----"<<endl;
    delete per4;//new 申請的空間在delete的時候會自動執行析構函數,根據對象構造函數的不同調用再析構函數執行時輸出不同的結果
    delete per5;
    delete []per6;
    delete per7;
    delete per8;
    //在刪除對象時也會自動執行析構函數  這裏將會執行per1   per2   per3的析構函數,根據對象構造函數的不同調用再析構函數執行時輸出不同的結果
}
int main(int argc,char **argv)
{
    test_Fun();
    return 0;
}
void Person::setName(char *name)
{
    this->name=name;//給人的感覺就是當前使用的對象的name等於這個形參的值,兩個是不一樣的
}
void Person::setAge(int age)
{
    this->age=age;
}
void Person::setWork(char *work)
{
    this->work=work;
}
void Person::cpp_printinfo() //類中可以有函數成員
{
  cout << "name=" <<this->name<<" age="<<this->age <<" work="<<this->work << endl;
}

Person::Person()
{
    this->name=NULL;
    this->work=NULL;
    cout<<"person()"<<endl;
}
Person::Person(char *name)
{
    cout<<"person(char)"<<endl;

    this->name=new char[strlen(name)+1];
    strcpy(this->name,name);
    this->work=NULL;
}
 Person::Person(char *name,int age,char *work)
{
    this->name=new char[strlen(name)+1];
    strcpy(this->name,name);

    this->age=age;

    this->work=new char[strlen(work)+1];
    strcpy(this->work,work);
    cout<<"Person(char *name,int age,char *work)"<<endl;
}
Person::~Person()
{

    if(this->name)
    {
        delete this->name;
        cout<<"delete name"<<endl;
    }
    if(this->work)
    {
        delete this->work;
        cout<<"delete work"<<endl;
    }
    cout<<"finally"<<endl;

}

分析結果

 

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