選用刪除函式,而不是使用private未定義的函式

2022-06-08 15:42:09 字數 1415 閱讀 3488

c++98中通常就函式定義為private,來表示這個函式不可用。比如常見的禁止複製建構函式或者複製拷貝函式。當然private也有些好的用法,比如單例中。

但是我們這裡討論的是刪除某個函式。

class noncopyable ;
用delete來表示刪除這個函式。

1. 為什麼要這麼做呢?

因為如果我們定義為private的時候,可能這個類的成員函式或者類的友元還是可以使用private定義的。

如果我們希望**中不要每次都把相應複製建構函式或者複製拷貝函式都刪掉,可以繼承上述寫的類

class a : public nocopyable ;
當然還可以在nocopyable中新增你想要刪除的函式。

當然上述**中也存在乙個問題,就是刪除函式最好是宣告為public

2. 為什麼刪除函式最好宣告為public?

因為當客戶端**嘗試訪問乙個宣告為private的刪除的函式時,編譯器會優先校驗可訪問性,然後判斷是否刪除。

所以會這時候可能得到錯誤的報錯資訊。

3. 任何函式都可已刪除

不僅時成員函式,還包括非成員函式和模板具現。

比如乙個非成員函式

bool islucky(int number); // 這裡我們接受乙個int的,判斷他是否是幸運數字。
我們發現我們輸入int, float, double, bool都可以,因為這裡存在隱式轉換。

但是如果我們就想只接受乙個int的呢,那麼我們就將不要的刪除就好了。

bool islucky(bool) = delete;

bool islucky(char) = delete;

bool islucky(double) = delete;

注意刪除double,同時就刪除了float

因為當我們輸入乙個float的變數時,將面臨乙個隱式轉換。而轉換規則可以從float轉成int和double時,優先選用double.

而此時發現double的已經被刪除了,那麼編譯就會被阻止。

還有就是當這個時乙個類內部的函式模板時,會遇到新的問題。

class widget 

private:

template<>

void process(void*); // 編譯不通過,這裡我們想做乙個讓傳入void*型別的引數的函式呼叫不能通過

};

因為 模板的特化必須在名字作用域而非類的作用域撰寫的。

所以我們改成這樣

class widget 

};template<>

void widget::process(void*) = delete;

strchr函式的實現而不是使用

剛剛在寫乙個程式的時候突然需要用到定位到乙個字串中第一次出現某個字元的位置,於是就找到了strchr 函式,之前從沒有用過的,當然我可以直接呼叫即可,但是擁有良好程式素養的洗衣袋決定要想實現這個函式,其實也沒有那麼難的哦,迴圈遍歷,直到第一次出現你需要找的字元就結束而已。嘿嘿,稍稍的記錄下,以備日後...

strchr函式的實現而不是使用

剛剛在寫乙個程式的時候突然須要用到定位到乙個字串中第一次出現某個字元的位置,於是就找到了strchr 函式,之前從沒實用過的,當然我能夠直接呼叫就可以。可是擁有良好程式素質的洗衣袋決定要想實現這個函式,事實上也沒有那麼難的哦。迴圈遍歷,直到第一次出現你須要找的字元就結束而已。嘿嘿,稍稍的記錄下,以備...

函式能否返回物件,而不是指標

現有一通用 獲取記錄集合函式 function getrec strsql string tadodataset varrec1 tadodataset begin rec1 tadodataset.create nil rec1.connection adoconnection1 rec1.com...