1. 程式人生 > >關於牛客網刷題後的簡單總結

關於牛客網刷題後的簡單總結

牛客網刷題總結-C++面向物件


  1. C++類的資料成員的儲存型別,不能是auto、register和extern:
    原因:auto/register/extern表示的是變數的儲存位置和作用域。auto變數儲存在函式的堆疊空間,register儲存在暫存器,extern表示這裡沒有新定義變數,只是擴充套件了一個已有全域性變數的作用域。類和結構體中的變數是成員變數,其儲存位置和作用域由定義物件的函式決定,不由這些物件自己決定。
  2. class A{
    };
    class B{
    char ch;
    int x;
    };
    class C{
    public:
    void Print(void){}
    };
    class D
    {
    public:
    virtual void Print(void){}
    };`下面四個類A,B,C,D,在32位機器上sizeof(A),sizeof(B),sizeof©,sizeof(D)值分別為()
    類A空型別的例項雖然不包含任何資訊,但是必須在記憶體中佔一定的空間,否則無法使用這些例項,一般都是1
    類B因為記憶體對齊所以為8,
    類C裡面雖然有函式,但是隻需要知道函式的地址即可,而這些函式的地址只與型別相關,而
    與型別的例項無關,編譯器不會因為函式而在記憶體中多新增任何的額外資訊.所以還是1
    類D因為有虛擬函式,C++的編譯器一旦發現一個型別中有虛擬函式,就會為該型別生成虛擬函式表,並在該型別的
    每一個例項中新增一個指向虛擬函式表的指標.因為多了一個指標,所以在32位機器為4,64位機器為8

在這裡插入圖片描述

Foo b(); 聲明瞭返回型別為Foo,引數為空的函式。因此導致b.fun()編譯錯誤。