[問題] 為什麼類別不需建立物件就可使用

看板C_and_CPP作者 (zero064)時間10年前 (2014/12/29 06:36), 編輯推噓5(508)
留言13則, 6人參與, 最新討論串1/1
// comparator predicate: returns true if a < b, false otherwise struct IntComparator { bool operator()(const int &a, const int &b) const { return a < b; } }; ... // An overload of std::sort is: template <class RandomIt, class Compare> void sort(RandomIt first, RandomIt last, Compare comp); ... int main() { std::vector<int> items { 4, 3, 1, 2 }; std::sort(items.begin(), items.end(), IntComparator()); return 0; } sort的第三個引數,應該是一個Compare 類別的物件,但是在main裡面, 卻直接用IntComparator()當作引數,請問一下這是怎麼回事,應該用什麼關鍵字來查詢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 70.187.165.131 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1419834964.A.F08.html

12/29 14:56, , 1F
class type functor http://goo.gl/XBXdTx
12/29 14:56, 1F

12/29 14:58, , 2F
IntComparator() 會生出一個 callable object
12/29 14:58, 2F

12/29 15:00, , 3F
進而讓 sort 的實作去呼叫這個 callable object
12/29 15:00, 3F

12/29 15:08, , 4F
至於那個 Compare 並不是真的有一個 class 叫 Compare
12/29 15:08, 4F

12/29 15:09, , 5F
那是 class template 帶進來的 class 型別名稱
12/29 15:09, 5F

12/29 15:11, , 6F
因此命名 IntComparator 或者 FoobarComparator 都可
12/29 15:11, 6F

12/29 17:12, , 7F
IntComparator()就是建立一個無名的IntComparator物件呀
12/29 17:12, 7F

12/29 18:07, , 8F
這是典型的C++語法限制,逼你非得做一個物件出來不可
12/29 18:07, 8F

12/29 18:07, , 9F
裡面的operator無法宣告static 即使他本質就是static
12/29 18:07, 9F

12/29 18:21, , 10F
實務上應該會被最佳化掉就是了
12/29 18:21, 10F

12/30 22:57, , 11F
建立新物件是用來初始化類別(就是constructor 做的事) 不初
12/30 22:57, 11F

12/30 22:57, , 12F
始化 某些情況下依然可以使用
12/30 22:57, 12F

12/31 01:16, , 13F
你有建立物件
12/31 01:16, 13F
文章代碼(AID): #1KeFPKy8 (C_and_CPP)