{"id":189,"date":"2017-12-23T21:54:53","date_gmt":"2017-12-23T21:54:53","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=189"},"modified":"2022-03-13T14:16:20","modified_gmt":"2022-03-13T14:16:20","slug":"modern-c-nullptr-enum-siniflari-range-based-donguler-auto","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/","title":{"rendered":"Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto"},"content":{"rendered":"<p>Gerek akademik\/i\u015f hayat\u0131mda gerekse ki\u015fisel projelerimde a\u011f\u0131l\u0131kl\u0131 olarak kulland\u0131\u011f\u0131m programlama dili C++. Ger\u00e7i art\u0131k bir \u00e7ok g\u00fc\u00e7l\u00fc ve istediklerinizi h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirilmesine olanak sa\u011flayacak programlama dilleri olsa da (C#, Ruby, Kotlin, Python, Java, vs), ben C++ \u0131 daha \u00e7ok tercih ediyorum. \u0130lk ba\u015flarda ilgilendi\u011fim konularda (2B\/3B bilgisayar grafikleri, oyun geli\u015ftirme, sim\u00fclasyon sistemleri, g\u00f6m\u00fcl\u00fc sistemler) yayg\u0131n olarak kullan\u0131lmas\u0131 sebebi ile ba\u015flad\u0131 daha sonra da duygusal bir hal ald\u0131. K\u0131sacas\u0131 seviyorum uleynn \ud83d\ude42<\/p>\n<p>Bu ve sonraki &#8220;Modern C++&#8221; etiketli yaz\u0131lar\u0131mda bence her C++ geli\u015ftiricisinin bilmesi gereken bir tak\u0131m yeni \u00f6zelliklerden bahsedece\u011fim. Tabi modern derken ne kast etti\u011fimi merak ediyor olabilirsiniz. Asl\u0131nda C++ olduk\u00e7a eski bir programlama dili [<strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/tr.wikipedia.org\/wiki\/C%2B%2B\">Wikipedia<\/a><\/span><\/strong>]. Tasar\u0131mc\u0131s\u0131 Bjarne Stroustup amca dili ilk olarak 80 lerin ba\u015f\u0131nda yay\u0131nlad\u0131. O zamanlar doktora \u00e7al\u0131\u015fmalar\u0131 ile bu i\u015fe giri\u015fmi\u015f ve daha sonralar\u0131 C++ \u0131 \u015fekillendirmi\u015ftir, halen de aktif olarak \u00e7al\u0131\u015fmalar da yer al\u0131yor.<\/p>\n<p>\u0130lk ba\u015flarda o zamanlar kullan\u0131lmakta olan C programlama dilini baz alan ve bu dile s\u0131n\u0131f mekanizmalar\u0131n\u0131 getiren (C with Classes olarak ta bilinen) bir dil olarak 1979 da \u00e7\u0131kt\u0131. 90 larda ger\u00e7ekle\u015ftirilen standartla\u015ft\u0131rma ve C++ komitesinin kurulmas\u0131 sonras\u0131nda 2003 de, \u015fu anda da olduk\u00e7a yayg\u0131n olarak kullan\u0131lan 2003 C++03 (<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.iso.org\/standard\/38110.html\">ISO\/IEC 14882:2003<\/a><\/strong><\/span>) olu\u015fturuldu. Sonras\u0131nda ise 2011 lere kadar \u00e7ok ciddi bir g\u00fcncelleme olmad\u0131 ama 2011 den itibaren gayretli \u00e7al\u0131\u015fmalar sonras\u0131nda dil bir metamorfoz ge\u00e7irerek Modern C++ dedi\u011fimiz hali almaya ba\u015flad\u0131 ve sonras\u0131nda 2011 (C++0x), 2014 (C++1y) ve nihayet daha duman\u0131 burnunda olan (temmuz 2017 de yay\u0131nland\u0131) 2017 (C++1z) ortaya \u00e7\u0131kt\u0131. Bunlar ile C++ ger\u00e7ekten \u00e7ok g\u00fc\u00e7l\u00fc ve bir y\u00f6nden de bamba\u015fka bir dil haline geldi. \u0130\u015fte modern C++ dedi\u011fimde asl\u0131nda bu son \u00fc\u00e7 yay\u0131n ile birlikte gelen kabiliyetlerden a\u011f\u0131rl\u0131kl\u0131 olarak bahsediyor olaca\u011f\u0131m. A\u015fa\u011f\u0131da aktif olan C++ standartlar\u0131n\u0131 g\u00f6rebilirsiniz:<\/p>\n<table class=\"wikitable floatright\" style=\"margin-left: 1.5em; height: 239px;\" width=\"487\">\n<tbody>\n<tr>\n<th>Y\u0131l<\/th>\n<th>C++ Standard\u0131<\/th>\n<th>\u0130sim<\/th>\n<\/tr>\n<tr>\n<th>1998<\/th>\n<td><a href=\"https:\/\/www.iso.org\/standard\/25845.html\">ISO\/IEC 14882:1998<\/a><sup id=\"cite_ref-isocpp1998_20-0\" class=\"reference\"><\/sup><\/td>\n<td>C++98<\/td>\n<\/tr>\n<tr>\n<th>2003<\/th>\n<td><a href=\"https:\/\/www.iso.org\/standard\/38110.html\">ISO\/IEC 14882:2003<\/a><sup id=\"cite_ref-isocpp2003_21-0\" class=\"reference\"><\/sup><\/td>\n<td>C++03<\/td>\n<\/tr>\n<tr>\n<th>2011<\/th>\n<td><a href=\"https:\/\/www.iso.org\/standard\/50372.html\">ISO\/IEC 14882:2011<\/a><sup id=\"cite_ref-isocpp2011_22-0\" class=\"reference\"><\/sup><\/td>\n<td>C++11 \/ C++0x<\/td>\n<\/tr>\n<tr>\n<th>2014<\/th>\n<td><a href=\"https:\/\/www.iso.org\/standard\/64029.html\">ISO\/IEC 14882:2014<\/a><sup id=\"cite_ref-isocpp2014_23-0\" class=\"reference\"><\/sup><\/td>\n<td>C++14 \/ C++1y<\/td>\n<\/tr>\n<tr>\n<th>2017<\/th>\n<td><a href=\"https:\/\/www.iso.org\/standard\/68564.html\">ISO\/IEC 14882:2017<\/a><sup id=\"cite_ref-isocpp2017_9-1\" class=\"reference\"><\/sup><\/td>\n<td>C++17 \/ C++1z<\/td>\n<\/tr>\n<tr>\n<th>2020<\/th>\n<td>to be determined<\/td>\n<td>C++20<sup id=\"cite_ref-herbsutter.com_15-1\" class=\"reference\">[15]<\/sup><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A\u015fa\u011f\u0131da anlataca\u011f\u0131m\u0131z b\u00fct\u00fcn kabiliyetler C++11 den beri sunulmakta ve muhtemelen piyasadaki akl\u0131 ba\u015f\u0131nda \u00e7o\u011fu C++ derleyicisi ile sunuldu\u011funu d\u00fc\u015f\u00fcn\u00fcyorum. Ama tabi sizin bunlar\u0131 denemek i\u00e7in bir derleyicisi kurman\u0131za gerek yok \ud83d\ude42<\/p>\n<p><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.jdoodle.com\/online-compiler-c++14\">https:\/\/www.jdoodle.com\/online-compiler-c++14<\/a> <\/strong><\/span>i her zaman kullanabilirsiniz (buna da bir yaz\u0131 ay\u0131rmal\u0131y\u0131m \ud83d\ude42<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>nullptr<\/strong><\/span><\/h2>\n<p>E\u011fer siz de daha \u00f6nce C programlama dili kulland\u0131 iseniz veyahut C++ pointer aritmeti\u011fi ile u\u011fra\u015ft\u0131 iseniz. NULL pointer ifade etme iste\u011fi ve ihtiyac\u0131n\u0131 hissetmi\u015fsinizdir. Yani herhangi bir de\u011fer i\u00e7ermeme durumu. C ve C++ da bu anlamda her ne kadar 0 kullan\u0131lsa da (NULL, Null olarak de\u011fi\u015fkenlere atansa da) bu asl\u0131nda say\u0131sal bir de\u011fer ve bir pointer tipi de\u011fil. Bu \u00e7o\u011fu kullan\u0131m i\u00e7in s\u0131k\u0131nt\u0131 yaratmayabilir, fakat problem de olabilece\u011fi durumlar olabilmekte \ud83d\ude42 \u00d6rne\u011fin:<\/p>\n<pre class=\"lang:c++ decode:true\">const int NULL = 0;\r\nvoid function(int input);\r\nvoid function(char* input);\r\n\r\n\/\/ Bu durumda hangi metot sizce ca\u011fr\u0131l\u0131r?\r\nfunction(NULL);<\/pre>\n<p>\u0130lk bak\u0131\u015fta ikinci tan\u0131mlanan metot \u00e7a\u011fr\u0131lacak gibi g\u00f6r\u00fcnse de, asl\u0131nda ilk metot \u00e7a\u011fr\u0131l\u0131r. Peki neden? Asl\u0131nda cevap basit tan\u0131mlanan NULL bir tam say\u0131 tipi ve bunu parametre olarak ilk metot.<\/p>\n<p>\u0130lk bak\u0131\u015fta ne olacak ki bundan denilebilir veya \u00e7ok s\u0131k kar\u015f\u0131la\u015f\u0131lacak bir durum olmad\u0131\u011f\u0131 a\u015fikar fakat bu durum y\u00fczlerce sat\u0131r kod aras\u0131nda olu\u015ftu\u011fu durumda tespit etmek s\u0131k\u0131nt\u0131 olabilir (hele ki alt\u0131nda yatan mekanizma bilinmedi\u011finde).<\/p>\n<p>\u0130\u015fte bu tarz durumlar\u0131 ortadan kald\u0131rmak ve pointer da de\u011fer atanmam\u0131\u015f durumu daha net ifade etmek ad\u0131na C++ 0x ile birlikte <em>nullptr<\/em>\u00a0anahtar kelimesi eklenmi\u015ftir. nullptr b\u00fct\u00fcn pointer tan\u0131mlamalar\u0131nda kullan\u0131labilir ve \u00f6zel bir tip (std::nullptr_t) olarak tan\u0131mlanm\u0131\u015ft\u0131r. Tip bilgisine;<\/p>\n<pre class=\"lang:c++ decode:true \"> decltype (nullptr);<\/pre>\n<p>ile elde edilebilir. 0 halen valid bir null pointer de\u011feri olarak dil taraf\u0131ndan kabul edilse de bundan sonra NULL, 0 kullan\u0131m\u0131na ihtiya\u00e7 hissetti\u011finiz her yerde <em>nullptr<\/em> kullan\u0131n\u0131z (ve de kullanmal\u0131s\u0131n\u0131z).<\/p>\n<p>A\u015fa\u011f\u0131da bir tak\u0131m \u00f6rnek kullan\u0131mlar\u0131 da ekledim:<\/p>\n<pre class=\"lang:c++ decode:true\">char *pc = nullptr;     \/\/ TAMAM\r\nint  *pi = nullptr;     \/\/ TAMAM\r\nbool   b = nullptr;     \/\/ TAMAM. b \"false\" de\u011ferini ta\u015f\u0131makta.\r\nint    i = nullptr;     \/\/ HATA!\r\n\r\nfoo(nullptr);           \/\/ foo(char *) \u00e7a\u011fr\u0131lmakta, foo(int) de\u011fil<\/pre>\n<h2><span style=\"color: #0000ff;\"><strong>Enum s\u0131n\u0131flar\u0131 (Type-safe enumerations)<\/strong><\/span><\/h2>\n<p>K\u0131saca enum s\u0131n\u0131flar\u0131 daha \u00f6nce C++ da kullan\u0131lan C-style enum&#8217;lerde kar\u015f\u0131la\u015f\u0131lan a\u015fa\u011f\u0131daki s\u0131k\u0131nt\u0131lar\u0131 ortadan kald\u0131rmaktad\u0131r:<\/p>\n<ol>\n<li>Implicit conversion,<\/li>\n<li>Tan\u0131mlanma alan\u0131 kirlili\u011fi<\/li>\n<li>&#8220;forward declaration&#8221; yapamama s\u0131k\u0131nt\u0131s\u0131<\/li>\n<li>Enum de\u011ferlerine tip\/boyut atayamama,<\/li>\n<\/ol>\n<p>\u015eimdi gelelim C++0x \u00f6ncesi enumlara (bu arada eski tip enumler desteklenmeye devam ediyor ama art\u0131k kullanmayal\u0131m l\u00fctfen \ud83d\ude42 Mevcut C++ enum de\u011ferleri asl\u0131nda alt tarafta bir tam say\u0131 ile ifade edilmektedir.\u00a0 Bu tan\u0131mlanan de\u011ferler di\u011fer tam say\u0131 veya enum de\u011ferleri ile kar\u015f\u0131la\u015ft\u0131r\u0131labilmektedirler. Kodlama a\u00e7\u0131s\u0131ndan bu bir s\u0131k\u0131nt\u0131 olu\u015fturmamaktad\u0131r, sonu\u00e7ta ikisi de alt tarafta bir say\u0131. Fakat anlamsal olarak sak\u0131ncal\u0131 ve alakas\u0131z durumlar ortaya \u00e7\u0131kabilmektedir (meyve tipi ile 5 i kar\u015f\u0131la\u015ft\u0131rma, veya elma ile sar\u0131 renk enum de\u011ferlerini kar\u015f\u0131la\u015ft\u0131rma gibi e\u011fer bunlar\u0131n say\u0131sal de\u011ferleri ayn\u0131 ise bunlar ayn\u0131d\u0131r sonucu al\u0131nabilir). Bu s\u0131k\u0131nt\u0131 asl\u0131nda ba\u015fta ifade etti\u011fimiz 1 no lu s\u0131k\u0131nt\u0131lar\u0131 adreslemektedir.<\/p>\n<p>2. duruma gelince; eski tip enumlar ile tan\u0131mlanan de\u011ferlerin tan\u0131mlama alanlar\u0131 s\u0131n\u0131rland\u0131r\u0131lmam\u0131\u015ft\u0131r.\u00a0 Bu problem <code>Name Collision<\/code>\u00a0olarak ta ifade edilmi\u015ftir. Yani ayn\u0131 isme ait farkl\u0131 enum tipleri de olsa bunlar\u0131 ayn\u0131 tan\u0131mlama alan\u0131nda tan\u0131mlayamazs\u0131n\u0131z. \u00d6rnek ile daha a\u00e7\u0131k olacak san\u0131r\u0131m buyurun \ud83d\ude42<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ A\u015fa\u011f\u0131daki kod derlenmez\r\nenum Color {NONE, RED, GREEN, BLUE}; \r\nenum Alert {NONE, GREEN, YELLOW, RED};<\/pre>\n<p>Yeni gelen enum s\u0131n\u0131flar\u0131 ile birlikte yukar\u0131daki tan\u0131mlamalar\u00a0 art\u0131k a\u015fa\u011f\u0131daki gibi tan\u0131mlanabilir.<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ class kelimesine dikkat enum ile birlikte kullan\u0131lacakt\u0131r\r\nenum class Color {NONE, RED, GREEN, BLUE}; \r\nenum class Alert {NONE, GREEN, YELLOW, RED};\r\n\r\n\/\/ Kar\u015f\u0131la\u015ft\u0131rmalarda kullan\u0131m\r\nColor currentColor = Color::GREEN;\r\n\r\nif (Color::RED == currentColor)\r\n{\r\n    \/\/ gelen renk k\u0131rm\u0131z\u0131\r\n}\r\n\r\n\/\/ Ayn\u0131 zamanda fonksiyonlara parametre olarak verilebilir ve bunlara dair \r\n\/\/ forward declaration yapilabilir\r\nenum class Color; \/\/ Forward declaration\r\nvoid DrawText(Color currentColor);\r\n\r\n\/\/ Daha sonra ilgili enumun kullan\u0131laca\u011f\u0131 yerde enum tipi tan\u0131mlan\u0131r<\/pre>\n<p>\u015eu an mevcut bir \u00e7ok derleyici :: ile olan kullan\u0131m\u0131 desteklese de bu standart de\u011fildir. \u00d6rnekte ayr\u0131ca forward declaration&#8217;a da \u00f6rnek verilmi\u015ftir. Bu neden \u00f6nemli. Bu sayede \u00f6zellikle s\u0131k de\u011fi\u015fen enumlar\u0131n olmas\u0131 durumunda b\u00fct\u00fcn kodun ba\u015ftan derlenmesi yerine sadece bunlar\u0131n kullan\u0131ld\u0131\u011f\u0131 cpp kodlar\u0131n\u0131n derlenmesi yeterli olacakt\u0131r.<\/p>\n<p>Son olarak, eski enum kullan\u0131mlar\u0131na ili\u015fkin bir di\u011fer s\u0131k\u0131nt\u0131 tan\u0131mlanacak olan enum de\u011ferinin boyutunu belirleyememenizdir. Ka\u00e7 byte olarak tutulaca\u011f\u0131 ile ilgili dikte edilen bir standart olmasa da genelde el ile girilen en b\u00fcy\u00fck de\u011feri saklayabilecek b\u00fcy\u00fckl\u00fckte olmaktad\u0131r. Art\u0131k bu belirlenebilmekte ve signed ya da unsigned olan tam say\u0131 tipi bu ama\u00e7la kullan\u0131labilir. Varsay\u0131lan de\u011fer <em><strong>int<\/strong><\/em> tir.<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ ColorsChar =&gt; 1 byte olarak tutulacak\r\nenum class ColorsChar : char { RED = 1, GREEN = 2, BLUE = 3 };\r\n\r\n\/\/ ColorsShort =&gt; 2 byte olarak tutulacak\r\nenum class ColorsShort : short { RED = 1, GREEN = 2, BLUE = 3 };\r\n\r\n\/\/ ColorsInt =&gt; 4 byte olarak tutulacak\r\nenum class ColorsInt : int { RED = 1, GREEN = 2, BLUE = 3 };<\/pre>\n<h2><span style=\"color: #0000ff;\"><strong>Range-based d\u00f6ng\u00fcler<\/strong><\/span><\/h2>\n<p>Standart <em>for\u00a0<\/em>d\u00f6ng\u00fcleri i\u00e7in &#8220;syntactic sugar&#8221; olarak sunulan range-based d\u00f6ng\u00fcler art\u0131k C++ i\u00e7in de kullan\u0131labilecek (c# ve Java gibi dillerde zaten bulunmaktayd\u0131).<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ &amp; kullan\u0131m\u0131 ile\r\nstd::array&lt;int, 5&gt; a{ 1, 2, 3, 4, 5 };\r\nfor (int&amp; x : a) x *= 2;\r\n\/\/ a == { 2, 4, 6, 8, 10}  =&gt; g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi array in i\u00e7eri\u011fi de\u011fi\u015fmekte\r\n\r\n\/\/ normal kullan\u0131m\u0131 ile\r\nstd::array&lt;int, 5&gt; a{ 1, 2, 3, 4, 5 };\r\nfor (int x : a) x *= 2;\r\n\/\/ a == { 1, 2, 3, 4, 5 } =&gt; array in i\u00e7eri\u011fi de\u011fi\u015fmemekte\r\n\r\n\/\/ Eski C++:\r\nfor (std::vector&lt;int&gt;::iterator it = array.begin(); it != array.end(); ++it) \r\n{\r\n    std::cout &lt;&lt; *it &lt;&lt; std::endl;\r\n}\r\n \r\n\/\/ Modern C++:\r\nfor (int item : array) {\r\n    std::cout &lt;&lt; item &lt;&lt; std::endl;\r\n}<\/pre>\n<pre class=\"lang:c++ decode:true notranslate \">std::map&lt;std::string, std::vector&lt;int&gt;&gt; map; \r\nstd::vector&lt;int&gt; v; \r\nv.push_back(1); \r\nv.push_back(2); \r\nv.push_back(3); \r\n\r\nmap[\"one\"] = v; \r\n\r\nfor(const auto&amp; kvp : map) \r\n{ \r\n     std::cout &lt;&lt; kvp.first &lt;&lt; std::endl; \r\n\r\n     for(auto v : kvp.second) \r\n     { \r\n          std::cout &lt;&lt; v &lt;&lt; std::endl; \r\n     } \r\n}<\/pre>\n<p>Range-based d\u00f6ng\u00fcler C tipi diziler, initializer list&#8217;ler (bunu bir sonraki yaz\u0131ma b\u0131rak\u0131yorum) ve STL de tan\u0131mlanan iterator ve begin() \/ end() metotlar\u0131 tan\u0131mlanan s\u0131n\u0131flar i\u00e7in kullan\u0131labilir.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>auto<\/strong><\/span><\/h2>\n<p>Tan\u0131mlanan de\u011fi\u015fken tiplerinin sunulan ilklendirme veri tiplerine g\u00f6re derleyici taraf\u0131ndan otomatik olarak atanmas\u0131 kabiliyeti de art\u0131k C++ a geldi. \u00c7o\u011fu betik dil kullananlar bunu sevecektir \ud83d\ude42<\/p>\n<p>C++ 0x den \u00f6nce <em>auto\u00a0<\/em>veri tipinin tan\u0131mlanma alan\u0131 \u00f6mr\u00fcn\u00fc belirtmek i\u00e7in varsay\u0131lan olarak b\u00fct\u00fcn de\u011fi\u015fkenlere ekleniyordu. Art\u0131k <em>auto\u00a0<\/em>veri tipinin yerine kullan\u0131lacak ve derleyiciye karde\u015fim sana zahmet bu tipi otomatik olarak alg\u0131lar m\u0131s\u0131n diye rica da bulunacak. A\u015fa\u011f\u0131da \u00e7e\u015fitli \u00f6rnek kullan\u0131mlar verilmi\u015ftir:<\/p>\n<pre class=\"lang:c++ decode:true \">auto a = 3.14; \/\/ double\r\nauto b = 1; \/\/ int\r\nauto&amp; c = b; \/\/ int&amp;\r\nauto d = { 0 }; \/\/ std::initializer_list&lt;int&gt; =&gt; Bunu da yak\u0131nda anlataca\u011f\u0131m\r\nauto&amp;&amp; e = 1; \/\/ int&amp;&amp;  =&gt; Bunu da yak\u0131nda anlataca\u011f\u0131m\r\nauto&amp;&amp; f = b; \/\/ int&amp;\r\nauto g = new auto(123); \/\/ int*\r\nconst auto h = 1; \/\/ const int\r\nauto i = 1, j = 2, k = 3; \/\/ int, int, int\r\nauto l = 1, m = true, n = 1.61; \/\/ HATA -- `l` int, `m` ise bool. Bunlar ayn\u0131 olmal\u0131.\r\nauto o; \/\/ Hata-- `o` nun tipini belirlemek i\u00e7in bir veri girilmemi\u015f<\/pre>\n<p>A\u00e7\u0131k\u00e7as\u0131 yukar\u0131daki tan\u0131mlamalar i\u00e7in \u00e7ok ta b\u00fcy\u00fck bir faydas\u0131 yok gibi g\u00f6r\u00fcnse de as\u0131l kullan\u0131m kolayl\u0131\u011f\u0131 karma\u015f\u0131k veri tipi tan\u0131mlamalar\u0131nda ortaya \u00e7\u0131kmaktad\u0131r \u00f6rne\u011fin:<\/p>\n<pre class=\"lang:c++ decode:true\">\/\/ Normalde olan kullan\u0131m\r\nstd::vector&lt;int&gt; v = ...;\r\nstd::vector&lt;int&gt;::const_iterator cit = v.cbegin();\r\n\r\n\/\/ Yeni kullan\u0131m\r\nauto cit = v.cbegin();\r\n\r\n\/\/ Di\u011fer \u00f6rnekler\r\nstd::map&lt;std::string, std::vector&lt;int&gt;&gt; map;\r\nfor(auto it = begin(map); it != end(map); ++it) \r\n{\r\n}<\/pre>\n<p>Ayr\u0131ca C++1y (14) ile birlikte art\u0131k fonksiyonlar\u0131n d\u00f6n\u00fc\u015f de\u011ferlerinde de auto kullan\u0131labiliyoruz \ud83d\ude42<\/p>\n<pre class=\"lang:c++ decode:true \">\/\/ Modern C++:\r\nauto get_all_components() const\r\n{\r\n    std::vector&lt;Component*&gt; buffer;\r\n \r\n    for (auto &amp;item : storage_vector) {\r\n        buffer.push_back(item.second);\r\n    }\r\n \r\n    return buffer;\r\n}<\/pre>\n<p>Performans anlam\u0131nda herhangi bir ek maliyeti yoktur.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gerek akademik\/i\u015f hayat\u0131mda gerekse ki\u015fisel projelerimde a\u011f\u0131l\u0131kl\u0131 olarak kulland\u0131\u011f\u0131m programlama dili C++. Ger\u00e7i art\u0131k bir \u00e7ok g\u00fc\u00e7l\u00fc ve istediklerinizi h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirilmesine olanak sa\u011flayacak programlama dilleri olsa da (C#, Ruby, Kotlin, Python, Java, vs), ben C++ \u0131 daha \u00e7ok tercih ediyorum. \u0130lk ba\u015flarda ilgilendi\u011fim konularda (2B\/3B bilgisayar grafikleri, oyun geli\u015ftirme, sim\u00fclasyon sistemleri, g\u00f6m\u00fcl\u00fc sistemler)&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41],"tags":[43,13,44,977,42,976,978,45],"class_list":["post-189","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-auto","tag-c","tag-enum-class","tag-enum-siniflari","tag-modern-c","tag-nullptr","tag-range-based-donguler","tag-range-based-loops"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Gerek akademik\/i\u015f hayat\u0131mda gerekse ki\u015fisel projelerimde a\u011f\u0131l\u0131kl\u0131 olarak kulland\u0131\u011f\u0131m programlama dili C++. Ger\u00e7i art\u0131k bir \u00e7ok g\u00fc\u00e7l\u00fc ve istediklerinizi h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirilmesine olanak sa\u011flayacak programlama dilleri olsa da (C#, Ruby, Kotlin, Python, Java, vs), ben C++ \u0131 daha \u00e7ok tercih ediyorum. \u0130lk ba\u015flarda ilgilendi\u011fim konularda (2B\/3B bilgisayar grafikleri, oyun geli\u015ftirme, sim\u00fclasyon sistemleri, g\u00f6m\u00fcl\u00fc sistemler)... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2017-12-23T21:54:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-03-13T14:16:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png\" \/>\n\t<meta property=\"og:image:width\" content=\"32\" \/>\n\t<meta property=\"og:image:height\" content=\"32\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4\"},\"headline\":\"Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto\",\"datePublished\":\"2017-12-23T21:54:53+00:00\",\"dateModified\":\"2022-03-13T14:16:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/\"},\"wordCount\":1372,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"auto\",\"c++\",\"enum class\",\"enum s\u0131n\u0131flar\u0131\",\"Modern C++\",\"nullptr\",\"range-based d\u00f6ng\u00fcler\",\"Range-Based loops\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/\",\"name\":\"Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2017-12-23T21:54:53+00:00\",\"dateModified\":\"2022-03-13T14:16:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"description\":\"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/","og_locale":"tr_TR","og_type":"article","og_title":"Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Gerek akademik\/i\u015f hayat\u0131mda gerekse ki\u015fisel projelerimde a\u011f\u0131l\u0131kl\u0131 olarak kulland\u0131\u011f\u0131m programlama dili C++. Ger\u00e7i art\u0131k bir \u00e7ok g\u00fc\u00e7l\u00fc ve istediklerinizi h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirilmesine olanak sa\u011flayacak programlama dilleri olsa da (C#, Ruby, Kotlin, Python, Java, vs), ben C++ \u0131 daha \u00e7ok tercih ediyorum. \u0130lk ba\u015flarda ilgilendi\u011fim konularda (2B\/3B bilgisayar grafikleri, oyun geli\u015ftirme, sim\u00fclasyon sistemleri, g\u00f6m\u00fcl\u00fc sistemler)... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2017-12-23T21:54:53+00:00","article_modified_time":"2022-03-13T14:16:20+00:00","og_image":[{"width":32,"height":32,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"9 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4"},"headline":"Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto","datePublished":"2017-12-23T21:54:53+00:00","dateModified":"2022-03-13T14:16:20+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/"},"wordCount":1372,"commentCount":2,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["auto","c++","enum class","enum s\u0131n\u0131flar\u0131","Modern C++","nullptr","range-based d\u00f6ng\u00fcler","Range-Based loops"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/","name":"Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2017-12-23T21:54:53+00:00","dateModified":"2022-03-13T14:16:20+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2017\/12\/23\/modern-c-nullptr-enum-siniflari-range-based-donguler-auto\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Modern C++ (1): nullptr, enum s\u0131n\u0131flar\u0131, range-based d\u00f6ng\u00fcler, auto"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}},{"@type":"Person","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","caption":"yaz\u0131l\u0131mperver"},"description":"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)"}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=189"}],"version-history":[{"count":15,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/189\/revisions"}],"predecessor-version":[{"id":2496,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/189\/revisions\/2496"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}