現在好多c++
軟體工程師,大多數都是
c語言出身,他們在工作過程中用得更多的還是
c語言思想,或許他們還沒有意識到
c++
的一些更加有趣的特性。現在給大家解釋什麼事情是
c++可以做好,而
c做不好的。希望對這一類人有一點點啟發。
目錄
第一次嘗試
改進另一種改進
不用類來改進
正文
1、第一次嘗試
現在給定乙個例子:
#include class trace};int main()
2、改進
如果能夠在必要時關閉跟蹤輸出(trace output
),這將會是個有用的功能。現在改一下類的定義就行:
#include class tracevoid 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 tracetrace(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做後台資料庫。這次的因為相對...
專注的做一件事情 做好
今天下午參加了 開源中國在北京聯想研究院舉辦的線下交流會。哈哈,終於見到了 傳說中的 紅薯 專注的做一件事情做好,他是開源中國 的創始人 這個人很厲害,僅僅用一台伺服器就可以支撐訪問量很大的乙個技術社群。而且他也蠻親切的,也非常無私,經常和社群的朋友們分享程式設計的各種技巧 將自己的 分享出來。但其...