樓主在刷劍指offer的時候遇到了這麼一道題,把陣列排成最小的數,這是題的位址。解題思路無非就是先根據新的排序規則對原陣列進行排序,然後在遍歷生成數即可。我們知道,c++的stl庫sort非常好用,其過載形式也多種多樣,而sort過載版本的第三個引數是乙個二元謂詞(即只接受兩個引數)。於是機智的樓主很快碼出來了下面的**:
class
solution
;for
(const
auto
&c : nums)
ans +
=to_string
(c);
return ans;
}bool
comp
(int
&a,int
&b)}
;
正當樓主意氣風發,f5執行準備劍指offer時,編譯器卻向我展示了乙個致命錯誤:
看著這陌生的錯誤,我心想看來offer只能劍指了,但是我注意到了乙個東西,即第三條error:應輸入兩個引數,卻提供了三個。懵逼的我再一次看了看我的可呼叫物件,心想沒毛病啊。但是我知道沒毛病是因為我修行不夠,需要向場外老哥求助,於是我向場外老哥進行了求助。果然,經驗豐富的老哥一眼就看出了錯誤所在,函式定義了在了類裡面,this指標就是那多出的引數。當時的我恍然大悟,對啊,非靜態成員函式都會包含乙個this指標引用,方便對物件進行各種處理。
為了驗證猜測,機智的我把函式定位了static模式,這樣編譯器就不會加上所謂的this指標了,結果如下:
果不其然,靜態屬性遮蔽掉this指標後,也就不會存在所謂的引數錯誤了。那麼問題來了,不加static的函式實則是什麼模式呢?這就得談到this指標的成員函式了。
乙個類的非靜態成員函式實則是屬於每一物件本身,也就是我們得通過物件去呼叫他自己的成員函式,而不是類本身。假設我們有這麼乙個類:
classa}
;int
main()
這裡我們通過物件a呼叫它本身的test函式,得到其成員變數的值。實際上當我們呼叫成員函式時,是在替某個物件呼叫它。即成員函式通過乙個名this的額外隱參來訪問呼叫它的物件,也就是說我們剛剛實際上返回的是a.a,其呼叫關係等價:a::test(&a)。即編譯器負責將物件位址傳遞給了成員函式的隱式形參,注意這裡雖然是隱式形參,但本質上還是乙個引數,它也會占用引數數目。而我們知道靜態成員函式是屬於類本身,為所有物件所共享,所以呼叫靜態成員函式並不需要使用this指標來區分,因為這就獨乙份。
所以真相水落石出,成員函式的this指標破壞了引數的結構。所以明白了為什麼,我們也可以通過其他手段修改上述**,比如lambda表示式,bind繫結等等。
class
solution);
string ans =
;for
(const
auto
&c : nums)
ans +
=to_string
(c);
return ans;}}
;
using
namespace std;
using placeholders::_1;
using placeholders::_2;
class
solution
bool
comp
(int
&a,int
&b)}
;
用bind的時候,可別忘了宣告佔位符
當我們在類裡面想使用stl庫函式,並且想自己定義函式物件時,千萬別忘了this指標也成員函式占用引數的,所以最佳辦法還是使用lambda表示式或者static靜態宣告,畢竟bind太複雜了。
重視blog備份 兼記我與CSDN的愛恨情仇
痛定思痛,終於決定 逐漸備份 遷移csdn部落格到 前幾年比較喜歡逛csdn的bbs,雖然之前在cnblogs也註冊了賬號,但一直用csdn部落格比較多。本來一直用csdn,加上自己寫部落格的頻率並不高 平均乙個月一篇左右 所以也沒覺得csdn有什麼不好。插播廣告 我的csdn部落格 直到近一年,親...
SPI介面和CS品牌SD NAND的「愛恨情仇」
之前講過一些客戶如何通過spi口來使用sd nand,最近這一對本身交集並不多的介面又糾結到一起了,到底是什麼情況呢?有位客戶找到我們,他們的cpu本身是支援spi口啟動的,但是由於一些特殊原因,這個口被占用了,而客戶同時有需要大容量的儲存晶元做本地儲存。我們總結了一下,這位客戶需要的一款大容量 非...
absolute與relative的愛恨情仇
absolute 第一種情況 1,相對於乙個已定位的包含它的元素 父類 子類 菜鳥教程解釋 位置設定為 absolute 的元素,可定位於相對於第乙個已定位 非靜態的 的包含它的元素的指定座標。此元素的位置可通過 left top right 以及 bottom 屬性來規定。截圖 由結果可知,當父類...