close

吉伯特語翻譯目次 BEGIN _______________________________ 零 、 媒介 壹 、 基本資料型態 (1) nullptr < g++ 翻譯社 vc support > (2) constexpr < g++ 翻譯社 vc support > (3) type aliases < g++ support only > (4) auto type < g++ 翻譯社 vc support > (5) decltype < g++ 翻譯社 vc support > 貮 、 String, Vector, Arrays (1) range for statement < g++ , vc support > (2) 套嵌式 template < g++ , vc support > (3) vector constructor , assign element < g++ support only > (4) begin / end < g++ 翻譯社 vc support > (5) vector<T>::cbegin() , vector<T>::cend() < g++, vc support > 參 、 函式 Functions (1) initializer_list < initializer_list parameters , g++ support only > 肆 、 種別初步 (1) constructor , = default < g++ support only > (2) class 定義時初始化成員 < g++ support only > (3) delegating constructors < g++ support only > 伍 、 循序式容器 (1) 新增 std::forward_list < g++ , vc support > (2) 新增 std::array < g++ , vc support > (3) std::string < g++ , vc support > 陸 、 泛型算法 (1) lambda 簡介 < g++ , vc support > 柒 、 其他... 目次 END __________________________________ 零 、 前言_________________________________   雖 C++ 不熟,唯比來呈現一些語法讓筆者感應十分錯愕,後來才知道很多黉舍及 一些業界已最先跟進 C++ 11,於是狠下心再把 C++ Primer 5e K 過一遍 ( 和 4e 差 別蠻大的,除 C++ 11 外,編排也有些異動),做一些 note ,清算後做為分享翻譯提 醒,真的只供 tutorial,究竟結果目標是: C++ -> C++11 && Primer 4e->5e,內容比不上 C++ 11 FAQ 出色。 C++ 11 FAQ : http://www.stroustrup.com/C++11FAQ.html   若感覺鉦昱翻譯公司有誤會書中之意,請不惜告知;感覺專著名詞中文翻得很爛,也請不惜斧正 ,利用編譯器主要為 Code::Blocks(g++ 4.6.1),VC2012,內文提供的 g++、vc,指的是 這兩種版本之編譯器。然後 STL 實在是過分於包山包海,加上還有新增新的 container ,這裡全略過,有樂趣可到 C++ Reference 或相幹網站查詢,STL 部份及其之 member function 相幹申明均會再加註是不是為 C++ 11。 壹 、 根基資料型態 < C++ Primer 5e , Chapter 02 > ______________ (1) nullptr < g++ , vc support > 在 C language 裡一些法例會提到, 指標最好初始化設 NULL,唯 NULL 是以 macro 體式格局定義,在 C 裡界說成 ( (void*)0 ),C++ 界說成 0,而 C++ 11 多了 nullptr,故程式碼裡可這麼用 int * ptr = nullptr; vector<int> *v = nullptr; /* v 的宣佈其實欠好 */ (2) constexpr < g++ , vc support >   一變數被宣佈成 constexpr 時,就必需被初始化。   constexpr int expr = 20; constexpr int limit = mf+1;   constexpr int * q = nullptr;   constexpr int new_sz() { return 42; } constexpr int foo = new_sz(); 值得留意的是,上述的 constexpr int foo,在編譯期時便會呼喚 new_sz(),填入 foo 裡。也由於為了 constexpr 能在編譯期時立刻被睜開,現實上是隱喻的使用了 inline ( 換句話說,它的感化也只是建議,不是必然 )。再換句話說,它也有著宣告 與實體沒設施拆成 .h / .cpp 兩個檔案進行實作。 (3) type aliases < g++ support only > 一般想要重界說一個資料型態時,初期是用 typedef 方式去做,如   typedef unsigned char byte; typedef unsigned int word; int add(int a, int b) {return a+b;}; typedef int (*fptr)(int, int); // aliase declare function pointer C++ 11 多了 using 可用 using byte = unsigned char; using word = unsigned int ; using fptr = int (*)(int, int); // aliase declare function pointer ※ vc2012 不支援 using 做 type aliase (4) auto type < g++ , vc support > auto 算是我認為 C++ 11 裡對初學者的一項福音(也可能不是),以往之 C/C++ auto 首要是潤飾變數之生命週期,相關章節在提到 auto 時可能還會再提到幾個辨認 字:auto、static、register、extern,好一點的會再提對照冷門的辨認字,如 volatile、restrict 等翻譯   auto 這關鍵字到 C++ 11 時,不肯定是轉義(本來的用法拿掉)照樣多義(統籌 本來的用法)。使用 auto 宣佈一變數時,必需給定初值,該變數之資料型態會自己 推導。如 int i = 10; auto ai = i; /* ai 最後被宣佈成 int */ vector<int> v(10翻譯社0); auto av = v; for( auto itr = av.begin() ; itr!=av.end(); ++itr) /* 可用在 iterator */ *itr += 10; double d = 2.7; auto dvar = d + i; // double op int , 會被推成 double   固然筆者是認為 初學階段 不要過於依賴 auto,不然許多概念會弄得雜亂無章 (這句刪除)翻譯比較讓人感應疑心的是關於 pointer / reference 之應用。   int i = 0翻譯社 &r = i; auto a = r; // a 被推成 int 翻譯社 初值就是 i 值 auto p = &i; // p 被推成 pointer   auto & af = i; // af 被推成 reference to int variable.      另若原變數有加 const 潤飾時也可別的推出來、auto 又可再加 const 加以修飾, 這個推下去過於贅述,點到為止。另再一點注意的是,auto 別拿來當 func 之引數潤飾 ,諸如 auto max(const auto & a 翻譯社const auto & b); 該用 template 就用 template。 (5) decltype < g++翻譯社 vc support > C++ 11 裡,decltype 是個新的關鍵字。假定已宣告 int a; 現又欲將變數 b 宣佈 得和變數 a 一樣時,這時候 decltype 便可利用。   decltype(a) b; // b 之資料型態與 a 同翻譯 decltype 也可放 function(),將會推導出該 function 傳回值之資料型態,如 int f1(double){return 1;} // f1 return int decltype(f1()) c; // c 會被宣佈成 int   上面的 decltype(f1()),現實上其實不會真的去呼喚 f1 function,所以不用憂郁 效力太差問題。有幾種狀態可能比較不輕易想,下面列出一些   int i=0;   int *p = &i翻譯社 &r=i; decltype(r + 0) b; // 相加後照樣 int 翻譯社 b 宣佈成 int decltype(*p) c=i; // c 宣佈成 int& , 初值綁定在 i 上   decltype( (what_ever) ) x; // 加兩個括號的, x 必然是 reference翻譯社故要給初值 自然的以往使用的 std::string::size_type idx=0 也可直接以 auto 或 decltype 體例完成。故要 aliase 函式指標時就變得簡單很多。 int add(int a, int b){return a+b;} typedef int (*fptr1)(int, int) ; // typedef using fptr2 = int (*)(int, int); // C++ 11 using aliase typedef decltype(add) * fptr3 ; // typedef + decltype fptr1 f1 = add; fptr2 f2 = add; fptr3 f3 = add; decltype(add) * f4 = add; // 其實小程式用這個就行,不太需要 typedef   auto f5 = add; // auto 無敵 ??   固然做 function pointer typedef 還有另外一種氣概,與 C++ 11 相幹性不大, 這裡就不再贅述翻譯 貮 、 String, Vector, Arrays <C++ Primer 5e , Chapter 03 > _________ (1) range for statement < g++ , vc support > 在初期 C/C++ 裡用 for 對特定容器裡之每個元素做一段敘述時(如字串轉大寫), 寫法可能以下 string s = "EdisonX"; for( decltype( s.length() ) idx=0; idx!=s.length(); ++idx) s[idx] = toupper(s.at(idx)); cout << s << endl; 先小溫習一下,上面的 idx 在這裡用 decltype(s.length()) 會比 auto 恰當些, 原因應不消多述。且現實上其實不會真的去呼叫 string::length(),只會推型別而已翻譯 一樣的事,C++ 11 對於 for loop 可改成下面型式 string s = "EdisonX"; for(auto &ch : s) // 對象換成了 each ref. character ch in string s ch = toupper(ch); cout << s << endl;   range for 較正式的默示為   for( declaration : expression ) for( 變數宣告 : 表達 )     statement 論述   整體用起來頗像 for_each 。留意,第二段的 auto &ch 指的就是 char &ch翻譯所以要 算有幾個大寫、小寫字元之類的也不是問題,另這類 range for statement 也合用於一 般 array。 int arr[10] = {1翻譯社2,3,4,5,6,7,8,9,10}; int s=0; for( decltype(arr[0]) ele : arr) s+=ele; cout << s << endl;   其他有樂趣可再本身摸摸,它可以再配合 continue、break 翻譯 (2) 套嵌式 template 初期在寫 vector<vector<int>> 時,部分 compiler 會把最後的兩個連在一路的角 括號 >> 視為 shift operator >> ,所以書上會建議多一個空間做分格,釀成 vector<vector<int> >,便不會産生這問題。C++ 11 已把這個納到規範去,不外注意的 是,compiler 會怎麼解讀 vector<vector<int>> 又是一回事,究竟結果規範和實作(現實 implement standard 之 compiler) 從以前到而今一向都是兩回事。 (3) vector constructor , assign element < g++ support only > 在 C++ 11 之前,vector 之 constructor 及初始化其實蠻有限的,像是它不克不及達 到 int arr[]={1,2,3翻譯社4} 這種作法,但 C++ 11 之後這行得通了,如 vector<string> str = {"Hi"翻譯社"Ptt"翻譯社"EdisonX"}; for(string s : str) cout << s << endl;   這類方式是藉由 in-class initializer 完成,換而言之,若是要搞 saw array 時 也可像下面這樣搞, vector<vector<int> > arr = { {1翻譯社2翻譯社3}翻譯社 {4翻譯社5翻譯社6,7翻譯社8}, {9,10}, {11,12,13,14,15} }; arr[0] = {11,22,33}; // OK for(auto Row: arr) for(auto ele : Row) cout << ele << endl;   上述的 auto Row, auto ele 可寫成 auto & Row, auto & ele,細節差別是 之前就知道的事,就不再贅述。值得留意的是,C++ 11 幾近所有 container 都支 援 in-class initializer (今朝還沒看到沒支援的),同時這特征也被支援到 new 身上,以下例是正當可行的。 int * arr = new int[3] { 1, 2翻譯社 3}; 但比較可惜的是,VC 2012 並沒做到這類地步,也就是 vc 2012 不支援 in-class initializer翻譯 (4) begin / end < g++, vc support >   傳統初學者寫 function 時,大多有兩種體式格局,一種是傳 pointer + size;另外一種 是 STL 設計方式,傳 begin pointer / end pointer (pointer 講成 iterator 較佳), 假定找某個 array 裡第一個呈現 val 之位置時,func 與 caller 可能長得像如許 int * find(int * start , int * last , int val) { for( ; start!=last ; ++start) if(*start==val) return start; return last; } int arr[] = {1,2,3,4,5}; int *pos4 = find(arr, arr+5, 4); // 注意這行 cout << *pos4;   首要在 caller 端,可以有其他的方式做處置懲罰,上面註解的部份換過釀成以下, int *pos4 = find(begin(arr)翻譯社 end(arr)翻譯社 4);   換而言之,在求靜態陣列元素個數時,以往是習慣用 sizeof(arr)/sizeof(arr[0])sizeof(arr) / sizeof(*arr),所以到 C++11 時多了一種選擇, auto arr_size = begin(arr) - end(arr);      不外這裡要強調,上面不是種好的寫法,因現實傳回值是 ptrdiff_t,而非 size_t, 比力尷尬的是不能對於由 new 產生之空間做處置,下述範例就是錯誤示範翻譯 int *arr = new int[5]; for(int i=0; i<5; ++i) arr[i] = i; int *pos4 = find(begin(arr)翻譯社 end(arr)翻譯社 4); // fail (5) vector<T>::cbegin() 翻譯社 vector<T>::cend() < g++翻譯社 vc support >     直接看碼和註解吧。 vector<int> v={1,2,3}; // vc2012 不支援這裡 auto it_beg = v.cbegin() ; // vector<int>::const_iterator it_beg; auto it_end = v.cend(); // vector<int>::const_iterator it_end; while(it_beg != it_end) cout << *it_beg++ << endl; // 綁定對象為唯讀,可改綁定對象 參 、 函式 Functions < C++ Primer 5e, Chapter 06 >____________ (1) std::initializer_list < initializer_list parameters , g++ support only > C 說話裡還在使用的不定參數 - va_list(),va_start(),va_end(),va_arg(), C++ 11 可能準備要走入歷史了。   假定要計較輸入一串數值之總合,可用不定參數去做,不示範。而 C++ 11 多了 initializer_list 後,其實更利便, int sum(initializer_list<int> L) { int s = 0; for(auto beg = L.begin() ; beg!=L.end(); ++beg) s+=*beg; // for(const auto & ele : L) s+=ele; // using range for method return s; } int rst = sum ( {1,2翻譯社3,4,5} ); // 注重這裡怎寫的 cout << rst ;   要做成 template 也沒問題,釀成 T sum(initializer_list<T> L); 不再贅述翻譯 肆 、 種別初步 < C++ Primer 5e, Chapter 07 >________________ (1) constructor , = default < g++ support only >   考慮下面之 class   class C{ string a="a", b="b", c="c"; // c++ 11 support public: C(string a, string b , string c) : a(a), b(b), c(c) {}   C() = default; };   裡面的 C() = default ; ,乃由於已有第一種版本 ctor (三個 string),想要 相容於無引數之 ctor,故直接寫下 C() = default,讓編譯器可接受且主動產生,無 引數之 ctor。 (2) class 界說時初始化成員 < g++ support only > 上述例子裡,在初期的編譯器沒辦法直接在為 class 界說時,便給變數初始值, 諸如上頭之 string a, b, c 都做了這類事(除靜態 const 整數資料可能除外), 但在 C++ 11 裡面,答應這麼做,當寫下 C obj; 時,obj 裡之 string a, b, c 都將 被初始化完畢。  (3) 委派建構子 < delegating constructors 翻譯社 g++ support only > 初期之編譯器,ctor 可以呼叫任何 member function,就只有其他之 ctor 與 dtor 不可呼喚。C++ 11 在 ctor 初始列時可用委派體例呼叫其他 ctor,以下為一規範, class String{ private: char *buf; size_t length翻譯社 capacity; public: String() : buf(nullptr), length(0), capacity(0){} String(const char * str) : String() { /* whatever */ } };   固然也可以將 String() 委派給 String(const char *),不再示範翻譯別的 constructor 也可加上 constexpr 做潤色,這裡不再深入翻譯 伍、循序式容器 < Sequence Container , C++ Primer 5e翻譯社 Chapter 09 >______ (1) 新增 std::forward_list < g++ 翻譯社 vc support >    使用前引入 #include <forward_list> ,實作之資料構造為 single link list, std::list 裡之所有尾端操作都不支援。 (2) 新增 std::array < g++ 翻譯社 vc support > 使用前引入 #include <array>,巨細為固定,不支援 remove翻譯社 resize。 (3) std::string < g++ 翻譯社 vc support > 初期用字串數值轉換全都是用 istringstream、ostringstream,C++ 11 多了一系 列函式專做這工作,包括 to_string, stoi翻譯社 stol, stoul, stoull翻譯社 stof, stod, stold,整個和 C-style 很像 (atoi / stoi翻譯社 a 換成 s 罷了)翻譯 陸、泛型算法 < Generic Algorithms , C++ Primer 5e , Chapter 10 >_____ (1) lambda 簡介 < introducting lambdas >   這功能大概是 C++ 11 最奇異進展之一 < 講白了是給一個 non-name function ? > 。lambda 標準之型式如下     [capture list] (parameter list) -> return type { function body } [ 捕獲列 ] ( 參數列 ) -> 傳回值 { 函式內容 } 其中 參數列 與 傳回值 可略,但 capature list 與 函式內容 不克不及略,看起來很亂 ,不外這標準型式大概是要熟記的器材,否則後面的也玩不下去翻譯直接看例子 auto f = [] {return 10;}; // 建樹一個可呼喚物件,傳回 10 cout << f() << endl; // 輸出 10 上述之 auto f 就免卻了 parameter list 與 return type,寫完全的話如下 auto f = [](void) -> int {return 10;}; 一個簡單的運用,假設要挪用 algorithm 裡之 sort 對 struct 做排序時,舊式寫 法或許以下 struct Num{ int n;}; bool compare (const Num & a, const Num & b){return a.n < b.n;} Num arr[] = { {5}, {2}, {1}, {3} }; sort(arr, arr+4, compare); for(size_t i=0; i<4 ; ++i) cout << arr[i].n << ' ';   裡面的 compare function,即可以 lambda 示之,以下。 Num arr[] = { {5}, {2}, {1}, {3} }; sort( begin(arr), end(arr), [](const Num & a翻譯社 const Num & b) -> bool { return a.n < b.n;} ); for_each( begin(arr), end(arr), [](const Num & num) ->void {cout << num.n << ' ';} );   上面紅色部分 ( -> bool 翻譯社 -> void ) 都是可省略的。由於 lambda 實在是可以 出一本書,這篇文章就點到這裡為止,Lambda Capture List 被我全跳光了,其他有興 趣可再找額外書籍或文章增補,C++ Primer 5e 放在 10-3。 柒、其他..._________________________________    這篇臨時到這裡,首要是後半段蠻長一大段時間是在講 STL library 的器材,筆者 認為直接到 C++ reference K 過一遍比在這裡看文章有用率多了。   另 OO 部分規範碼都過長,決議全都拿掉(疑!那怎麼這篇好像變得都講垃圾話了) ,但 rvalue 概念在 class OO 裡又是新的東西,C++ Primer 5e翻譯社 Ch13 蠻長篇幅在接頭 這個翻譯另小我認為版上是有篇文章必讀便是 #19gioP8j (C_and_CPP) 作者 yoco315 (眠月) 題目 [翻譯] Rvalue References: C++0x Features in VC10翻譯社 Part 2   結論是,雖 C++ Primer 4e 真的寫的不錯,不外小我目前讀 5e 到 Ch15 ,其實編 排感受比之前好些,雖有些典範榜樣和以前相仿,不過有些有改成 C++ 11 語法方式撰寫, 手邊如有 4e ,經濟許可的話收個 5e 應不會忏悔。   本文敘述至此,講得太淺請海函,有誤也請不惜斧正,謝謝各位收聽翻譯 -- ~ 這輩子與神手無緣 我只好當神獸了 ~ 卡卡獸

以下文章來自: https://www.ptt.cc/bbs/C_and_CPP/M.1359661212.A.4B7.html有關各國語文翻譯公證的問題歡迎諮詢鉦昱翻譯公司02-23690937

arrow
arrow
    文章標籤
    翻譯社
    全站熱搜
    創作者介紹
    創作者 kenv5ixpgm2 的頭像
    kenv5ixpgm2

    kenv5ixpgm2@outlook.com

    kenv5ixpgm2 發表在 痞客邦 留言(0) 人氣()