1. 程式人生 > >C++ 類的6個預設函式

C++ 類的6個預設函式

在C++中預設產生6個類成員函式,即預設函式,它們分別是:

  1. 預設建構函式
  2. 預設拷貝建構函式
  3. 預設解構函式
  4. 預設賦值運算子
  5. 預設取址運算子
  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指標)