關於牛客網刷題後的簡單總結
阿新 • • 發佈:2018-12-16
牛客網刷題總結-C++面向物件
- C++類的資料成員的儲存型別,不能是auto、register和extern:
原因:auto/register/extern表示的是變數的儲存位置和作用域。auto變數儲存在函式的堆疊空間,register儲存在暫存器,extern表示這裡沒有新定義變數,只是擴充套件了一個已有全域性變數的作用域。類和結構體中的變數是成員變數,其儲存位置和作用域由定義物件的函式決定,不由這些物件自己決定。 - 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()編譯錯誤。