Lambda expression 是一種匿名函數的表示方式,它可以讓程式設計師將函數的內容直接以 inline 的方式寫在一般的程式碼之中,省去另外定義函數的麻煩,使用時機跟 functor 與 function pointer 類似,一般的狀況都是使用 lambda expression 定義一個匿名的函數,然後再將此函數當作另外一個函數的傳入參數來使用。
可以說類 Lambda 語法的形式, 在各種現代的語言中 (ex. Java, Swift, Obj-C ...) 都有類似的實現, 在需要 Callback函式呼叫時尤其好用。
Lambda expression 基本的用法
Class A;
[ A ] (int x) -> int
{
int n = x + y;
return n;
}
- A 為傳入的變數, 若需要引用lambda函式外的變數, 由此傳入, 預設為使用傳值的方式(Call by value)
- int x 為傳入函式的變數
- -> int 為宣告Lambda函式回傳變數型態的語法
Lambda 簡單範例
int main() {
auto square = [](int x) -> int { return x*x; };
cout << square(3) << endl;
}
- cout結果: 9
Lambda 語法參考
function 是一個舊用法新用, 主要可以用來取代舊有的 Function pointer 以及 Function object的寫法。
簡單的理解是可以把函式拿來像變數使用, 傳入其他的函式中。
function 的基本用法
- 標頭檔 : #include < functional >
-
範例: 宣告一個 function, 可以傳入一個 bool, 一個float當變數, 以及傳回一個int值
function < int (bool, float) > nameOfFunction;
function 的範例
class fClass {
public:
static int square (int x) {
return x*x;
};
};
int main(int argc, const char * argv[]) {
function< int (int) > squareFunction;
squareFunction = fClass::square;
cout<< squareFunction(3);
return 0;
}
- cout 結果: 9
function 參考
最後, 我們有個關於 Cocos2d-x 的Facebook社團, 如果有任何疑難問題, 歡迎到社團發問。
Cocos2dx Taiwan 開發者社團
C++ 內建型別會不會被自動初始化, 與它在哪裡被定義有關。
定義於函式主體外的任何變數都會獲得初值0。 定義於函式主體內的內建型別則無初值。
#include <iostream>
using namespace std;
int k;
void printVal (){ // <- 所謂的函式主體
int i;
cout<< i << endl;
cout<< k << endl;
}
int main(){ // <- main 為例外的函式主體, 有賦值
printVal();
int m;
cout << m << endl;
return 0;
}
輸出結果:
i: 32767
k: 0
m: 0
未初始化的變數其實帶有一個值。 編譯器首先把變數 “放在” 記憶體某處, 然後把那塊記憶體的 bit 樣式當作那個變數的初值。
由於初始化會影響程式的結果是否正確, 未明確定義的變數往往會造成很難除錯的 bug 產生, 所以還是養成一律初始化每個變數的習慣會省自己很多麻煩。
string 的 size 操作和 empty 操作
常使用的 c++ 函式庫會附帶 size() 以及 empty() 操作, 前者是給予對應的長度, 後者是簡單的回傳是否為空。
需特別注意的是 size() 回傳的是一個 string::size_type, 而非常見的基礎型別。
string 和很多程式庫型別 - 定義有數個相關型別。 這些型別讓我們得以使用與機器無關的方式來運用程式庫型別。
size_type 被定義為某個 unsigned 型別 - unsigned int 或 unsigned long 的同義字, 足以保證代表任何 string 的大小。
任何用來存放 string size() 返回值得變數都應該是 string::size_type。 千萬別把 size() 返回值賦予一個 int 變數。
使用 int 除了 int 可以存放負值外, 某些機器上的 int 太小, 連合理的大型 strings 都無法處理。
將 strings 與 character string literals 相加
string 常使用的串接方式會有下面這種做法:
string s1 = "hello";
string s2 = "world";
string s3 = s1 + " " + s2;
這種做法有個需要特別注意的事項, 每個 + 運算子至少要有一個運算元的型別是 string
也就是說下面的語法是不合法的:
string s = "hello " + "world!";
指令參考
在不同的編譯器和作業系統上, 叫出 C++ 編譯器的指令都不同。
GNU 編譯器的預設指令是 g++
Mac: 在 Terminal環境下
$ g++ prog1.cpp -o prog1
$ 為系統提示號。 這個指令會生成一個 prog1 或 prog1.exe
$ ./prog1
這指令可以執行對應生成的檔案
使用方式
g++ [option] filename
選項
-c : 只做編譯(不做連結)
-S : 輸出組譯碼
-E : 將預處理結果顯示
-o filename : 指定輸出檔名
-ansi : 程式要求依據ansi c標準
-Dmacro : 使定義巨集(marco)為有效
-Dmarco=defn : 使定義巨集(marco)為defn
-Wa,option : 將選項(option)傳給組譯器
-wl,option : 將選項(option)傳給連結器
-I : 追加include檔案的搜尋路徑
-L : 追加library檔案的搜尋路徑
-l : 指定連結的函式庫
-Wall : 顯示所有的警告訊息
-g : 編入除錯資訊(要使用GDB除錯一定要加)
-O2 : 做最佳化
Example:
g++ -o file a.c b.c c.c
g++ -Wall -g -o test test.c
g++ -Iinclude -Llibrary -lmy_lib -o test1 test1.c
g++ -c -o test3 test.c