C 11的default和delete關鍵字

2022-09-24 02:24:09 字數 1666 閱讀 4553

c11的新特性實在是太多了,這2個關鍵字關注的人倒是少了很多,其中有乙個原因便是編譯器支援得太慢了(vs到vs2013才支援上),不過這2個關鍵字那真是極為有用的,下面我們來看看。

【default關鍵字】

首先我們有乙個字串類:

class cstring

//析構函式

~cstring()

public:

void updatestring(const char* pstr) throw()

public:

char* getstr() const throw()

};我們可以這樣使用:

auto str = std::make_unique("123");

printf(str->getstr());但是這樣是不行的:

auto str = std::make_unique(); //失敗,因為沒有乙個無參建構函式

好,我們用default來:

class cstring

//析構函式

~cstring()

public:

void updatestring(const char* pstr) throw()

public:

char* getstr() const throw()

};於是我們可以這樣使用了:

auto str_def = std::make_unique();

str_def->updatestring(「123」);

printf(str_def->getstr() == nullptr ? "none":str_def->getstr());

【delete關鍵字】

假設我們有這樣乙個類,這個類是用於自動申請記憶體,進行raii式管理:

(避免麻煩那些什麼拷貝構造拷貝賦值移動構造什麼的就不寫了)

template

class cstackmemoryalloctor

~cstackmemoryalloctor()

public:

operator t*() const throw()

public:

t* getptr() const throw()

};我們這樣使用這個類:

cstackmemoryalloctor str(128);

wchar_t* pstr = str.getptr();

wcscpy(pstr,l"123\n");

wprintf(pstr);

但是別人也可以這樣使用:

auto p = std::make_unique>(128);

因為這個類依然可以進行預設new,我們不想讓人家進行new怎麼辦,老辦法就是這樣:

private:

void* operator new(std::size_t)

把new設定為private了,就行了,但是這樣如果別人嘗試new,那看到的錯誤提示簡直慘不忍睹。。。

於是c11的delete人性化多了:

public:

void* operator new(std::size_t) = delete;

當嘗試new的時候,提示十分友好,這個方法已被刪除。

這個delete可以用來刪任何你不爽的東西,比如拷貝構造,賦值拷貝什麼**毛的東西。

C 11的default和delete的說明

在c 11標準中的描述是 default it means that you want to use the compiler generated version of that function,so you don t need to specify a body.delete it means...

C11編輯器公升級和C11標準使用

c11中的一些特性需要對應的編譯器才能支援。而有些系統預設的編譯器並不支援c11,所以需要4.8及其以上的版本。以下採用c11才支援的std unordered set來進行測試。include include include include include using namespace std ...

Code Blocks介紹和使用C 11

2 工程使用 參考code blocks支援多種編譯器,包括gcc,mingw,digital mars,microsoft visual c borland c llvm clang,watcom,lcc和intel c 編譯器。雖然ide是為c 語言設計的,但是對其他語言也有一些支援,包括for...