C 中幾個常用的小技巧

2021-05-28 00:03:39 字數 1955 閱讀 3437

也許只是一些技巧而已,不過值得反覆重用就變成語言的idioms 了。說到idioms,posa 認

為pattern  可以分為三個層次(或者粒度),architecture   patterns、design   patterns、programming

language idioms。也就是說idioms 很多是跟語言相關的。

1、實現抽象類(不允許例項化)

這個可能大家都知道,把建構函式宣告為protected 。(當然如果類中包含純虛函式自然就不

能例項化,但是有的抽象類需要為虛函式提供預設實現,因此可能不包含純虛函式。)

2、實現final 類(不允許被派生)

namespace private

friend class nonderivable;

#ifdef ndebug

#define final_class

#else

#define final_class : private virtual private::nonderivablehelper

#endif

class nonderivable final_class

這裡namespace並非必須,只是乙個比較好的習慣而已。

3、實現禁止拷貝構造和賦值操作符

class myclass

private:

myclass(const myclass& );

const myclass& operator = ( const myclass& );

為了防止成員函式呼叫操作,這兩個函式應該只有宣告沒有實現。

c++中的idioms 很多很多,比如typetraits、smartpointer 這些都可以視為經典的 idioms 。注:關於第二個實現 final 類的方式,只要是 virtual繼承即可,至於是 private、protected

還是 public關係不大。在 comp.lang.c++.moderated    (2001/5/15)上,andrei   alexandrescu 有他

的見解,他不贊成上面文章中使用的 friend-based  方式,直接去掉 friend 那一行,這時必須採用

private virtual 繼承方式。private virtual 繼承確實使得 沒有任何類 能只繼承

nonderivable。

class d: public nonderivable

d() {} //編譯錯誤

不過多重虛擬繼承又繞了過去

class d final_class, public nonderivable

d() {} //一切正常

andrei alexandrescu 又提出了乙個非常巧妙的辦法:把 private::nonderivablehelper

的建構函式加乙個引數,改為 nonderivablehelper(int) {},然後把 nonderivable 的

建構函式寫成 nonderivable(): nonderivablehelper(0) {}

#ifdef ndebug

#define final_class

#else

#define final_class : private virtual private::nonderivablehelper

#endif

namespace private

class nonderivablehelper

protected:

nonderivablehelper(int) {} //added ctor argument

class nonderivable final_class

public:

nonderivable() : nonderivablehelper(0) {} //pass a dummy value

WinForm中的幾個小技巧

遮蔽窗體右上角關閉按鈕 一 重寫onclosing protected override void onclosing canceleventargs e 二 重寫wndproc protected override void wndproc ref message m base.wndproc r...

jquery中幾個小技巧

再次小結若干個jquery的小技巧 1 使用load載入 可以使用load去載入外部檔案 load files 2 讓使用者自由的改動字型 document ready function 減少字型大小 decreasefont click function 重新恢復字型大小 resetfont cl...

幾個C 程式設計的小技巧 二

幾個c 程式設計的小技巧 二 一 判斷檔案或資料夾是否存在 使用system.io.file,要檢查乙個檔案是否存在非常簡單 bool exist system.io.file.exists filename 如果需要判斷目錄 資料夾 是否存在,可以使用system.io.directory boo...