C++ 類的6個預設函式
阿新 • • 發佈:2019-01-08
在C++中預設產生6個類成員函式,即預設函式,它們分別是:
- 預設建構函式
- 預設拷貝建構函式
- 預設解構函式
- 預設賦值運算子
- 預設取址運算子
- 預設取地址運算子const
很多人以為只有前4個預設函式,事實上有6個。
程式碼驗證如下:
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"建構函式"<<endl;
}
~A()
{
cout<<"希構函式"<<endl;
}
A(const A &)
{
cout<<"拷貝建構函式"<<endl;
}
A& operator=(const A &)
{
cout<<"賦值運算"<<endl;
}
A* operator&()
{
cout<<"取地址"<<endl;
}
const A* operator&()const
{
cout<<"const取地址"<<endl;
}
};
int main(int argc, char **argv)
{
A c1;
A c2 = c1;
c2 = c1;
A *pa = &c1;
const A c3;
const A * pb = &c3;
return 0;
}
可見,我們在沒有寫函式功能的情況下,進行構造,析構,拷貝等等操作都是可以實現的,這就是6個預設函式的功勞了。
注意,很多人在這裡有一個誤區。
是不是構造一個 空類,這個空類就已經有6個預設預設函數了?
這是錯誤的!請看程式碼:
#include <iostream>
using namespace std;
class A
{};
int main()
{
cout<<"空類A的大小:"<<sizeof(A)<<endl;
return 0;
}
測試空類的大小,得出: 空類A的大小為 1 。
對於空類,編譯器不會生成任何成員函式!只會生成1個位元組的佔位符。
空類也是可以被例項化的,而每個例項在記憶體中都是獨一無二的地址,為了達到這個目的,編譯器往往會給一個空類隱含的加一個位元組,這樣空類在例項化後就可以得到了獨一無二的地址,這就是一個佔位符的意義。
那麼什麼時候才會生成6個預設預設成員函式呢?
編譯器只會在需要的時候生成,也就是說,在第一個程式碼main()中:
A c1; 構造c1才會生成建構函式;
A c2 = c1; 拷貝構造c2時才會生成拷貝建構函式;
同樣析構c1,c2時,才會構造解構函式,依次類推~
(也會預設構造一個this指標)