C ++ã«ã¯ãæœåšçã«å±éºãšèããããæ©èœãããªããããŸã-èšèšã®èšç®ãã¹ãäžæ£ç¢ºãªã³ãŒãã£ã³ã°ã«ãããç°¡åã«ãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã ãã®èšäºã§ã¯ããã®ãããªæ©èœã®éžæãæäŸãããããã®æªåœ±é¿ãæžããæ¹æ³ã«é¢ãããã³ããæäŸããŸãã
ç®æ¬¡
ãã¬ã¢ããã¥ã¹ããã¬ãšã ããã¥ã¹ã
äºåèŠåãšã¯æŠè£
ãæå³ããŸãã ïŒlatãïŒ
ã¯ããã«
C ++ã«ã¯ãæœåšçã«å±éºãšèããããæ©èœãããªããããŸã-èšèšã®èšç®ãã¹ãäžæ£ç¢ºãªã³ãŒãã£ã³ã°ã«ãããç°¡åã«ãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã ãããã®ããã€ãã¯ãå°é£ãªåäŸæä»£ã«èµ·å ãããã®ãå€ãC ++ 98æšæºã«èµ·å ãããã®ããããŸãããä»ã®ãã®ã¯ãææ°ã®C ++ã®æ©èœã«æ¢ã«é¢é£ä»ããããŠããŸãã äž»ãªãã®ãæ€èšãããããã®ãã€ãã¹ã®åœ±é¿ãæžããæ¹æ³ã«ã€ããŠã¢ããã€ã¹ãäžããŠãã ããã
1.ã¿ã€ã
1.1ã æ¡ä»¶ä»ãåœä»€ãšæŒç®å
Cãšã®äºææ§ã®å¿
èŠæ§ã¯ã if(...)
ãªã©ã®ã¹ããŒãã¡ã³ãã§ã bool
ãããªåŒã ãã§ãªããä»»æã®æ°å€åŒãŸãã¯ãã€ã³ã¿ãŒã眮ãæããããšãã§ãããšããäºå®ã«ã€ãªãããŸãã ãã®åé¡ã¯ãç®è¡åŒã®bool
ããint
ãžã®æé»çãªå€æãšäžéšã®æŒç®åã®åªå
床ã«ãã£ãŠæªåããŸãã ããã«ãããããšãã°æ¬¡ã®ãšã©ãŒãçºçããŸãã
if(a=b)
when if(a==b)
ã
if(a<x<b)
when if(a<x && x<b)
ã
if(a&x==0)
æ£ããif((a&x)==0)
ã
if(Foo)
when when if(Foo())
ã
if(arr)
æ£ããif(arr[0])
å Žåã
if(strcmp(s,r))
when when if(strcmp(s,r)==0)
ã
ãããã®ãšã©ãŒã®äžéšã¯ã³ã³ãã€ã©ã®èŠåãåŒãèµ·ãããŸããããšã©ãŒã¯åŒãèµ·ãããŸããã ã³ãŒãã¢ãã©ã€ã¶ãŒã圹ç«ã€å ŽåããããŸãã CïŒã§ã¯ããã®ãããªãšã©ãŒã¯ã»ãšãã©äžå¯èœã§ãbool
if(...)
ãªã©ã¯bool
åãå¿
èŠãšãããããç®è¡åŒã«bool
åãšæ°å€åãæ··åšãããããšã¯ã§ããŸããã
æŠãæ¹æ³ïŒ
- èŠåãªãã®ããã°ã©ã ã æ®å¿µãªãããããã¯åžžã«åœ¹ç«ã€ãšã¯éããŸãã;äžèšã®ãšã©ãŒã®ããã€ãã¯èŠåãäžããŸããã
- éçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããŸãã
- æãªããã®ææ³ïŒå®æ°ãšæ¯èŒãããšãã¯ãããšãã°
if(MAX_PATH==x)
å·Šã«çœ®ããŸãã ããã¯ããªãã®ã³ã³ãããã¢ã ã«èŠãïŒç¬èªã®åå-ããšãŒã衚èšãããããŸãïŒãèæ
®ãããå°æ°ã®ã±ãŒã¹ã§åœ¹ç«ã¡ãŸãã const
修食åã¯ã§ããã ãåºã䜿çšããŠãã ããã ç¹°ãè¿ããŸãããåžžã«åœ¹ç«ã€ãšã¯éããŸãããif(x!=0)
代ããã«if(x)
if(x!=0)
ã®æ£ããè«çåŒãæžãããšã«æ
£ããŠãã ããã ïŒããã§ã¯ãªãã¬ãŒã¿ãŒã®åªå
é äœã®èœãšã穎ã«é¥ãããšããããŸããã3çªç®ã®äŸãåç
§ããŠãã ãããïŒ- 现å¿ã®æ³šæãæã£ãŠãã ããã
1.2ã æé»çãªå€æ
C ++ã¯å³å¯ã«åæå®ãããèšèªãæããŸãããã³ãŒããçãããããã«æé»çãªå倿ãåºã䜿çšãããŠããŸãã ãããã®æé»çãªå€æã¯ãå Žåã«ãã£ãŠã¯ãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã
æãåä»ãªæé»ã®å€æã¯ãæ°å€åãŸãã¯ãã€ã³ã¿ãŒã®bool
ãžã®å€æãšbool
ããint
ãžã®å€æã§ãã ã»ã¯ã·ã§ã³1.1ã§èª¬æãããŠããåé¡ãåŒãèµ·ããã®ã¯ããããã®å€æïŒCãšã®äºææ§ã®ããã«å¿
èŠïŒã§ãã æé»çãªå€æãåžžã«é©åã§ãããšã¯éãããããšãã°double
ããint
ãžã®æ°å€ããŒã¿ã®ç²ŸåºŠã®äœäžïŒå€æã®çž®å°ïŒãåŒãèµ·ããå¯èœæ§ããããŸãã å€ãã®å Žåãã³ã³ãã€ã©ã¯èŠåãçæããŸãïŒç¹ã«æ°å€ããŒã¿ã®ç²ŸåºŠãäœäžããå¯èœæ§ãããå ŽåïŒããèŠåã¯ãšã©ãŒã§ã¯ãããŸããã CïŒã§ã¯ãæ°å€åãšbool
éã®å€æã¯ïŒæç€ºçã§ãã£ãŠãïŒçŠæ¢ãããŠãããæ°å€ããŒã¿ã®ç²ŸåºŠã倱ãããå¯èœæ§ã®ãã倿ã¯ã»ãšãã©åžžã«ãšã©ãŒã§ãã
ããã°ã©ãã¯ãä»ã®æé»çãªå€æã远å ã§ããŸããïŒ1ïŒ explicit
ããŒã¯ãŒããªãã§1ã€ã®ãã©ã¡ãŒã¿ãŒã§ã³ã³ã¹ãã©ã¯ã¿ãŒãå®çŸ©ããããšã«ããã ïŒ2ïŒå倿æŒç®åã®å®çŸ©ã ãããã®å€æã¯ã匷åãªã¿ã€ãã³ã°ã®ååã«åºã¥ããŠã远å ã®ã»ãã¥ãªãã£ã®ã£ãããçªç ŽããŠããŸãã
CïŒã§ã¯ãçµã¿èŸŒã¿ã®æé»çãªå€æã®æ°ã¯ã¯ããã«å°ãªãã implicit
ããŒã¯ãŒãã䜿çšããŠã«ã¹ã¿ã ã®æé»çãªå€æã宣èšããå¿
èŠããããŸãã
æŠãæ¹æ³ïŒ
- èŠåãªãã®ããã°ã©ã ã
- äžèšã®èšèšã«ã¯éåžžã«æ³šæããŠãã ãããç·æ¥æä»¥å€ã¯äœ¿çšããªãã§ãã ããã
2.åå解決
2.1ã ãã¹ããããã¹ã³ãŒãå
ã®å€æ°ã®é衚瀺
C ++ã§ã¯ã次ã®èŠåãé©çšãããŸãã ãããŠ
C ++ã«ãŒã«ã«åŸã£ãŠã
宣èšããã倿°
ã¯ã
宣èšããã倿°
é ããŸã
x
ã®æåã®å®£èšã¯ãããã¯å
ã«ããå¿
èŠã¯ãããŸãããã¯ã©ã¹ãŸãã¯ã°ããŒãã«å€æ°ã®ã¡ã³ããŒã«ããããšãã§ãããããã¯
ã§è¡šç€ºãããå¿
èŠããããŸã
次ã®ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããå¿
èŠãããç¶æ³ãæ³åããŠãã ãã
誀ã£ãŠã倿Žãè¡ãããŸãã
ãããŠä»ããäœãã
ãã
ã§è¡ãããŠããããšããã³ãŒãã¯ã
ããã®
äœããããã§ãããïŒ ãã¹ãŠã以åã®ããã«æ©èœããªãããšã¯æããã§ãããå€ãã®å Žåéåžžã«é£ãããã®ãèŠã€ããããšã§ãã CïŒã§ã¯ãããŒã«ã«å€æ°ãé ãããšã¯çŠæ¢ãããŠããŸãïŒã¯ã©ã¹ã¡ã³ããŒã¯ã§ããŸããïŒã ããããã®åœ¢åŒã§å€æ°ãé衚瀺ã«ããã¡ã«ããºã ã¯ãã»ãšãã©ãã¹ãŠã®ããã°ã©ãã³ã°èšèªã§äœ¿çšãããŠããããšã«æ³šæããŠãã ããã
æŠãæ¹æ³ïŒ
- å¯èœãªéãçãã¹ã³ãŒãã§å€æ°ã宣èšããŸãã
- é·ããŠæ·±ããã¹ãããããããã¯ãæžã蟌ãŸãªãã§ãã ããã
- ã³ãŒãã£ã³ã°èŠåã䜿çšããŠãç°ãªãã¹ã³ãŒãã®èå¥åãèŠèŠçã«åºå¥ããŸãã
- 现å¿ã®æ³šæãæã£ãŠãã ããã
2.2ã 颿°ã®ãªãŒããŒããŒã
颿°ã®ãªãŒããŒããŒãã¯å€ãã®ããã°ã©ãã³ã°èšèªã«äžå¯æ¬ ãªæ©èœã§ãããC ++ãäŸå€ã§ã¯ãããŸããã ãã ãããã®æ©äŒã¯æ
éã«äœ¿çšããå¿
èŠããããŸããããããªããšãåé¡ãçºçããå¯èœæ§ããããŸãã ããšãã°ãèšèšè
ãéè² è·ã«ãªã£ãŠããå Žåãããã°ã©ãã«ã¯éžæè¢ããªãå ŽåããããŸãããéè² è·ã®æåŠãæ£åœåã§ããå ŽåããããŸãã ãªãŒããŒããŒãããã颿°ã䜿çšãããšãã«çºçããåé¡ãèæ
®ããŠãã ããã
ãªãŒããŒããŒãã解決ãããšãã«çºçããå¯èœæ§ã®ãããã¹ãŠã®ãªãã·ã§ã³ãæ€èšããããšãããšããªãŒããŒããŒãã解決ããããã®ã«ãŒã«ãéåžžã«è€éã«ãªããããäºæž¬ãå°é£ã«ãªããŸãã ãã³ãã¬ãŒã颿°ãšçµã¿èŸŒã¿æŒç®åã®ãªãŒããŒããŒãã«ããã远å ã®è€éããå°å
¥ãããŸãã C ++ 11ã¯ãå³èŸºå€ãªã³ã¯ãšåæåãªã¹ãã«åé¡ã远å ããŸããã
ãã¹ããããã¹ã³ãŒãå
ã®ãªãŒããŒããŒãã解決ããããã®åè£ã®æ€çŽ¢ã¢ã«ãŽãªãºã ã«ãã£ãŠåé¡ãçºçããå¯èœæ§ããããŸãã ã³ã³ãã€ã©ãŒãçŸåšã®ã¹ã³ãŒãã§åè£ãèŠã€ããå Žåããããªãæ€çŽ¢ã¯çµäºããŸãã èŠã€ãã£ãåè£ãé©åã§ã¯ãªããç«¶åãããåé€ãããããŸãã¯ã¢ã¯ã»ã¹ã§ããªãå Žåããšã©ãŒãçæãããŸããããã以äžã®æ€çŽ¢ã¯è©Šè¡ãããŸããã ãããŠãçŸåšã®ã¹ã³ãŒãã«åè£ããªãå Žåã®ã¿ãæ€çŽ¢ã¯æ¬¡ã®ããåºãã¹ã³ãŒãã«ç§»åããŸãã ååé èœã¡ã«ããºã ã¯æ©èœããŸããããã¯ã»ã¯ã·ã§ã³2.1ã§èª¬æãããã®ãšã»ãŒåãã§ãã[Dewhurst]ãåç
§ããŠãã ããã
颿°ããªãŒããŒããŒããããšãã³ãŒãã®å¯èªæ§ãäœäžããå¯èœæ§ããããŸããã€ãŸãããšã©ãŒãçºçããŸãã
æ¢å®ã®ãã©ã¡ãŒã¿ãŒãæã€é¢æ°ã䜿çšãããšããªãŒããŒããŒãããã颿°ã䜿çšããããã«èŠããŸããããã¡ããæœåšçãªåé¡ã¯å°ãªããªããŸãã ããããå¯èªæ§ãäœãããšã©ãŒã®å¯èœæ§ããããšããåé¡ã¯æ®ã£ãŠããŸãã
现å¿ã®æ³šæãæã£ãŠãä»®æ³é¢æ°ã®ãªãŒããŒããŒãããã³ããã©ã«ããã©ã¡ãŒã¿ã䜿çšããå¿
èŠããããŸããã»ã¯ã·ã§ã³5.2ãåç
§ããŠãã ããã
CïŒã¯é¢æ°ã®ãªãŒããŒããŒãããµããŒãããŠããŸããããªãŒããŒããŒãã解決ããããã®ã«ãŒã«ã¯å°ãç°ãªããŸãã
æŠãæ¹æ³ïŒ
- 颿°ã®ãªãŒããŒããŒããããã³æ¢å®ã®ãã©ã¡ãŒã¿ãŒã䜿çšãã颿°ã®èšèšãä¹±çšããªãã§ãã ããã
- 颿°ããªãŒããŒããŒããããŠããå Žåã¯ããªãŒããŒããŒãã解決ãããšãã«çãã®ãªã眲åã䜿çšããŠãã ããã
- ãã¹ããããã¹ã³ãŒãã§åãååã®é¢æ°ã宣èšããªãã§ãã ããã
- C ++ 11ã«ç»å Žãããªã¢ãŒã颿°ïŒ
=delete
ïŒã®ã¡ã«ããºã ã䜿çšããŠãç¹å®ã®ãªãŒããŒããŒããªãã·ã§ã³ãçŠæ¢ã§ããããšãå¿ããªãã§ãã ããã
3.ã³ã³ã¹ãã©ã¯ã¿ããã¹ãã©ã¯ã¿ãåæåãåé€
3.1ã ã³ã³ãã€ã©ãŒã«ãã£ãŠçæãããã¯ã©ã¹ã¡ã³ããŒé¢æ°
ããã°ã©ããŒã次ã®ãªã¹ãïŒããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒãã³ããŒä»£å
¥æŒç®åããã¹ãã©ã¯ã¿ïŒããã¯ã©ã¹ã®ã¡ã³ããŒé¢æ°ãå®çŸ©ããŠããªãå Žåã¯ãã³ã³ãã€ã©ãŒããããè¡ãããšãã§ããŸãã C ++ 11ã§ã¯ããã®ãªã¹ãã«ç§»åã³ã³ã¹ãã©ã¯ã¿ãŒãšç§»åå²ãåœãŠæŒç®åã远å ãããŸããã ãããã®ã¡ã³ããŒé¢æ°ã¯ãç¹å¥ãªã¡ã³ããŒé¢æ°ãšåŒã°ããŸãã ãããã¯äœ¿çšãããå Žåã«ã®ã¿çæãããåæ©èœã«åºæã®è¿œå ã®æ¡ä»¶ãæºããããŸãã ãã®äœ¿çšãå®å
šã«é ãããŠããå¯èœæ§ãããããšã«æ³šæããŠãã ããïŒããšãã°ãç¶æ¿ãå®è£
ããå ŽåïŒã å¿
èŠãªæ©èœãçæã§ããªãå Žåããšã©ãŒãçæãããŸãã ïŒåé
眮æäœãé€ãããããã¯ã³ããŒæäœã«çœ®ãæããããŸããïŒã³ã³ãã€ã©ãŒã«ãã£ãŠçæãããã¡ã³ããŒé¢æ°ã¯ããããªãã¯ã§åã蟌ã¿å¯èœã§ãã ç¹å¥ãªã¡ã³ããŒé¢æ°ã®è©³çްã¯[Meyers2]ã«ãããŸãã
å Žåã«ãã£ãŠã¯ãã³ã³ãã€ã©ããã®ãã®ãããªãã«ãã¯ããã¢ãµãŒãã¹ãã«ãªããŸãã ã«ã¹ã¿ã ã®ç¹å¥ãªã¡ã³ããŒé¢æ°ãååšããªããšãäºçްãªåãäœæãããå¯èœæ§ããããããã«ãããåæåãããŠããªã倿°ã®åé¡ãçºçããŸããã»ã¯ã·ã§ã³3.2ãåç
§ããŠãã ããã çæãããã¡ã³ããŒé¢æ°ã¯ãããªãã¯ã§ãããããã¯åžžã«ã¯ã©ã¹ã®èšèšãšäžè²«ããŠãããšã¯éããŸããã åºæ¬ã¯ã©ã¹ã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãä¿è·ããå¿
èŠããããŸã;ãªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ããã现ããå¶åŸ¡ããã«ã¯ãä¿è·ããããã¹ãã©ã¯ã¿ãå¿
èŠã«ãªãå ŽåããããŸãã ã¯ã©ã¹ã«ã¡ã³ããŒãšããŠçã®ãªãœãŒã¹èšè¿°åãããããã®ãªãœãŒã¹ãææããŠããå Žåãããã°ã©ãã¯ã³ããŒã³ã³ã¹ãã©ã¯ã¿ãã³ããŒå²ãåœãŠæŒç®åãããã³ãã¹ãã©ã¯ã¿ãå®è£
ããå¿
èŠããããŸãã ãããããããã°3ã®ã«ãŒã«ãã¯ããç¥ãããŠãããããã°ã©ããŒã3ã€ã®æäœïŒã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒãã³ããŒå²ãåœãŠæŒç®åããŸãã¯ãã¹ãã©ã¯ã¿ãŒïŒã®å°ãªããšã1ã€ãå®çŸ©ããå Žåã3ã€ãã¹ãŠã®æäœãå®çŸ©ããå¿
èŠããããŸãã ã³ã³ãã€ã©ãŒãçæããç§»åã³ã³ã¹ãã©ã¯ã¿ãŒãšç§»åå²ãåœãŠæŒç®åããåžžã«å¿
èŠãªãã®ãšã¯ã»ã©é ããã®ã§ãã ã³ã³ãã€ã©ã«ãã£ãŠçæããããã¹ãã©ã¯ã¿ã¯ãå Žåã«ãã£ãŠã¯éåžžã«åŸ®åŠãªåé¡ãåŒãèµ·ããããªãœãŒã¹ãªãŒã¯ãåŒãèµ·ããå¯èœæ§ããããŸããã»ã¯ã·ã§ã³3.7ãåç
§ããŠãã ããã
ããã°ã©ããŒã¯ãç¹å¥ãªã¡ã³ããŒé¢æ°ã®çæãçŠæ¢ã§ããŸããC++ 11ã§ã¯ãC ++ 98ã§ã察å¿ããã¡ã³ããŒé¢æ°ãprivateãšããŠå®£èšããå®çŸ©ããªãå Žåã "=delete"
æ§æã䜿çšããå¿
èŠããããŸãã
ããã°ã©ããŒãã³ã³ãã€ã©ãŒã«ãã£ãŠçæãããã¡ã³ããŒé¢æ°ã«æ
£ããŠããå ŽåãC ++ 11ã§ã¯ã宣èšãããããããã ãã§ãªãããããæç€ºçã«ç€ºãããšãã§ããŸãã ãããè¡ãã«ã¯ãå®£èšæã«"=default"
æ§æã䜿çšããå¿
èŠããããŸãããã³ãŒãã¯èªã¿ããããã¢ã¯ã»ã¹ã¬ãã«ã®å¶åŸ¡ã«é¢é£ããè¿œå æ©èœã衚瀺ãããŸãã
CïŒã§ã¯ãã³ã³ãã€ã©ãŒã¯ããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãçæã§ããŸããéåžžãããã¯åé¡ãåŒãèµ·ãããŸããã
æŠãæ¹æ³ïŒ
- ç¹å¥ãªã¡ã³ããŒé¢æ°ã®ã³ã³ãã€ã©ãŒçæãå¶åŸ¡ããŸãã å¿
èŠã«å¿ããŠãèªåã§å®è£
ããããçŠæ¢ããŸãã
3.2ã åæåãããŠããªã倿°
ã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ã¯ãC ++ãªããžã§ã¯ãã¢ãã«ã®éèŠãªèŠçŽ ãšåŒã¶ããšãã§ããŸãã ãªããžã§ã¯ããäœæãããšã³ã³ã¹ãã©ã¯ã¿ãåŒã³åºãããåé€ãããšãã¹ãã©ã¯ã¿ãåŒã³åºãããŸãã ããããCãšã®äºææ§ã®åé¡ã«ãããããã€ãã®äŸå€ã匷å¶ããããã®äŸå€ã¯åçŽåãšåŒã°ããŸãã ãããã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãšãã¹ãã©ã¯ã¿ãŒã®å¿
é åŒã³åºããªãã§ã倿°ã®sichnyã¿ã€ããšsyshnyã©ã€ããµã€ã¯ã«ãã·ãã¥ã¬ãŒãããããã«å°å
¥ãããŸããã C ++ã§ã³ã³ãã€ã«ããã³å®è¡ãããå ŽåãCã³ãŒãã¯CãšãŸã£ããåãããã«åäœããŸããéåžžã®åã«ã¯ãæ°å€åããã€ã³ã¿ãŒãåæãããã³åçŽãªåã§æ§æãããã¯ã©ã¹ãæ§é äœãå
±çšäœãé
åãå«ãŸããŸãã ã¯ã©ã¹ãšæ§é ã¯ãã«ã¹ã¿ã ã³ã³ã¹ãã©ã¯ã¿ããã¹ãã©ã¯ã¿ãã³ããŒãä»®æ³é¢æ°ãååšããªããšããè¿œå æ¡ä»¶ãæºãããŠããå¿
èŠããããŸãã åãã«è¶³ããªãã¯ã©ã¹ã®å Žåãã³ã³ãã€ã©ã¯ããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ãçæã§ããŸãã ããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãªããžã§ã¯ãããŒãã«ãããã¹ãã©ã¯ã¿ã¯äœãããŸããã ãã ãããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã倿°ã®åæåæã«æç€ºçã«åŒã³åºãããå Žåã«ã®ã¿çæããã³äœ¿çšãããŸãã æç€ºçãªåæåã®ããªã¢ã³ãã䜿çšããªãå Žåãèªæãªã¿ã€ãã®å€æ°ã¯åæåãããŸããã åæåæ§æã¯ã倿°å®£èšã®ã¿ã€ããšã³ã³ããã¹ãã«äŸåããŸãã éç倿°ãšããŒã«ã«å€æ°ã¯ãå®£èšæã«åæåãããŸãã ã¯ã©ã¹ã®å ŽåãçŽæ¥ã®åºæ¬ã¯ã©ã¹ãšééçã¯ã©ã¹ã¡ã³ããŒã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒåæåãªã¹ãã§åæåãããŸãã ïŒC ++ 11ã§ã¯ãå®£èšæã«ééçã¯ã©ã¹ã¡ã³ããŒãåæåã§ããŸããåŸè¿°ïŒãåçãªããžã§ã¯ãã®å ŽåãåŒnew T()
ã¯ããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒã«ãã£ãŠåæåããããªããžã§ã¯ããäœæããŸãããç°¡æåã®new T
ã¯åæåãããŠããªããªããžã§ã¯ããäœæããŸãã äºçްãªã¿ã€ãã®åçé
ånew T[N]
ãäœæããå Žåããã®èŠçŽ ã¯åžžã«åæåãããŸããã std::vector<T>
ã€ã³ã¹ã¿ã³ã¹ãäœæãŸãã¯æ¡åŒµãããèŠçŽ ã®æç€ºçãªåæåã«ãã©ã¡ãŒã¿ãŒãæäŸãããªãå Žåããããã¯æ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããšãä¿èšŒãããŸãã C ++ 11ã§ã¯ãäžæ¬åŒ§ã䜿çšããæ°ããåæåæ§æãå°å
¥ãããŠããŸãã æ¬åŒ§ã®ç©ºã®ãã¢ã¯ãããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããåæåãæå³ããŸãã ãã®ãããªåæåã¯ãåŸæ¥ã®åæåã䜿çšããããã¹ãŠã®å Žæã§å¯èœã§ããããã«ãå®£èšæã«ã¯ã©ã¹ã®ééçã¡ã³ããŒãåæåããããšãå¯èœã«ãªããã³ã³ã¹ãã©ã¯ã¿ãŒåæåãªã¹ãã®åæåã眮ãæããŸãã
åæåãããŠããªã倿°ã¯ã次ã®ããã«æ§æãããŸãã namespace
ã¹ã³ãŒãïŒã°ããŒãã«ïŒã§å®çŸ©ãããŠããå Žåããã¹ãŠã®ãããããŒãã«ãªããŸããããŒã«ã«ãŸãã¯åçã«äœæãããå Žåãã©ã³ãã ãªãããã»ãããåãåããŸãã ãã®ãããªå€æ°ã䜿çšãããšãããã°ã©ã ã®äºæããªãåäœãçºçããå¯èœæ§ãããããšã¯æããã§ãã
確ãã«ãææ°ã®ã³ã³ãã€ã©ãŒã§ã¯ãé²è¡ãæ¢ãŸããªãããšããããŸããå Žåã«ãã£ãŠã¯ãåæåãããŠããªã倿°ãæ€åºããŠãšã©ãŒãã¹ããŒããŸãã ããã«è¯ãã®ã¯ãã³ãŒãã¢ãã©ã€ã¶ãŒã«ãã£ãŠåæåãããŠããªã倿°ãæ€åºãããããšã§ãã
C ++ 11æšæºã©ã€ãã©ãªã«ã¯ãã¿ã€ãããããã£ïŒããããŒãã¡ã€ã«<type_traits>
ïŒãšåŒã°ãããã³ãã¬ãŒãããããŸãã ãã®ãã¡ã®1ã€ã䜿çšãããšãã¿ã€ããç°¡åãã©ããã倿ã§ããŸãã åŒstd::is_trivial<>::value
ã¯ã T
èªæãªåã§ããã°true
T
ããã§ãªããã°false
ã§ãã
ã·ã·ã«æ§é ã¯ãPlain Old DataïŒPODïŒãšãåŒã°ããŸãã PODãšãèªæãªã¿ã€ããã¯ã»ãŒåçã®çšèªã§ãããšæ³å®ã§ããŸãã
CïŒã§ã¯ãåæåãããŠããªã倿°ã¯ãšã©ãŒãåŒãèµ·ãããŸã;ããã¯ã³ã³ãã€ã©ãŒã«ãã£ãŠå¶åŸ¡ãããŸãã æç€ºçãªåæåãå®è¡ãããªãå Žåãåç
§åã®ãªããžã§ã¯ãã®ãã£ãŒã«ãã¯ããã©ã«ãã§åæåãããŸãã éèŠãªã¿ã€ãã®ãªããžã§ã¯ãã®ãã£ãŒã«ãã¯ãããã©ã«ãã§ãã¹ãŠåæåãããããæç€ºçã«ãã¹ãŠåæåããå¿
èŠããããŸãã
æŠãæ¹æ³ïŒ
- 倿°ãæç€ºçã«åæåããç¿æ
£ããããŸãã åæåãããŠããªã倿°ã¯ãç®ãåããå¿
èŠããããŸãã
- å¯èœãªéãçãã¹ã³ãŒãã§å€æ°ã宣èšããŸãã
- éçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããŸãã
- äºçްãªã¿ã€ããèšèšããªãã§ãã ããã åãèªæã§ãªãããšã確èªããã«ã¯ãã«ã¹ã¿ã ã³ã³ã¹ãã©ã¯ã¿ãŒãå®çŸ©ããã ãã§ååã§ãã
3.3ã åºæ¬ã¯ã©ã¹ãšééçã¯ã©ã¹ã¡ã³ããŒã®åæåé åº
ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒãå®è£
ãããšãçŽæ¥ã®åºæ¬ã¯ã©ã¹ãšééçã¯ã©ã¹ã¡ã³ããŒãåæåãããŸãã åæåé åºã¯ãæšæºã«ãã£ãŠæ±ºå®ãããŸããæåã«ãåºæ¬ã¯ã©ã¹ã®ãªã¹ãã§å®£èšãããŠããé åºã§åºæ¬ã¯ã©ã¹ã次ã«å®£èšé åºã§ã¯ã©ã¹ã®ééçã¡ã³ããŒã å¿
èŠã«å¿ããŠãåºæ¬ã¯ã©ã¹ãšééçã¡ã³ããŒã®æç€ºçãªåæåã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã®åæåãªã¹ãã䜿çšããŸãã æ®å¿µãªããããã®ãªã¹ãã®é
ç®ã¯ãåæåãçºçããé åºã§ããå¿
èŠã¯ãããŸããã åæåäžã«ãªã¹ãã¢ã€ãã ãä»ã®ãªã¹ãã¢ã€ãã ãžã®åç
§ã䜿çšããå Žåããããèæ
®ããå¿
èŠããããŸãã ãšã©ãŒã®å Žåãåç
§ã¯ãŸã åæåãããŠããªããªããžã§ã¯ããžã®å¯èœæ§ããããŸãã C ++ 11ã§ã¯ã宣èšãããšãã«äžæ¬åŒ§ã䜿çšããŠééçã¯ã©ã¹ã¡ã³ããŒãåæåã§ããŸãã ãã®å Žåãã³ã³ã¹ãã©ã¯ã¿ãŒã®åæåãªã¹ãã§åæåããå¿
èŠã¯ãªããåé¡ã¯éšåçã«é€å»ãããŸãã
CïŒã§ã¯ããªããžã§ã¯ãã¯æ¬¡ã®ããã«åæåãããŸããæåã«ãããŒã¹ãµããªããžã§ã¯ãããæåŸã®æŽŸçç©ãŸã§ããã£ãŒã«ããåæåãããæ¬¡ã«ã³ã³ã¹ãã©ã¯ã¿ãŒãåãé åºã§åŒã³åºãããŸãã 説æãããŠããåé¡ã¯çºçããŸããã
æŠãæ¹æ³ïŒ
- ã³ã³ã¹ãã©ã¯ã¿ã®åæåãªã¹ãã宣èšé ã«ç¶æããŸãã
- åºæ¬ã¯ã©ã¹ãšã¯ã©ã¹ã¡ã³ããŒã®åæåãç¬ç«ãããŠãã ããã
- 宣èšãããšããééçã¡ã³ããŒã®åæåã䜿çšããŸãã
3.4ã éçã¯ã©ã¹ã¡ã³ããŒãšã°ããŒãã«å€æ°ã®åæåæé
éçã¯ã©ã¹ã¡ã³ããããã³ããŸããŸãªã³ã³ãã€ã«åäœïŒãã¡ã€ã«ïŒã®ã¹ã³ãŒãnamespace
ïŒã°ããŒãã«ïŒã§å®çŸ©ããã倿°ã¯ãå®è£
ã«ãã£ãŠæ±ºå®ãããé åºã§åæåãããŸãã åæåäžã«ãã®ãããªå€æ°ãçžäºã«åç
§ã䜿çšããå Žåããããèæ
®ããå¿
èŠããããŸãã ãªã³ã¯ã¯åæåãããŠããªã倿°ãžã®ãªã³ã¯ã§ããå¯èœæ§ããããŸãã
æŠãæ¹æ³ïŒ
- ãã®ãããªç¶æ³ãé²ãããã«ç¹å¥ãªæªçœ®ãè¬ããŠãã ããã ããšãã°ãããŒã«ã«ã®éç倿°ïŒã·ã³ã°ã«ãã³ïŒã䜿çšãããšããããã¯æåã®äœ¿çšæã«åæåãããŸãã
3.5ã ãã¹ãã©ã¯ã¿ã®äŸå€
ãã¹ãã©ã¯ã¿ã¯äŸå€ãã¹ããŒããªãã§ãã ããã ãã®èŠåã«éåãããšãæªå®çŸ©ã®åäœãã»ãšãã©ã®å Žåç°åžžçµäºãçºçããå¯èœæ§ããããŸãã
æŠãæ¹æ³ïŒ
- ãã¹ãã©ã¯ã¿ã§äŸå€ãã¹ããŒããªãã§ãã ããã
3.6ã åçãªããžã§ã¯ããšé
åã®åé€
äœããã®ã¿ã€ãT
åçãªããžã§ã¯ãT
T* pt = new T();
ãã®åŸã delete
æŒç®åã§åé€ãããŸã
delete pt;
åçé
åãäœæãããå Žå
T* pt = new T[N];
ãã®åŸã delete[]
æŒç®åã§delete[]
ãããŸã
delete[] pt;
ãã®èŠåã«åŸããªãå Žåãæªå®çŸ©ã®åäœãçºçããå¯èœæ§ããããŸããã€ãŸããã¡ã¢ãªãªãŒã¯ãã¯ã©ãã·ã¥ãªã©ãããããããšãèµ·ãããŸãã 詳现ã«ã€ããŠã¯ã[Meyers1]ãåç
§ããŠãã ããã
æŠãæ¹æ³ïŒ
- æ£ãã
delete
ãã©ãŒã ã䜿çšããŠdelete
ã
3.7ã ã¯ã©ã¹å®£èšãäžå®å
šãªå Žåã®åé€
delete
æŒç®åã®éå€ãã¯ãç¹å®ã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸã; void*
åã®ãã€ã³ã¿ãŒãŸãã¯äžå®å
šãªïŒããªãšã³ããã£ãïŒå®£èšãæã€ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒã«é©çšã§ããŸãã ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒã«é©çšãããdelete
æŒç®åã¯2ãã§ãŒãºæäœã§ããããã¹ãã©ã¯ã¿ãæåã«åŒã³åºãããæ¬¡ã«ã¡ã¢ãªãè§£æŸãããŸãã ãšã©ãŒã®å®£èšãäžå®å
šãªã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒã«delete
æŒç®åãé©çšãããšããšã©ãŒã¯çºçãããã³ã³ãã€ã©ãŒã¯åã«ãã¹ãã©ã¯ã¿ãŒã®åŒã³åºããã¹ãããããŸãïŒèŠåã¯çºè¡ãããŸãïŒã äŸãèããŠã¿ãŸãããïŒ
class X;
ãã®ã³ãŒãã¯ãå®å
šãª
X
ã¯ã©ã¹å®£èšã
delete
ãã€ã€ã«ãã¢ã§å©çšã§ããªãå Žåã§ãã³ã³ãã€ã«ãããŸãã Visual Studioã¯æ¬¡ã®èŠåã衚瀺ããŸãã
warning C4150: deletion of pointer to incomplete type 'X'; no destructor called
X
ãšCreateX()
å®è£
ãããå Žåãã³ãŒãã¯CreateX()
ãŸãCreateX()
ãnew
æŒç®åã«ãã£ãŠäœæããããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãè¿ãå Žåã Foo()
åŒã³åºãFoo()
æ£åžžã«å®è¡ããããã¹ãã©ã¯ã¿ã¯åŒã³åºãããŸããã ããããªãœãŒã¹ã®æµåºã«ã€ãªããå¯èœæ§ãããããšã¯æããã§ãããããèŠåã«æ³šæããå¿
èŠãããããšãæ¹ããŠèª¬æããŸãã
ãã®ç¶æ³ã¯ã決ããŠå€§ããã§ã¯ãããŸãããã¹ããŒããã€ã³ã¿ãŒãèšè¿°åã¯ã©ã¹ãªã©ã®ã¯ã©ã¹ã䜿çšããå Žåã«çºçããå¯èœæ§ããããŸãã ãã®ãããªç¶æ³ãçºçãããšãã³ã³ãã€ã©ã«ãã£ãŠçæããããã¹ãã©ã¯ã¿ãåºæ¿ãããå¯èœæ§ããããŸãã , , , , . [Meyers2].
:
4. ,
4.1ã
++ , . . . , 1.1.
:
std::out<<c?x:y;
(std::out<<c)?x:y;
ãããªã
std::out<<(c?x:y);
, , .
. <<
?:
std::out
void*
. ++ , . -, , . ?:
. , ( ).
: x&f==0
x&(f==0)
, (x&f)==0
, , , . - , , , , .
å¥ã®äŸã / . / , /, . , x/4+1
x>>2+1
, x>>(2+1)
, (x>>2)+1
, .
C# , C++, , - .
:
4.2.
++ , . . , , . 4.1. â +
+=
. . , : ,
(), &&
, ||
ã , (-), (short-circuit evaluation semantics), , . & ( ). & , .. .
, - (-) , . .
- , , . . [Dewhurst].
C# , , , .
:
4.3.
++ , . ( : ,
(), &&
, ||
, ?:
.) , , , . :
int x=0; int y=(++x*2)+(++x*3);
y
.
, . 以äžã«äŸã瀺ããŸãã
class X; class Y; void Foo(std::shared_ptr<X>, std::shared_ptr<Y>);
Foo()
:
Foo(std::shared_ptr<X>(new X()), std::shared_ptr<Y>(new Y()));
: X
, Y
, std::shared_ptr<X>
, std::shared_ptr<Y>
. Y
, X
.
:
auto p1 = std::shared_ptr<X>(new X()); auto p2 = std::shared_ptr<Y>(new Y()); Foo(p1, p2);
std::make_shared<Y>
( , ):
Foo(std::make_shared<X>(), std::make_shared<Y>());
. [Meyers2].
:
5.
5.1ã
++98 , ( ), , ( , ). virtual
, , . ( ), , , . , , . , ++11 override
, , , . .
:
5.2ã
. , , . . . [Dewhurst].
:
5.3ã
, , . , , post_construct pre_destroy. , â . . , : ( ) . (, , .) , ( ), ( ). . [Dewhurst]. , , .
â - .
, C# , , , . C# : , , . , ( , ).
:
5.4ã
, , delete
. , - .
:
6.
â C/C++, . . . « ».
C# unsafe mode, .
6.1.
/++ , : strcpy()
, strcat()
, sprinf()
, etc. ( std::vector<>
, etc.) , . (, , , . . Checked Iterators MSDN.) , : , , ; , .
C#, unsafe mode, .
:
- , .
- .
- z-terminated ,
_s
(. ).
6.2. Z-terminated
, . , :
strncpy(dst,src,n);
strlen(src)>=n
, dst
(, ). , , . . â . if(*str)
, if(strlen(str)>0)
, . [Spolsky].
C# string
.
:
6.3.
...
. printf
- , C. , , , , . , .
C# printf
, .
:
7.
7.1ã
++ , , , . 以äžã«äŸã瀺ããŸãã
const int N = 4, M = 6; int x,
:
int
;int
;N
int
;N
int
;- ,
char
int
; - ,
char
int
; - ,
char
int
; N
, char
int
;N
int
;M
N
int
;- ,
char
, long
int
.
, . ( .)
*
&
. ( .)
typedef
( using
-). , :
typedef int(*P)(long); PH(char);
, .
C# , .
:
7.2ã
.
class X { public: X(int val = 0);
X x(5);
x
X
, 5.
X x();
x
, X
, x
X
, . X
, , :
X x; X x = X(); X x{};
, , , . [Sutter].
, , C++ ( ). . ( C++ .)
, , , , .
C# , , .
:
8.
8.1. inline
ODR
, inline
â . , . inline
(One Defenition Rule, ODR). . , . , ODR. static
: , , . static
inline
. , , ODR, . , . - , -. .
:
- «»
inline
. namespace
. , . - â
namespace
.
8.2.
. . , , , , .
:
- , .
- , : () , -.
using
-: using namespace
, using
-.- .
8.3. switch
â break
case
. ( .) C# .
:
8.4.
++ , â , â . ( class
struct
) , . ( , # Java.) â , .
- , . (
std::string
, std::vector
, etc.), , . - , , .
- , (slicing), , .
, , , . . , , . , . . â ( =delete
), â explicit
.
C# , .
:
8.5.
++ . , . - ( ), ++11 , , , .
C++ .
C# , . , . (using-) Basic Dispose.
:
8.6.
«» . , , C++ , STL- - .
. . , . . «», . COM- . (, .) , C++ . â . . . , («» ) , . .
# , . â .
:
8.7.
C++ , : , , . ( !) . , . , . , , . (, .)
C ( ), C++ C ( extern "C"
). C/C++ .
-. #pragma
- , , .
, , , .
, , COM. COM-, , ( , ). COM , , .
C# . , â , C#, C# C/C++.
:
8.8. ãã¯ã
, . , . C++ . 代ããã«
#define XXL 32
const int XXL=32;
. inline
.
# ( ).
:
9.
- . . . , .
- .
- . ++ â ++11/14/17.
- - , - .
- .
[Dewhurst]
, . C++. .: . è±èªãã â .: , 2012.
[Meyers1]
, . C++. 55 .: . è±èªãã â .: , 2014.
[Meyers2]
, . C++: 42 C++11 C++14.: . è±èªãã -MãïŒLLC "I.D. », 2016.
[Sutter]
, . C++.: . è±èªãã â : «.. », 2015.
[Spolsky]
, . .: . è±èªãã â .: -, 2008.