ð TOP / ä»é²ïŒC++ææ³ç·èЧïŒèŠæ Œå¥å¯Ÿå¿ïŒ
ãä»é²ããŒãããåŒããïŒC++åºæ¬ææ³ïŒæ©èœããŒãã·ãŒãç·èЧ
ã倿°ã»åã»å¶åŸ¡æ§æã»ãã€ã³ã¿ã»åç
§ã»é¢æ°ã»ã¯ã©ã¹ã»STLã»ãã£ã¹ããŸã§ãC++03/11/14/17/20èŠæ Œå¯Ÿå¿ãéåŒãå®å
šãªãã¡ã¬ã³ã¹ã
ãªããžã§ã¯ãæåèšèšãã²ãŒã éçºãåŠã¶äžã§ããããããã®æ§æã©ãæžããã ã£ãïŒãããã¡ã®ãããžã§ã¯ãïŒC++11 / C++17çïŒã§ãã®æžãæ¹ã¯äœ¿ãããã ã£ãïŒããšè¿·ã£ãæã«ããã€ã§ãç¬æã«åŒãæ»ããèŠæ Œå¯Ÿå¿çC++ææ³ã¯ã€ãã¯ãªãã¡ã¬ã³ã¹ã§ããC++03ããC++11/14/17/20ãŸã§ã®äž»èŠãªéããåºæ¬åãå
¥åºåãå¶åŸ¡æ§é ãenum classããã€ã³ã¿/åç
§/nullptrã颿°ã»ã©ã ãåŒã»ãã³ãã¬ãŒãè¶
å
¥éãã¯ã©ã¹/æ§é äœãå¿
é STLïŒvector, map, string, string_view, unique_ptrïŒããããŠC++ã®åå®å
šãã£ã¹ããŸã§ãå®åã³ãŒãã¹ãããããšæ³šæç¹ãç¶²çŸ
ããŠããŸãã
ä»é²1. C++èŠæ Œæ©èŠè¡šã»åºæ¬ããŒã¿åã»å®æ°ã»å
¥åºå
ãããžã§ã¯ãã§äœ¿ããèŠæ ŒïŒC++03ãC++20ïŒã®å€å®åºæºãšãåããªããã£ãåãåæšè« autoã宿° constexprãé«éãªå
¥åºåã
ð§ ãã³ã®ã³å
茩
ãã³å
çïŒC++ã®åºæ¬ããŒã¿åã£ãŠå
šéšã§äœçš®é¡ãããã§ããïŒããèŠã int 以å€ã«ã unsigned ã longãããã« char16_t ã std::byte ãèŠãããŸãïŒ
ð»ââïž ã·ãã¯ãå
ç
ããïŒããã䜿ãåãã ãã§èª€éåãããC++ã«ååšãããåºæ¬ããŒã¿åã»åºå®å¹
æŽæ°ã»æåUnicodeã»æµ®åå°æ°ç¹ã»ç¹æ®åããå®å
šç¶²çŸ
ããŠæŽçãããïŒããŒããŠã§ã¢ãšã¡ã¢ãªã®å¢çãææ¡ããã®ããïŒ
### 0. C++èŠæ ŒããŒãžã§ã³ã®é²åæ©èŠå¹Žè¡š å®åã§ã³ãŒããæžãéãããã®æ©èœã¯çŸå Žã®C++èŠæ Œã§äœ¿ãããïŒããåžžã«æèããããšã極ããŠéèŠã§ãã | èŠæ Œå | éç§° | äž»ãªçŸå Žã§ã®äœçœ®ã¥ãã»ä»£è¡šçæ©èœ | | :--- | :--- | :--- | | **C++98 / 03** | ã¯ã©ã·ãã¯C++ | ã¬ã¬ã·ãŒçŸå Žã»çãã€ã³ã¿ã»æå `new`/`delete`ã»STLåºç€ã | | **C++11** | ã¢ãã³C++ã®å€æã | **ãæå€§ã®å€§æ¹æ°ã** `auto`, `nullptr`, ç¯å²for, ã©ã ãåŒ, `unique_ptr`, `enum class`, `constexpr`ãçãã€ã³ã¿ã®å±éºæ§ãåçã«æ²æ»
ãããã | | **C++14** | C++11ã®å®æåœ¢ | `std::make_unique`, ãžã§ããªãã¯ã©ã ã, `constexpr` ã®å¶éç·©åã | | **C++17** | çŸä»£å®åã®ããã¡ã¯ã | **ãçŸåšã®æ¥çæšæºã** åæåä»ãif/switch, `std::string_view`, `std::optional`, æ§é åæçž (`auto [k, v]`), `std::filesystem`ã | | **C++20** | 次äžä»£C++ | ã³ã³ã»ããïŒåå¶çŽ ConceptïŒ, ç¯å²ã©ã€ãã©ãªïŒRangesïŒ, ã³ã«ãŒãã³, `std::span`, `std::format`ã | --- ### 1. C++åºæ¬ããŒã¿åã»çµã¿èŸŒã¿å å®å
šç¶²çŸ
ãªãã¡ã¬ã³ã¹ C++ã®åã¯ãããŒããŠã§ã¢ã®ã¡ã¢ãªé åãäœãã€ã確ä¿ããã©ãè§£éããããã®å®£èšã§ãã以äžã®5ã«ããŽãªã§å
šåãç¶²çŸ
ã§ããŸãã #### â æŽæ°åºæ¬åïŒæšæºæŽæ°ïŒ ãC++98ãã | åå | 察å¿èŠæ Œ | ãµã€ãºïŒäžè¬çïŒ | 衚çŸã§ããç¯å²ã»çšé | äŸ | | :--- | :---: | :--- | :--- | :--- | | `bool` | C++98ã | 1ãã€ã | `true` (1) ãŸã㯠`false` (0) | `bool isGrounded = true;` | | `char` | C++98ã | 1ãã€ã | 1æåïŒASCIIïŒ/ 笊å·ã®æç¡ã¯ã³ã³ãã€ã©äŸå | `char rank = 'S';` | | `signed char` | C++98ã | 1ãã€ã (8bit) | 確å®ã«ç¬Šå·ä»ãã®8bitæŽæ° (-128ã127) | `signed char delta = -5;` | | `unsigned char` | C++98ã | 1ãã€ã (8bit) | 笊å·ãªã8bitæŽæ° (0ã255 / çãã€ã衚çŸ) | `unsigned char byte = 0xFF;` | | `short` (`short int`) | C++98ã | 2ãã€ã (16bit) | -32,768 ã +32,767 | `short volume = 100;` | | `unsigned short` | C++98ã | 2ãã€ã (16bit) | 0 ã 65,535 (ããŒãçªå·ç) | `unsigned short port = 8080;` | | `int` | C++98ã | 4ãã€ã (32bit) | æŽæ°ïŒçŽ -21åã+21åïŒ | `int score = 1000;` | | `unsigned int` | C++98ã | 4ãã€ã (32bit) | 0 ã çŽ42.9å (éè² ã«ãŠã³ã¿ã»ããããã¹ã¯) | `unsigned int flags = 0x01;` | | `long` | C++98ã | 4ãŸãã¯8ãã€ã | Windows 64bit(LLP64)ã§ã¯4ãã€ããLinux 64bit(LP64)ã§ã¯8ãã€ã | `long count = 100000L;` | | `unsigned long` | C++98ã | 4ãŸãã¯8ãã€ã | 笊å·ãªãlong (Windows: 32bit / Linux: 64bit) | `unsigned long uCount = 100UL;` | | `long long` | **C++11ã** | 8ãã€ã (64bit以äž) | å·šå€§æŽæ°ïŒçŽ -922京ã+922äº¬ïŒ | `long long bigId = 9999999999LL;` | | `unsigned long long` | **C++11ã** | 8ãã€ã (64bit以äž) | 0 ã çŽ1844京 | `unsigned long long maxId = ~0ULL;` | #### â¡ åºå®å¹
æŽæ°åã»å®åæšæºåïŒ<cstdint> / <cstddef>ïŒ ãC++11ã å®åæšæºã ç°å¢å·®ïŒWindows vs LinuxçïŒã«ãããã°ãé²ããããã²ãŒã ã»éä¿¡éçºã§ã¯ä»¥äžã®åºå®å¹
åãæåªå
ã§äœ¿ãããŸãã | åå | 察å¿èŠæ Œ | ãµã€ãº | 衚çŸã§ããç¯å²ã»çšé | äŸ | | :--- | :---: | :--- | :--- | :--- | | `int8_t` / `uint8_t` | **C++11ã** | 1ãã€ã (8bit) | å³å¯ãª8bitæŽæ° (-128ã127 / 0ã255)ãRGBã«ã©ãŒå€ç | `uint8_t alpha = 255;` | | `int16_t` / `uint16_t` | **C++11ã** | 2ãã€ã (16bit) | å³å¯ãª16bitæŽæ° (-32,768ã32,767 / 0ã65,535) | `int16_t sample = -1200;` | | `int32_t` / `uint32_t` | **C++11ã** | 4ãã€ã (32bit) | å³å¯ãª32bitæŽæ°ã座æšã»ã¹ã³ã¢ã»ãã±ããæ§é äœ | `uint32_t color = 0xFF00FFFF;` | | `int64_t` / `uint64_t` | **C++11ã** | 8ãã€ã (64bit) | å³å¯ãª64bitæŽæ°ãããªç§ã¿ã€ã ã¹ã¿ã³ãããŠãŒã¶ãŒID | `int64_t nowMs = 1710000000000LL;` | | `size_t` | C++98ã | 4ãŸãã¯8ãã€ã | ã¡ã¢ãªãµã€ãºã»é
åã€ã³ããã¯ã¹çšã®éè² æŽæ° (笊å·ãªããã€ã³ã¿é·) | `size_t len = vec.size();` | | `ptrdiff_t` | C++98ã | 4ãŸãã¯8ãã€ã | 2ã€ã®ãã€ã³ã¿éã®è·é¢ïŒã€ãã¬ãŒã¿ã®æžç®çµæã»ç¬Šå·ä»ãïŒ | `ptrdiff_t diff = ptr2 - ptr1;` | | `intptr_t` / `uintptr_t` | **C++11ã** | 4ãŸãã¯8ãã€ã | ãã€ã³ã¿ãšåããããå¹
ãæã€æŽæ°åïŒãã€ã³ã¿ã®ã¢ãã¬ã¹æ°å€åïŒ | `uintptr_t addr = (uintptr_t)ptr;` | #### ⢠æååã»UnicodeæååïŒåœéå察å¿ïŒ | åå | 察å¿èŠæ Œ | ãµã€ãº | 衚çŸã§ããç¯å²ã»çšé | äŸ | | :--- | :---: | :--- | :--- | :--- | | `char` | C++98ã | 1ãã€ã | ASCIIæå / UTF-8 code unit | `char c = 'A';` | | `wchar_t` | C++98ã | 2ãŸãã¯4ãã€ã | ã¯ã€ãæå (Windows: 16bit UTF-16 / Linux: 32bit UTF-32) | `wchar_t wc = L'ã';` | | `char8_t` | **C++20ã** | 1ãã€ã | UTF-8å°çšæååïŒcharãšã®æ··åãåã¬ãã«ã§é²æ¢ïŒ | `char8_t u8c = u8'A';` | | `char16_t` | **C++11ã** | 2ãã€ã | UTF-16æååïŒãµãã²ãŒããã¢å¯Ÿå¿ïŒ | `char16_t u16c = u'ã';` | | `char32_t` | **C++11ã** | 4ãã€ã | UTF-32æååïŒå
šUnicodeã1æå1èŠçŽ ã§è¡šçŸïŒ | `char32_t u32c = U'ð±';` | #### ⣠浮åå°æ°ç¹æ°åïŒå®æ°ïŒ | åå | 察å¿èŠæ Œ | ãµã€ãº | ç²ŸåºŠã»æå¹æ¡æ°ã»çšé | äŸ | | :--- | :---: | :--- | :--- | :--- | | `float` | C++98ã | 4ãã€ã (32bit) | åç²ŸåºŠïŒæå¹æ¡æ°çŽ7æ¡ïŒãã²ãŒã ã®3D座æšã»ç©çæŒç®ã»GPU | `float speed = 3.14f;` | | `double` | C++98ã | 8ãã€ã (64bit) | åç²ŸåºŠïŒæå¹æ¡æ°çŽ15ã17æ¡ïŒã粟å¯èšç®ã»ã·ãã¥ã¬ãŒã·ã§ã³ã®æšæº | `double preciseVal = 3.14159265;` | | `long double` | C++98ã | 8/12/16ãã€ã | æ¡åŒµå粟床ïŒx86ã§ã¯80bitãARMã§ã¯128bitçç°å¢äŸåïŒ | `long double highPrec = 1.0L;` | #### â€ ç¹æ®åã»åæšè«ã»çã¡ã¢ãªå | åå | 察å¿èŠæ Œ | ãµã€ãº | ç¹åŸŽã»çšé | äŸ | | :--- | :---: | :--- | :--- | :--- | | `void` | C++98ã | 0ãã€ã | å€ãæããªã空ã®åïŒæ»ãå€ãªã颿°ã`void*` æ±çšãã€ã³ã¿ïŒ | `void update(); void* p = ptr;` | | `std::nullptr_t` | **C++11ã** | ãã€ã³ã¿é· | `nullptr` ã®åºæåããã€ã³ã¿ãªãŒããŒããŒã解決ã®å®å
šåŒ | `std::nullptr_t nullVal = nullptr;` | | `std::byte` | **C++17ã** | 1ãã€ã | æ°å€ãæåã§ã¯ãªãçŽç²ãªãçã®ãã€ããªããŒã¿ãå (`<cstddef>`) | `std::byte b{0x3F};` | | `auto` | **C++11ã** | ã³ã³ãã€ã«ææ±ºå® | å³èŸºã®åŒããåãèªåæšè«ïŒã€ãã¬ãŒã¿ãã©ã ãä¿æã«å¿
é ïŒ | `auto iter = vec.begin();` | | `decltype(åŒ)` | **C++11ã** | åŒã®å | æå®ããåŒã倿°ã®åãã³ã³ãã€ã«æã«ååŸããæŒç®å | `decltype(score) newScore;` | > **ð¡ ã·ãã¯ãæå°å®ã®Tips: ãªãåºå®å¹
æŽæ°åïŒint32_tçïŒãå®åæšæºãªã®ãïŒ** > C++èŠæ Œã§ã¯ `int` ã¯ã16bit以äžãã`long` ã¯ã32bit以äžããšããå®ããããŠããããWindowsïŒ64bitã§ãlongã¯4ãã€ãïŒãšLinuxïŒ64bitã ãšlongã¯8ãã€ãïŒã§ãµã€ãºãé£ãéããŸãããã±ããéä¿¡ããã¡ã€ã«ä¿åã§èŽåœçãªãºã¬ãçããããçŸå Žã§ã¯ `int32_t` ã `uint64_t` ãªã©ã®æç€ºçãããé·ã䜿ãã®ãåžžèãªãããïŒ --- ### 2. 宿°å®£èš: const ãC++98ã vs constexpr ãC++11/14ã Cèšèªã® `#define MAX_ENEMY 100` ã®ãããªãã¯ã宿°ã¯åæ
å ±ããªããããã°ãã«ãããããçŸä»£C++ã§ã¯ **`constexpr`** ã䜿çšããŸãã ```cpp // â éæšå¥š: Cèšèªæµãã¯ãïŒã¹ã³ãŒãç¡èŠã»åå®å
šæ§ãªãïŒ #define MAX_HP 999 // â C++98: const 宿°ïŒå®è¡æç¢ºå®ã§ãOKïŒ const int MaxPlayers = 4; // ð C++11/14: constexprïŒã³ã³ãã€ã«æèšç®ã®å®æ°ã»é
åãµã€ãºã«äœ¿ããïŒ constexpr int ScreenWidth = 800; constexpr int ScreenHeight = 600; constexpr int TotalPixels = ScreenWidth * ScreenHeight; // ã³ã³ãã€ã«æã«èšç®å®äºïŒ // constexpr 颿° (C++14ã: ã«ãŒããæ¡ä»¶åå²ãå¯èœ) constexpr int square(int x) { return x * x; } int buffer[square(4)]; // ã³ã³ãã€ã«æå®æ°ãªã®ã§é
åãµã€ãºã«äœ¿ããïŒ ``` --- ### 3. æšæºå
¥åºåïŒstd::cin / std::coutïŒ ãC++98ãã ```cpp #include <iostream> #include <string> int main() { int score = 100; std::string name = "Shirokuma"; // åºå: << æŒç®åã§ç¹ãã std::cout << "åå: " << name << ", ã¹ã³ã¢: " << score << "\n"; // å
¥å: >> æŒç®åã§å€æ°ã«æ ŒçŽ std::cout << "æ°ããã¹ã³ã¢ãå
¥å: "; std::cin >> score; return 0; } ``` > **â ïž æ³šæ: std::endl ãã '\n' ã䜿ãã** > `std::endl` ã¯æ¹è¡ãšåæã«ããããã¡ã®åŒ·å¶ãã©ãã·ã¥ïŒflushïŒããè¡ããããã²ãŒã ã«ãŒãå
ã§å€çšãããšåçã«åŠçé床ãèœã¡ãŸããæ®æ®µã¯ `\n` ã䜿ããŸãããã
ä»é²2. å¶åŸ¡æ§æã»åæåïŒenum classïŒã»æ§é åæçž
if, switch, åæåä»ãif/switch ãC++17ã, enum class ãC++11ã, ç¯å²for ãC++11ã, æ§é åæçž ãC++17ãã
ð§ ãã³ã®ã³å
茩
foræãè²ã
ãªæžãæ¹ããããŸãããïŒãããšãçŸå Žã§ãçenumã§ã¯ãªã enum class ã䜿ãããšæãããã®ã§ãããäœãéããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
çenumã¯ååãã¹ã³ãŒãå€ã«æŒãåºããåæã« int ã«å倿ãããŠãã°ã®æž©åºã«ãªããããïŒC++11ã®ãenum classããšãç¯å²foræããããã«C++17ã®ãæ§é åæçžãããã¹ã¿ãŒããã°ãçŸä»£ã®çŸå Žã³ãŒãã¯æããªããïŒ
### 1. æ¡ä»¶åå² (if / else) ãC++98ãã & åæåä»ãif ãC++17ãã ```cpp // éåžžã®ifæ ãC++98ãã if (playerHp <= 0) { std::cout << "ã²ãŒã ãªãŒããŒ\n"; } else if (playerHp < 30) { std::cout << "èŠå: ãã³ãïŒ\n"; } else { std::cout << "å®å
š\n"; } // ð C++17: åæåä»ãifæïŒã¹ã³ãŒããifãããã¯å
ã ãã«éå®ã§ããŠè¶
å®å
šïŒïŒ if (auto* enemy = findTarget(); enemy != nullptr) { enemy->takeDamage(10); // enemy ã¯ãã® if ãããã¯å
ã§ã®ã¿çåããå€ã«æŒããªã } ``` --- ### 2. åæå: enum ãC++98ã vs enum class ãC++11ãã çŸä»£C++ã®å®åã§ã¯ãç¹å¥ãªçç±ããªãéã **`enum class`** ã®ã¿ãèš±å¯ãããŸãã ```cpp // â ã¬ã¬ã·ãŒ: çã® enum (C++98) // åé¡1: TITLE ã PLAYING ãå€ã®ã°ããŒãã«ç©ºéãæ±æãã // åé¡2: int ãšæé»ã«æ¯èŒã»ä»£å
¥ã§ããŠããŸãåå®å
šã§ãªã (if (state == 0) ãéã) enum LegacyState { TITLE, PLAYING }; // â çŸä»£æšæº: enum class (C++11ã ã¹ã³ãŒãä»ãåæå) enum class GameState { Title, Playing, GameOver }; // äœ¿ãæ¹: å¿
ã GameState:: ãå眮ããïŒååè¡çªãŒãïŒïŒ GameState state = GameState::Playing; // if (state == 1) â ã³ã³ãã€ã«ãšã©ãŒïŒïŒæé»ã®int倿ãé²ããã°ã黿¢ïŒ if (state == GameState::Playing) { // æ£åžžåŠç } ``` --- ### 3. å€å²åå² (switch / case) ãC++98ãã & åæåä»ãswitch ãC++17ãã ```cpp switch (state) { case GameState::Title: renderTitle(); break; // breakãå¿ãããšäžã®caseãžèœäžïŒãã©ãŒã«ã¹ã«ãŒïŒããã®ã§æ³šæïŒ case GameState::Playing: updateGame(); break; case GameState::GameOver: showResult(); break; } // ð C++17: åæåä»ãswitchæ switch (auto status = getNetworkStatus(); status) { // status ã®æå¹ç¯å²ã switch å
ã«éå® } ``` --- ### 4. ã«ãŒãæ§æïŒfor / ç¯å²for ãC++11ã / æ§é åæçž ãC++17ãïŒ ```cpp #include <vector> #include <unordered_map> #include <string> std::vector<int> scores = { 100, 250, 400 }; // â ç¯å²foræ ãC++11ããïŒæãæšå¥šïŒã³ããŒãé²ãããã« const auto& ã䜿ãïŒ for (const auto& s : scores) { std::cout << s << "\n"; } // â¡ å€ã倿Žãããå Žåã®ç¯å²foræïŒéconståç
§ auto&ïŒ for (auto& s : scores) { s += 10; // èŠçŽ ãã®ãã®ãæžãæã } // ⢠æ§é åæçž (Structured Binding) ãC++17ããïŒãããã®ããŒãšå€ãäžçºåè§£ïŒïŒ std::unordered_map<std::string, int> itemPrices = { {"Potion", 50}, {"Ether", 120} }; for (const auto& [item, price] : itemPrices) { std::cout << item << " 㯠" << price << "G ã§ã\n"; } // ⣠ã€ã³ããã¯ã¹ãå¿
èŠãªå Žåã®äŒçµ±çforæ ãC++98ãã for (size_t i = 0; i < scores.size(); ++i) { std::cout << i << "äœ: " << scores[i] << "\n"; } // †whileæ ãC++98ãã int countdown = 3; while (countdown > 0) { std::cout << countdown-- << "...\n"; } ```
ä»é²3. ãã€ã³ã¿ïŒ*ïŒã»åç
§ïŒ&ïŒã»nullptr ãC++11ãã®å®å
šæ»ç¥
ãã¢ãã¬ã¹ãã鿥åç
§ããåç
§æž¡ãããconståç
§ãããããŠNULLã®ææ§ããè¬ãå»ã£ãåå®å
šãª nullptr ãC++11ãã®æ±ºå®æã
ð§ ãã³ã®ã³å
茩
`int*` ãš `int&`ãèšå·ã䌌ãŠããŠé ãççºãããã§ãâŠâŠïŒããšã`NULL` ãš `nullptr` ã£ãŠäœãéããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ã¬ããïŒéãã¯æ¥µããŠæå¿«ããïŒ
ã»ãã€ã³ã¿ïŒ*ïŒã¯ãäœæïŒã¢ãã¬ã¹ïŒãã¡ã¢ããçŽãã空ã£ãœïŒnullptrïŒã«ããªããããå¥ã®äœæãæãçŽãããšãã§ããã
ã»åç
§ïŒ&ïŒã¯ãå®äœã«ã€ããããã åããã絶察㫠nullptr ã«ã¯ãªãããçæ¶¯ãã®å®äœãæãç¶ããïŒ
ãã㊠NULL ã¯å€§æã®æŽæ°ã® 0 ããããC++11 ã®ãnullptrãã¯æ£çæ£éã®ãã€ã³ã¿å°çšåããïŒ
### 1. ãã€ã³ã¿ vs åç
§ã®æ¯èŒè¡š | æ¯èŒé
ç® | ãã€ã³ã¿ (`T*`) ãC++98ãã | åç
§ (`T&`) ãC++98ãã | | :--- | :--- | :--- | | **æ¬è³ª** | ã¢ãã¬ã¹ïŒã¡ã¢ãªçªå°ïŒãæ ŒçŽããç¬ç«ãã倿° | æ¢åã®ãªããžã§ã¯ãã«å¯Ÿãããå¥åïŒãšã€ãªã¢ã¹ïŒã | | **ç©ºïŒæªåæå/ç¡å¹ïŒ** | **å¯èœ** (`int* p = nullptr;`) | **äžå¯**ïŒå¿
ãæå¹ãªå®äœãžã®çµåãå¿
èŠïŒ | | **å代å
¥ïŒå¯Ÿè±¡ã®å€æŽïŒ**| **å¯èœ**ïŒå¥ã®å€æ°ã®ã¢ãã¬ã¹ã代å
¥å¯èœïŒ | **äžå¯**ïŒäžåºŠãã€ã³ããããäžçãã®å®äœãæãïŒ | | **æ§æ** | ã¢ãã¬ã¹ååŸ `&x`ãäžèº«ã¢ã¯ã»ã¹ `*p` | æ®éã®å€æ°ãšå
šãåãããã«æ±ããïŒ`ref = 20;`ïŒ | | **å®åã®åå** | nullptr ã蚱容ãããå Žåã®ã¿äœ¿çš | **ãæåªå
ãnullptr ãããåŸãªãå Žåã¯åžžã«åç
§ã䜿ã** | --- ### 2. nullptr ãC++11ãã vs NULL / 0 ãC++98ãïŒãªãçŸä»£ã§NULLã¯çŠæ¢ãªã®ãïŒïŒ çŸä»£C++ã«ãããŠã`NULL` ã `0` ã§ãã€ã³ã¿ãåæåããããšã¯éçè§£æããŒã«ã§é倧èŠåïŒClang-TidyçïŒãšãªããŸãã ```cpp // â å±éº: NULL ã¯ãã¯ãã§åãªãæŽæ° 0 ãšå®çŸ©ãããŠããããšãå€ã void printTarget(int id) { std::cout << "ID: " << id << "\n"; } void printTarget(Enemy* e) { std::cout << "Enemy Pointer\n"; } printTarget(NULL); // ðš ææ§ããšã©ãŒïŒããã㯠printTarget(int) ãåŒã°ããŠããŸãå€§äºæ
ïŒ // â çŸä»£æšæº: nullptr ãC++11ãã(std::nullptr_t å) printTarget(nullptr); // 確å®ã« printTarget(Enemy*) ãåŒã°ããïŒ100%åå®å
š ``` --- ### 3. å®è·µã³ãŒãäŸ: ã¢ãã¬ã¹ååŸãšåç
§ ãC++98ãã ```cpp #include <iostream> void pointerExample() { int val = 42; int* ptr = &val; // &val ã§ val ã®ã¡ã¢ãªã¢ãã¬ã¹ãååŸ std::cout << "val ã®ã¢ãã¬ã¹: " << ptr << "\n"; std::cout << "ptr ãæãäžèº«: " << *ptr << "\n"; // * ã§éåç
§ïŒäžèº«ãèªãïŒ *ptr = 100; // ptr ãéã㊠val ã®å€ã 100 ã«æžãæãã } void referenceExample() { int val = 42; int& ref = val; // ref 㯠val ã®å¥åïŒãšã€ãªã¢ã¹ïŒ ref = 999; // * ãä»ããã«ãã®ãŸãŸä»£å
¥ïŒval ã 999 ã«ãªã } ``` --- ### 4. const ãšã®çµã¿åããïŒé¢æ°ã®åŒæ°èšèšã®éåïŒ ãC++98ãã ```cpp // 1. 倿ž¡ã: 巚倧ãªãªããžã§ã¯ãã ãšå
šã³ããŒãçºçãæ¿é
ïŒ void processCopy(std::string str); // 2. åç
§æž¡ã: äžèº«ã颿°å
ã§æžãæããŠåŒã³åºãå
ã«æ»ãå Žå void addScore(int& score) { score += 10; } // 3. conståç
§æž¡ã: ãæãé »åºïŒãã³ããŒãäžåãããèªã¿åãå°çšã§é«éã«æž¡ã void printName(const std::string& name) { // name = "New"; â ã³ã³ãã€ã«ãšã©ãŒïŒæžãæãçŠæ¢ã§å®å
šïŒïŒ std::cout << name << "\n"; } ```
ä»é²4. 颿°ã»ãªãŒããŒããŒãã»ã©ã ãåŒã»ãã³ãã¬ãŒãè¶
å
¥é
ãªãŒããŒããŒã ãC++98ããC++11ã®æåŒ·å
µåšãã©ã ãåŒããC++14ããžã§ããªãã¯ã©ã ããããããŠSTLã®å±±æ¬åŒ§ <> ã®æ£äœã§ããã颿°ãã³ãã¬ãŒãè¶
å
¥éããC++98ããã
ð§ ãã³ã®ã³å
茩
ã©ã ãåŒã£ãŠ `[](){}` ã¿ãããªé¡æåã¿ãããªèšå·ã§ããããããšãSTLã§èŠããã `<typename T>` ã `<int>` ã£ãŠäœè
ãªãã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ã©ã ãåŒãC++11ãã¯ãã®å Žéãã®äœ¿ãæšãŠé¢æ°ãã¹ããŒãã«æžãæŠåšããïŒãããŠå±±æ¬åŒ§ `<>` ã¯ããã³ãã¬ãŒãããšåŒã°ãããåã ããå·®ãæ¿ããŠåãåŠçã䜿ãåããC++ã®å¥¥çŸ©ãªãããïŒäž¡æ¹æŒãããŠãããïŒ
### 1. 颿°ã®ãªãŒããŒããŒããšããã©ã«ãåŒæ° ãC++98ãã ```cpp // ãªãŒããŒããŒã: åã颿°åã§åŒæ°ã®åãæ°ãç°ãªã颿°ãå®çŸ©ã§ãã int add(int a, int b) { return a + b; } float add(float a, float b) { return a + b; } // ããã©ã«ãåŒæ°: åŒæ°ãçç¥ãããæã®åæå€ãæå®ïŒå³åŽã®åŒæ°ããé ã«æå®ïŒ void spawnEnemy(int x, int y, int hp = 100) { // hp ãæž¡ãããªããã° 100 ã«ãªã } spawnEnemy(10, 20); // hp = 100 spawnEnemy(10, 20, 500); // hp = 500 (ãã¹) ``` --- ### 2. ã©ã ãåŒïŒç¡å颿°ïŒ ãC++11ãã & ãžã§ããªãã¯ã©ã ã ãC++14ãã ```cpp #include <algorithm> #include <vector> // åºæ¬æ§æ: [ãã£ããã£](åŒæ°) -> æ»ãå€ã®å { åŠç } auto greet = [](const std::string& name) { std::cout << "ããã«ã¡ã¯ã" << name << "ããïŒ\n"; }; greet("ã·ãã¯ã"); // 宿ŠäŸ: std::sort ã§æµãHPé ã«äžŠã³æ¿ãã struct Enemy { int id; int hp; }; std::vector<Enemy> enemies = { {1, 50}, {2, 200}, {3, 10} }; // ã©ã ãåŒã§äžŠã³æ¿ãæ¡ä»¶ãã€ã³ã©ã€ã³èšè¿° std::sort(enemies.begin(), enemies.end(), [](const Enemy& a, const Enemy& b) { return a.hp < b.hp; // HPãäœãé ã«ãœãŒã }); // ãã£ããã£ã®åºæ¬: int threshold = 100; // [threshold]: å€ã®å€æ°ãã³ããŒããŠæã¡èŸŒãïŒèªã¿åãå°çšïŒ // [&threshold]: å€ã®å€æ°ãåç
§ãšããŠæã¡èŸŒãïŒæžãæãå¯èœïŒ // [&]: å€ã®å
šå€æ°ãåç
§ãã£ãã㣠auto isHighHp = [threshold](const Enemy& e) { return e.hp >= threshold; }; // ð C++14: ãžã§ããªãã¯ã©ã ãïŒåŒæ°ã« auto ã䜿ããïŒïŒ auto printItem = [](const auto& item) { std::cout << item << "\n"; }; ``` --- ### 3. 颿°ãã³ãã¬ãŒãè¶
å
¥é ãC++98ããïŒSTLã®å±±æ¬åŒ§ <> ã®æ£äœïŒ ãåãéãã ãã§ãå
šãåãããžãã¯ãäœåãæžããããªãããšãã«äœ¿ããŸãã ```cpp // ä»»æã®å T ãåãåã£ãŠå€§ããæ¹ãè¿ããã³ãã¬ãŒã颿° template <typename T> T myMax(T a, T b) { return (a > b) ? a : b; } // äœ¿ãæ¹: int maxInt = myMax<int>(10, 20); // åãæç€ºæå®: T = int double maxDbl = myMax(3.14, 2.71); // åŒæ°ããèªååæšè«: T = double // ð¡ ããããããstd::vector<int> ã std::make_unique<Enemy>() ã®å±±æ¬åŒ§ <> ã®ä»çµã¿ïŒ // ã¯ã©ã¹ã颿°ã«ãåãå€ããæ³šå
¥ãããããã®C++ã®æ ¹æ¬æ©èœã§ãã ```
ä»é²5. ã¯ã©ã¹ïŒclassïŒã»æ§é äœïŒstructïŒã»çŸä»£çã¯ã©ã¹èšèš
struct ãš class ã®éã ãC++98ããã¡ã³ãåæååãªã¹ããC++11ã®ã¡ã³ãå
åæåã= default / = deleteãoverride 修食åã
ð§ ãã³ã®ã³å
茩
C++ã§ã¯ `struct` ãš `class` ã£ãŠäœãéããã§ããïŒããš `= default` ã `override` ãªã©ã®æ°ããŒã¯ãŒããããèŠãããŸãïŒ
ð»ââïž ã·ãã¯ãå
ç
struct ãš class ã®éãã¯ãã£ã1ã€ïŒãäœãæžããªãã£ãæã®ããã©ã«ãã public ã private ããã ãããïŒ
ãã㊠C++11 ããå ãã£ã `= default`, `= delete`, `override` ã¯ãèšèšãã¹ãã³ã³ãã€ã«æ®µéã§100%匟ãçŸä»£ã®å¿
é è£
åããïŒ
### 1. struct vs class ã®æ¯èŒ ãC++98ãã | æ¯èŒé
ç® | æ§é äœ (`struct`) | ã¯ã©ã¹ (`class`) | | :--- | :--- | :--- | | **ããã©ã«ãã®ã¢ã¯ã»ã¹æš©** | **`public:`**ïŒå€éšããèªç±ã«ã¢ã¯ã»ã¹å¯èœïŒ | **`private:`**ïŒå€éšããéå
¬éã»é èœïŒ | | **ããã©ã«ãã®ç¶æ¿** | `public` ç¶æ¿ | `private` ç¶æ¿ | | **å®åã§ã®äœ¿ãåã** | ã¡ã³ã颿°ãæããªããããŒã¿ã®æãåã | ã«ãã»ã«åïŒå
éšç¶æ
ãé ãïŒãããããªããžã§ã¯ããåã | --- ### 2. çŸä»£C++ã®ã¯ã©ã¹æšæºèšèšãã³ãã¬ãŒã ãC++11ã17ã ```cpp #include <string> #include <algorithm> #include <iostream> class Player { // 1. private: å€éšããçŽæ¥æžãæããããªãå
éšããŒã¿ private: std::string name_; // ð C++11: ã¡ã³ãå
åæåïŒã³ã³ã¹ãã©ã¯ã¿ã§æžãå¿ããŠããŽãå€ãå
¥ããªãïŒïŒ int hp_{100}; int maxHp_{100}; // 2. public: å€éšã«å
¬éããã€ã³ã¿ãŒãã§ãŒã¹ public: // ã³ã³ã¹ãã©ã¯ã¿: ã¡ã³ãåæååãªã¹ã (: name_(name)...) ã䜿ãã®ãéå // explicit ãC++98ãã: æå³ããªãæé»ã®å倿ïŒPlayer p = 100; çïŒãé²ã explicit Player(std::string name, int maxHp = 100) : name_(std::move(name)), hp_(maxHp), maxHp_(maxHp) {} // ãã¹ãã©ã¯ã¿ ãC++11ãã: ã³ã³ãã€ã©çæã®æšæºåäœã§ããããšãæç€º ~Player() = default; // ð C++11: ã³ããŒçŠæ¢ã®å®£èšïŒæµ
ãã³ããŒã«ããäºéè§£æŸãã°ãå®å
šå°æ®ºïŒ Player(const Player&) = delete; Player& operator=(const Player&) = delete; // ã²ãã¿ãŒ (constã¡ã³ã颿° ãC++98ãã: ã¡ã³ã倿°ã倿Žããªãããšãã³ã³ãã€ã©ãä¿èšŒ) int getHp() const { return hp_; } const std::string& getName() const { return name_; } // ããžãã¹ããžãã¯ïŒç¶æ
倿ŽïŒ void takeDamage(int dmg) { hp_ = std::max(0, hp_ - dmg); // äžæ£ãªãã€ãã¹å€ãé²ã } }; // ð C++11: override æå®åïŒåºåºã¯ã©ã¹ã®ä»®æ³é¢æ°ãäžæžãããããšãæç€ºïŒ class BaseEntity { public: virtual ~BaseEntity() = default; virtual void update() {} }; class Monster : public BaseEntity { public: // override ãä»ããããšã§ã颿°åã®ã¿ã€ãæã«ã³ã³ãã€ã«ãšã©ãŒãåºããŠãããïŒ void update() override { std::cout << "Monster update\n"; } }; ```
ä»é²6. å¿
é STLã³ã³ããã»æååïŒstring_viewïŒã»ã¹ããŒããã€ã³ã¿
vector ãC++98/11ã, string ãC++98ã, string_view ãC++17ã, unordered_map ãC++11ã, unique_ptr ãC++11ã / make_unique ãC++14ããçé
åãšæådeleteã«å®å
šæ±ºå¥ããå¿
é ããŒã«çŸ€ã
ð§ ãã³ã®ã³å
茩
STLã䜿ããããã«ãªã£ãŠãããçé
åã®ãããã¡ãªãŒããŒãããŒã«æ¯ããªããŠæžãããã«ãªããŸããïŒããšæè¿ããèã `std::string_view` ã£ãŠäœã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ããïŒ`std::vector` ãš `std::unordered_map` ã¯ã²ãŒã éçºã®äž»é£ããïŒ
ãã㊠C++17 ã§ç»å Žãããstd::string_viewãã¯ããã¡ã¢ãªã³ããŒãäžåèµ·ãããã«æååãèŠãèŠãããçŸä»£C++ã®è¶
é«éãã©ãŒæ©èœãããïŒ
### 1. std::vectorïŒåçé
åïŒ ãC++98ãã & emplace_back ãC++11ãã ```cpp #include <vector> std::vector<int> v = { 1, 2, 3 }; // åæååãªã¹ã ãC++11ãã v.push_back(10); // æ«å°Ÿã«è¿œå ïŒã³ããŒãŸãã¯ã ãŒãïŒ v.emplace_back(20); // ð C++11: ãã®å Žã§çŽæ¥ã³ã³ã¹ãã©ã¯ãïŒé«éïŒïŒ std::cout << v[0]; // æ·»åã¢ã¯ã»ã¹ïŒé«éã»ç¯å²å€ãã§ãã¯ãªãïŒ std::cout << v.at(0); // ç¯å²å€ãªãäŸå€ãæããå®å
šã¢ã¯ã»ã¹ std::cout << v.size(); // èŠçŽ æ° v.clear(); // å
šèŠçŽ æ¶å» ``` --- ### 2. std::string ãC++98ãã vs std::string_view ãC++17ãã ```cpp #include <string> #include <string_view> #include <iostream> // â ã¬ã¬ã·ãŒ: const std::string& 㯠"Hello" ãªã©ã®æååãªãã©ã«ãæž¡ããšäžæãªããžã§ã¯ãçæïŒåçã¡ã¢ãªç¢ºä¿ïŒãçºçããããšããã void printLegacy(const std::string& s) { std::cout << s << "\n"; } // ð çŸä»£æšæº: std::string_view ãC++17ãã // ãã€ã³ã¿ãšé·ãïŒ16ãã€ãçšåºŠïŒã ããä¿æããã³ããŒãã¡ã¢ãªç¢ºä¿ãã絶察ãŒããïŒ void printModern(std::string_view sv) { std::cout << sv << "\n"; } int main() { std::string str = "ãã¬ã€ã€ãŒ"; printModern(str); // std::string ããã®ãŸãŸæž¡ããïŒã³ããŒãªãïŒ printModern("ã²ãŒã ã¹ã¿ãŒã"); // æååãªãã©ã«ããã®ãŸãŸæž¡ããïŒã¢ãã±ãŒã·ã§ã³ãªãïŒ printModern(std::string_view(str.data(), 3)); // éšååãåºããO(1)ã§è¶
é«éïŒ } ``` --- ### 3. std::unordered_map ãC++11ãã vs std::map ãC++98ãã | ã³ã³ãã | å
éšæ§é | æ€çŽ¢èšç®é | ç¹åŸŽ | | :--- | :--- | :--- | :--- | | **`std::unordered_map`** ãC++11ãã | ããã·ã¥ããŒãã« | **å¹³å O(1)** | é åºäžå®ã**ã²ãŒã éçºã®èŸæžã»IDæ€çŽ¢ã®ç¬¬äžåè£** | | **`std::map`** ãC++98ãã | èµ€é»æšïŒå¹³è¡¡äºåæšïŒ | **O(log N)** | ããŒãåžžã«æé ãœãŒãããããã©ã³ãã³ã°è¡šç€ºçåã | ```cpp #include <unordered_map> #include <string> std::unordered_map<std::string, int> itemPrices; itemPrices["Potion"] = 50; itemPrices["Ether"] = 120; // find ã§ååšç¢ºèªïŒååšããªãããŒã« [] ã䜿ããšåæã«èŠçŽ ãçæãããŠããŸãããïŒïŒ if (auto it = itemPrices.find("Potion"); it != itemPrices.end()) { std::cout << "ããŒã·ã§ã³ã®äŸ¡æ Œ: " << it->second << "G\n"; } ``` --- ### 4. std::unique_ptr ãC++11ãã & std::make_unique ãC++14ãã çŸä»£C++ã§ã¯ãçã® `new` / `delete` ãæ¥åã³ãŒãã«æžãããšã¯å®å
šã«çŠæ¢ãããŠããŸãã ```cpp #include <memory> class Weapon { /* ... */ }; // â éå»ã®æžãæ¹: ç newïŒdelete å¿ããäŸå€ã§ã¡ã¢ãªãªãŒã¯ã®åå ïŒ // Weapon* w = new Weapon(); // â çŸä»£æšæº: std::make_unique ãC++14ãã auto weapon = std::make_unique<Weapon>(); // ð¡ ã¹ã³ãŒããæããç¬éããã¹ãã©ã¯ã¿ãš delete ã 100% èªåå®è¡ãããïŒ // æææš©ã®ç§»åïŒã ãŒãã»ãã³ãã£ã¯ã¹ ãC++11ããïŒ // unique_ptr ã¯ã³ããŒäžå¯ïŒ= deleteïŒãstd::move ã§ã®ã¿æææš©ãè²æž¡ã§ãã std::unique_ptr<Weapon> playerWeapon = std::move(weapon); // ãã®æç¹ã§ weapon 㯠nullptr ã«ãªã ``` > **ð¡ shared_ptr / weak_ptr ãC++11ãã ã®äœ¿ãã©ãã**: > è€æ°ã®ãªããžã§ã¯ãã§å
±åææãããå Žåã®ã¿ `std::shared_ptr` / `std::make_shared` ã䜿ããŸãã埪ç°åç
§ã«ããã¡ã¢ãªãªãŒã¯ãé²ãç£èŠåœ¹ã«ã¯ `std::weak_ptr` ãçµã¿åãããŸãã
ä»é²7. C++åå®å
šãã£ã¹ã4å
åŒïŒstatic, dynamic, const, reinterpretïŒ ãC++98ãã
Cèšèªæµã®å±éºãª (Type)val ãã£ã¹ããå
šå»ãããã³ã³ãã€ã©ã«æå³ãäŒããé倧ãªãã°ãæªç¶ã«é²ã4ã€ã®ãã£ã¹ãæŒç®åã
ð§ ãã³ã®ã³å
茩
Cèšèªã ãš `(int)3.14` ã¿ããã«ã«ãã³ã§å²ãã ãã§ãã£ã¹ãã§ããŸããããããªãC++ã§ã¯ãããã `static_cast<int>(3.14)` ãšé·ãæžããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
Cèšèªã®äžžã«ãã³ãã£ã¹ãã¯ãäœã§ãç¡çããå倿ããäžèœã®ããããããïŒå±éºãªãã€ã³ã¿å€æãæ°å€å€æãåãæ§æã ãããé倧ãªãã°ãèŠéããŠããŸãã
C++ã®4倧ãã£ã¹ãã¯ãäœã®ããã«ãã£ã¹ãããŠããã®ããšããæå³ãæç¢ºã«ããå±éºãªå€æãã³ã³ãã€ã©ã«æåŠãããé²å£ããªããããïŒ
### C++ 4倧ãã£ã¹ãã®äœ¿ãåãäžèЧ ãC++98ã å
šèŠæ Œå
±éã«ãŒã«ã | ãã£ã¹ãå | çšé | å®å
šæ§ | 宿Šã³ãŒãäŸ | | :--- | :--- | :---: | :--- | | **`static_cast`** | åºæ¬çãªåã®å€æïŒfloat â intãå®å
šãªã¢ãããã£ã¹ãçïŒ | **é«** | `int x = static_cast<int>(3.14f);` | | **`dynamic_cast`** | ç¶æ¿é¢ä¿ã«ãããããŠã³ãã£ã¹ãïŒä»®æ³é¢æ°ãæã€ã¯ã©ã¹éå®ïŒ | **æé«** | `Boss* b = dynamic_cast<Boss*>(enemyPtr);`<br/>*(倱ææã¯ nullptr ãè¿ã)* | | **`const_cast`** | `const` 修食ãäžæçã«å€ãïŒã¬ã¬ã·ãŒCèšèªAPIãšã®é£æºæã®ã¿ïŒ | **泚æ** | `char* p = const_cast<char*>(constStr);` | | **`reinterpret_cast`**| ã¡ã¢ãªã®çãã€ãåãå¥ã®åãšããŠç¡çããè§£éïŒãã€ããªéä¿¡çïŒ | **å±éº** | `uintptr_t addr = reinterpret_cast<uintptr_t>(ptr);` | > **â ïž çŸå Žã®éçè§£æã«ãŒã«**: > Google C++ Style Guide ã Clang-TidyïŒ`google-readability-casting`ïŒã§ã¯ãCèšèªã¹ã¿ã€ã«ã®äžžã«ãã³ãã£ã¹ã `(Type)val` ã¯**ãšã©ãŒå¯Ÿè±¡**ãšããŠæ€ç¥ãããŸããC++ã³ãŒãã§ã¯å¿
ãäžèš4ã€ã®æç€ºãã£ã¹ãã䜿ããŸãããïŒ
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. C++11以éã«ãããŠãNULLãã¯ããæŽæ°0ã®ä»£ããã«ãã€ã³ã¿ã®ç¡å¹å€ïŒãã«ãã€ã³ã¿ïŒãšããŠäœ¿ãã¹ãåå®å
šãªããŒã¯ãŒãã¯ã©ãã§ããïŒ
1. nil 2. nullptr 3. None 4. void_ptr
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒnullptr
NULLã0ã¯æŽæ°åã§ããããã颿°ã®ãªãŒããŒããŒã解決ïŒfunc(int) ãš func(char*)ïŒã§æå³ããæŽæ°çãåŒã°ãããã°ãåŒãèµ·ãããŸããC++11ã® nullptr ã¯å°çšã® std::nullptr_t åã§ãããå®å
šã«ãã€ã³ã¿åã«ã®ã¿æé»å€æãããŸãã
Q2. 倿
æ§ïŒä»®æ³é¢æ°ïŒãæã€åºåºã¯ã©ã¹ã®ãã€ã³ã¿ããæŽŸçã¯ã©ã¹ã®ãã€ã³ã¿ãžãå®è¡æã«å®å
šã«å倿ïŒããŠã³ãã£ã¹ãïŒã詊ã¿ãéã«äœ¿çšããC++ãã£ã¹ãæŒç®åã¯ã©ãã§ããïŒ
1. static_cast 2. dynamic_cast 3. reinterpret_cast 4. const_cast
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒdynamic_cast
dynamic_cast ã¯ä»®æ³é¢æ°ããŒãã«ïŒvtableïŒã®RTTIïŒå®è¡æåæ
å ±ïŒãåç
§ããå®å
šã«æŽŸçã¯ã©ã¹ã«ãã£ã¹ãã§ãããæ€æ»ããŸãã倿äžå¯èœãªå Žåã¯å®å
šã« nullptrïŒåç
§ã®å Žå㯠std::bad_cast äŸå€ïŒãè¿ããŸãã
Q3. C++14以éã§åäžææã®ã¹ããŒããã€ã³ã¿ std::unique_ptr ãçæããéãæãæšå¥šãããã¢ãã³ãªãã¹ããã©ã¯ãã£ã¹ã¯ã©ãã§ããïŒ
1. std::unique_ptr<T> p(new T()); ã®ããã«ç new ãæž¡ã 2. auto p = std::make_unique<T>(...); ã䜿çšãã 3. malloc() ã§ã¡ã¢ãªã確ä¿ããŠãããã£ã¹ããã 4. new[] ã§é
åã確ä¿ããŠä»£å
¥ãã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒauto p = std::make_unique<T>(...); ã䜿çšãã
std::make_unique ã¯çã® new èšè¿°ãå®å
šã«æ²æ»
ããäŸå€å®å
šæ§ãé«ãããšãšãã«ã³ãŒããç°¡æœã«ããŸããC++14以éã®çµ¶å¯Ÿçãªæšæºã€ãã£ãªã ã§ãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â