c ,要細心不能想當然

2021-06-16 07:46:27 字數 1583 閱讀 2420

兩段想當然寫下的**,你看出問題了吧

1class

data;

2data

*finddata();

3void

getdata(data

*dataptr)47

data

*data

=null;

8getdata(data);

9data

->

somefunction();

第二段**,更得仔細點

1classa;2

classb;3

a const

*geta();4b 

const

*getb();

5template

<

typename t

>

6int

getspecialvalue(t

*classptr)710

11template

<>

12int

getspecialvalue

<>(a*

classptr)

1316

template

<>

17int

getspecialvalue

<>(b*

classptr)

1821

a const

*classptr

=geta();

22int

ret=

getspecialvalue(classptr);

23cout

<<

ret<<

endl; 

//out 3721! why not 37?

2425

26 第一段的問題在於看到指標想當然認為是位址,data 可以帶回反回值,其實因為這裡是值傳遞,實參data把自己的值賦給了dataptr,dataptr後來確實從finddata()得到了想要的值,但這對一點影響也沒有,所以函式返回時,data的值沒有發生變化,也就是沒有帶回想要的值。

只要不想當然,仔細一想就明白了,解決辦法很簡單:

1void

getdata(data

*&dataptr)24

第二段的問題是沒有注意到那個const, t*  和 t const* 是不一樣的,不能完全匹配,所以不會找到對a型別的特化版本,解決辦法可以這樣:

1template

<

typename t

>

2int

getspecialvalue(t 

const

*classptr)36

7template

<>

8int

getspecialvalue

<>

(a const

*classptr)912

template

<>

13int

getspecialvalue

<>

(b const

*classptr)

14 能過這兩個小例子就可以知道,c++細節很多,要仔細,不能想當然。

是我想當然了

這是我第1個帖子關於rails的帖子。其實,聽到rails有好些日子了。2年了吧。不過,從沒有實踐。早兩天,想看看rails的activerecord,因為我想看看它的sql是如何產生的。原因是 如此orm?看源 我才發現原來我錯了。是我想當然了。我想當然,它能支援多資料庫。應該同hibernate...

測試小故事48 想當然

想當然是一種託詞,是不明事理的妄加揣測。我覺得,我認為,我以為。想當然,乙個團隊中總是或多或少的存在著一些想當然的因素,軟體專案也存在同樣的問題。專案過程中,總有人想當然的認為專案經理會對專案過程負責,也就有了偷懶和渾水摸魚的現像存在 專案管理者想當然的認為任為分配下去了,一切都會按計畫進行,所以萬...

《假設的世界 一切不能想當然》筆記

日 竹內薰 著 本書通過各類科學領域的事例,介紹了支配著我們頭腦的各種假設,並向各位傳授了不依照成見進行判斷的訣竅。其實啊 目前還沒人能解釋清楚 全世界都是假設!你心目中那些經過科學方法驗證的定論,其實都是假設。你腦子裡的各種常識,也不過是假設而已。本書的中心思想可以歸納以下三點 請注意,看這本書時...