C 可以做好而C做不好的事情

2022-07-13 17:36:16 字數 2628 閱讀 4697

現在好多c++

軟體工程師,大多數都是

c語言出身,他們在工作過程中用得更多的還是

c語言思想,或許他們還沒有意識到

c++ 

的一些更加有趣的特性。現在給大家解釋什麼事情是

c++可以做好,而

c做不好的。希望對這一類人有一點點啟發。

目錄

第一次嘗試

改進另一種改進

不用類來改進

正文

1、第一次嘗試

現在給定乙個例子:

#include class trace

};int main()

2、改進

如果能夠在必要時關閉跟蹤輸出(trace output

),這將會是個有用的功能。現在改一下類的定義就行:

#include class trace

void print( char *s )

void on()

void off()

private:

int noisy;

};

此時類定義包括兩個公有成員函式on

和off

,它們影響私有成員

noisy

的狀態。只有

noisy為on

(非零)才可以輸出。因此,

t.off();

會關閉t

的對外輸出,直到我們通過下面的語句恢復

t的輸出能力:

t.on();

由於這些成員函式定義在trace類自身的定義內,c++

會內聯(inline)擴充套件它們,所以就使得即使在不進行跟蹤的情況下,在程式中保留trace物件也不必付出許多代價。只要讓print

函式不做任何事情,然後重新編譯程式,就可以有效地關閉所有trace物件的輸出。

3、另一種改進

如果讓它列印到標準輸出裝置以外的東西上,那又該怎麼改進呢?一種方法是可以用繼承來建立一種新的trace類,但是為了盡量讓示例簡單,避免介紹新的概念。現在作如下改進:

#include class trace

trace(file* ff)

void print( char *s )

void on()

void off()

private:

int noisy;

file* f;

};

這樣的改動基於乙個事實:

printf(args);

等價於:

fprintf(stdout, args);

建立乙個沒有特殊要求的trace

類,則其物件的成員f為

stdout

。因此,呼叫

fprintf

所做的工作與呼叫前乙個版本的

printf

是一樣的。

類trace

有兩個建構函式:乙個是無參的建構函式,輸出到

stdout

,另乙個是帶參建構函式,允許明確指定輸出檔案。因此,上面那個使用了

trace

類的示例程式可以繼續工作,但也可

以將輸出定向到比如說

stderr

上:

int main()

簡而言之,運用c++

類的特殊方式,使得對程式的改進變得輕而易舉,而不會影響使用這些類的**。

4、不用類來實現

對於這個問題,典型的c

解決方案會怎麼樣的。

#include static int noisy = 1;

void trace(char *s)

void trace_on()

void trace_off()

這個方法是有效的,但是與c++

方法比較起來,有

3個明顯的缺點。

1. 函式trace

不是內聯,因此即使當跟蹤關閉時,它還保持著函式呼叫的開銷。

2. c版本引入了

3個全域性名字:

trace

、trace_on

和trace_off

,而c++

只引入了1個。

3. 很難將這個例子一般化,使之能輸出到乙個以上的檔案中。為什麼這麼說呢?考慮一下我們會怎麼樣使用這個trace

函式:

int main()

採用c++

,可以只在建立

trace

物件時一次性指定檔名。而在

c版本中,情況相反,沒有合適的位置指定檔名。乙個顯而易見的辦法就是給函式

trace 

增加乙個引數,但是需要找到所有對

trace

函式的呼叫,並插入這個新增的引數。另一種辦法就是引入名為

trace_out的第4

個函式,用來將跟蹤輸出轉向到其他檔案。這當然也得要求判斷和記錄跟蹤輸出是開啟還是關閉。考慮一下,譬如,

main

呼叫的乙個函式恰好利用了

trace_out

向另乙個檔案輸出,則何時切換輸出的開關狀態呢?顯然,要想使結果正確需要花費相當的精力。

不是我們做不好事情,而是我們沒想把事情做好

來深圳這麼久感覺一天很忙碌,工作任務也很重,很少靜下心來思考一些必要的問題,也許這也是很多人的一種生活狀態吧!很多時候我們都在忙碌著,忙忙碌碌的實施我們的事情,出現很多反反覆覆,此時我們更多的時候束手無策,在不經意間接觸到以為資深人士,在和他的接觸中深受啟發,其實我們也可以做的再好一點的,我們不能一...

不用程式設計就可以做好的事情

這兩天做了三件事,都是貌似要寫乙個軟體而我找到了代替的方案,一行 也不用寫。其二是,有人要統計一萬多份調查問卷,問卷內容很簡單 20個人中選10個,在選中的人名字下面打勾。原來我曾經寫了乙個程式幫他們做更複雜的錄入輔助兼統計,用到delphi c s模式,firebird做後台資料庫。這次的因為相對...

專注的做一件事情 做好

今天下午參加了 開源中國在北京聯想研究院舉辦的線下交流會。哈哈,終於見到了 傳說中的 紅薯 專注的做一件事情做好,他是開源中國 的創始人 這個人很厲害,僅僅用一台伺服器就可以支撐訪問量很大的乙個技術社群。而且他也蠻親切的,也非常無私,經常和社群的朋友們分享程式設計的各種技巧 將自己的 分享出來。但其...