再此記錄自己學習的過程,如有錯誤,歡迎大家指出。
類的構造函數是類的一種特殊的成員函數,它會在每次創建類的新對象時執行。
構造函數的名稱與類的名稱是完全相同的,並且不會返回任何類型,也不會返回 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;
}
分析結果