標籤:拷貝 記憶體釋放 兩種 分配 using 檢查 name 就是 names
對於一個空類,編譯器預設產生4個成員函數:預設建構函式、解構函式、拷貝建構函式和賦值函數。
1、建構函式:
建構函式是一種特殊的類成員,是當建立一個類的時候,它被調用來對類的資料成員進行初始化和分配記憶體。建構函式的命名必須和類名完全相同,建構函式可以被重載,可以多個,可以帶參數。
eg:
class A
{
public:
A(){cout<<"無參建構函式";}
A(int i){cout<<"帶參建構函式";}
};
A();//調用預設建構函式
A(1);//調用有參建構函式
建立一個對象就會調用無參建構函式,也就是預設建構函式,有參的建構函式需要自己調用。
2、解構函式
建構函式可以重載,解構函式不能重載,解構函式永遠只有一個,如果沒寫解構函式,c++會自動幫我們寫一個解構函式。
建構函式和解構函式是一對,建構函式用來建立對象,而解構函式是用來撤銷對象。
eg:
#include <iostream>using namespace std;class A{public:A(){cout<<"建構函式被調用了!"<<endl;}~A(){cout<<"解構函式被調用了"<<endl;}};int main(){A a;//調用建構函式和解構函式A *p=new A;//調用建構函式delete p;//調用解構函式return 0;}
3、拷貝建構函式
c++拷貝建構函式(深拷貝、淺拷貝)
4、賦值函數
當一個類的對象向該類的另一個對象賦值的時候,就會用到該函數。
當沒有重載賦值函數,通過預設的賦值函數進行賦值操作。
eg:
#include <iostream>using namespace std;class A{public:A(){cout<<"調用建構函式"<<endl;}A(char s){cout<<s<<"調用建構函式"<<endl;}~A(){cout<<"調用解構函式"<<endl;}};int main(){A a(‘a‘);A b(‘b‘);b=a;//a,b實際存在,再調用賦值函數,將a賦值給bA c(a);//拷貝建構函式return 0;}
拷貝函數和賦值函數的差別:
1、拷貝建構函式是一個對象初始化一塊記憶體地區,這塊記憶體就是新對象的記憶體區,而賦值函數是對於一個已經被初始化的對象進行賦值操作。
2、一般來說在資料成員包含指標對象的時候,需要考慮兩種不同的處理需求:一種是複製指標對象,另一種是引用指標對象。拷貝建構函式大多數情況下是複製,而賦值函數是引用函數。
3、實現不一樣。拷貝建構函式首先是一個建構函式,它調用的時候是通過參數的對象初始化產生一個對象。賦值函數則是把一個新的對象賦值給一個原有的對象,所以如果原來的對象中有記憶體配置要先把記憶體釋放掉,而且還要檢查一下兩個對象是不是同一個對象,如果是,不做任何操作,直接返回。
#include <iostream>using namespace std;class A{public:A(){cout<<"調用建構函式"<<endl;}A(char s){cout<<s<<"調用建構函式"<<endl;}A(const A &other);A & operator = (const A &a);//重載拷貝函數~A(){cout<<"調用解構函式"<<endl;}};A& A::operator =(const A &a){A example;cout<<"調用拷貝函數"<<endl;return example;}int main(){A a(‘a‘);A b(‘b‘);b=a;//a,b實際存在,再調用賦值函數,將a賦值給breturn 0;}
總結:
對象不存在,且用別的對象來初始化,就是調用了建構函式
對象不存在,且用別的對象來初始化,就是拷貝建構函式
對象存在,用別的對象來給它賦值,就是賦值函數
程式結束,每個對象都會調用解構函式
參考地址:52132936
C++中:預設建構函式、解構函式、拷貝建構函式和賦值函數——轉