程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++11的default和delete關鍵字

C++11的default和delete關鍵字

編輯:C++入門知識

C++11的default和delete關鍵字


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

【default關鍵字】
首先我們有一個字符串類:
class CString
{
    char* _str;

public:
    //構造函數
    CString(const char* pstr) : _str(nullptr)
    {
        UpdateString(pstr);
    }

    //析構函數
    ~CString()
    {
        if (_str)
            free(_str);
    }

public:
    void UpdateString(const char* pstr) throw()
    {
        if (pstr == nullptr)
            return;

        if (_str)
            free(_str);

        _str = (char*)malloc(strlen(pstr) + 1);
        strcpy(_str,pstr);
    }

public:
    char* GetStr() const throw()
    {
        return _str;
    }
};
我們可以這樣使用:
auto str = std::make_unique("123");
printf(str->GetStr());
但是這樣是不行的:
auto str = std::make_unique(); //失敗,因為沒有一個無參構造函數

好,我們用default來:
class CString
{
    char* _str = nullptr;
    
public:
    CString() = default;

public:
    //構造函數
    CString(const char* pstr) : _str(nullptr)
    {
        UpdateString(pstr);
    }

    //析構函數
    ~CString()
    {
        if (_str)
            free(_str);
    }

public:
    void UpdateString(const char* pstr) throw()
    {
        if (pstr == nullptr)
            return;

        if (_str)
            free(_str);

        _str = (char*)malloc(strlen(pstr) + 1);
        strcpy(_str,pstr);
    }

public:
    char* GetStr() const throw()
    {
        return _str;
    }
};

於是我們可以這樣使用了:
auto str_def = std::make_unique();
str_def->UpdateString(“123”);
printf(str_def->GetStr() == nullptr ? "None":str_def->GetStr());

【delete關鍵字】
假設我們有這樣一個類,這個類是用於自動申請內存,進行RAII式管理:
(避免麻煩那些什麼拷貝構造拷貝賦值移動構造什麼的就不寫了)
template
class CStackMemoryAlloctor
{
    mutable T* _ptr;

public:
    explicit CStackMemoryAlloctor(size_t size) throw() : _ptr(nullptr)
    {
        _ptr = (T*)malloc(size);
    }

    ~CStackMemoryAlloctor()
    {
        if (_ptr)
            free(_ptr);
    }

public:
    operator T*() const throw()
    {
        T* tmp = _ptr;
        _ptr = nullptr;
        return tmp;
    }

public:
    T* GetPtr() const throw()
    {
        return _ptr;
    }
};

我們這樣使用這個類:
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)
    {
        return nullptr;
    }
把new設置為private了,就行了,但是這樣如果別人嘗試new,那看到的錯誤提示簡直慘不忍睹。。。
於是C11的delete人性化多了:
public:
    void* operator new(std::size_t) = delete;

當嘗試new的時候,提示十分友好,這個方法已被刪除。
這個delete可以用來刪任何你不爽的東西,比如拷貝構造,賦值拷貝什麼雞巴毛的東西。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved