類和物件經典面試題(一)

2021-09-22 02:41:21 字數 1395 閱讀 1798

已分配的原始記憶體空間呼叫建構函式初始化乙個物件

格式:new(place_address) type 或者new(place_address) type(initializer_list)

其中place_address必須是乙個指標,initializer_list是型別的初始化列表

使用場景:

一般配合記憶體池使用,因為記憶體池分配出的記憶體沒有初始化,所以如果是自定義型別的物件,需要使用new的定義表示式進行顯式呼叫建構函式進行初始化

void test()

在c++中類的物件建立分兩種,一種是靜態的建立如a a,另一種是動態建立,如a* ptr = new a;

區別:靜態建立乙個物件,是由編譯器為物件在棧空間中分配記憶體。是通過移動棧頂指標挪出適當的空間然後在這片記憶體空間上呼叫建構函式形成乙個棧物件(直接呼叫建構函式)

動態建立類物件,是使用new運算子將物件建立在堆空間中

執行operator new()函式,在堆空間中分配合適空間

呼叫建構函式構造物件,初始化這片記憶體空間

由此引出了乙個經典的面試題:

建立乙個類,只能在堆上建立物件

建立乙個類,只能在棧上建立物件

方法一:容易想到將建構函式私有化

建構函式私有化之後無法在類外部呼叫建構函式來構造類物件,只能用new運算子來建立物件,但是new運算子實際底層分兩步,在呼叫建構函式時因其已私有化所以無法呼叫

方法二:

當物件建立在棧上面時是由編譯器分配記憶體空間,呼叫建構函式來構造棧物件,當物件使用完之後編譯器會呼叫析構函式來釋放棧物件所佔的空間

假設類的析構函式私有,編譯器無法呼叫析構函式來釋放記憶體。所以**在為類物件分配棧空間時會先檢查類的析構函式的訪問性。**如果類的析構函式是私有的則編譯器不會在棧空間上為類物件分配記憶體

class a

void destroy()

private:

~a(){}

};

提供乙個static函式來完成構造

class a

void destroy()

private:

a(){}

~a(){}

a(const a&) = delete; //將編譯器預設生成的拷貝建構函式刪除掉,防止別人 //呼叫拷貝建構函式生成物件

}

只有使用new運算子物件才會建立在堆上。因此只要禁用new運算子就可以實現類物件只能建立在棧上,將operator new()設為私有即可。

經典面試題

1.以下三條輸出語句分別輸出什麼?char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout boolalpha str1 str2 ...

經典面試題

我的老同學現在富得流油。他開創了乙個軟體公司,開發了一系列軟體,生意越做越大。今天他來到這個城市後馬上打 給我。是我啊!聽出來了嗎?是這樣的,我到這兒的大學招畢業生,要在這兒呆上五天,咱哥們趁這個時間好好聚一聚。我做東!既然他要做東,我理所當然順水推舟。人家是老闆,不吃白不吃!我來到他下榻的賓館,看...

經典面試題

分兩個情況 perfork模式 worker模式 前者程序模式 後者執行緒模式 故檢視方法也有區別 oldboy.log 參考 分析 此類問題是運維工作中最常見的問題。可以演變成分析日誌,檢視tcp各個狀態連線數,檢視單ip連線數排名等等 第一類 過濾網域名稱方法 方法很多 這裡給出六種為例。還可以...