1.ã¯ããã«
ãã®èšäºã§ã¯ãC ++ã«ã€ããŠã®5ã€ã®äººæ°ã®ããç¥è©±ãæ¢ãã解æããããšããŸãã
1 C ++ãç解ããã«ã¯ããŸãCãåŠã¶å¿
èŠããããŸã
2 ã C ++ã¯ãªããžã§ã¯ãæåããã°ã©ãã³ã°èšèªã§ã
ïŒ ã ä¿¡é Œã§ããããã°ã©ã ã«ã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå¿
èŠã§ã
4 ã å¹çãäžããã«ã¯ãäœã¬ãã«ã®ã³ãŒããæžãå¿
èŠããããŸã
5 ã C ++ã¯ã倧èŠæš¡ã§è€éãªããã°ã©ã ã«ã®ã¿é©ããŠããŸãã
ããªããããªãã®ååããããã®ç¥è©±ãä¿¡ããŠãããªãããã®èšäºã¯ããªãã®ããã§ãã ããã€ãã®ç¥è©±ã¯ã誰ãã«ãããæç¹ã§ã®ããã€ãã®ã¿ã¹ã¯ã«åœãŠã¯ãŸããŸãã ãã ããISO C ++ 2011ã³ã³ãã€ã©ã䜿çšããä»æ¥ã®C ++ã¯ããããã®äž»åŒµãç¥è©±ã«ããŸãã
ç§ã¯ããè³ã«ããã®ã§ã圌ãã¯ç§ã«äººæ°ãããããã§ãã æã«ã¯ãããã¯åççã«èšŒæãããŸãããå
¬çãšããŠããé »ç¹ã«äœ¿çšãããŸãã å€ãã®å Žåãåé¡ã®è§£æ±ºçã®1ã€ãšããŠC ++ã眮ãæããããã«äœ¿çšãããŸãã
æ¬ã¯ããããã®ç¥è©±ã«æ§ããããšãã§ããŸãããç§ã¯åçŽãªé³è¿°ãšãããã«å¯Ÿããç§ã®è°è«ã®ç°¡æœãªé³è¿°ã«èªåèªèº«ãå¶éããŸãã
2.ç¥è©±1ïŒC ++ãç解ããã«ã¯ããŸãCãåŠã¶å¿
èŠããããŸã
ãã C ++ã§ã¯ãCããããã°ã©ãã³ã°ã®åºæ¬ãåŠã¶ã®ãç°¡åã§ããCã¯ãC ++ã®ã»ãšãã©ã®ãµãã»ããã§ãããC ++ãæã€åçŽãªã¿ã¹ã¯ãç°¡åã«å®è¡ã§ããåå®å
šæ§ãšäŸ¿å©ãªã©ã€ãã©ãªããªããããC ++ã®äžéšã§ã¯ãããŸããã ã¡ãŒã«ã¢ãã¬ã¹ãäœæããç°¡åãªäŸãèããŠã¿ãŸãããïŒ
string compose(const string& name, const string& domain) { return name+'@'+domain; }
次ã®ããã«äœ¿çšãããŸãã
string addr = compose("gre","research.att.com");
åœç¶ãå®éã®ããã°ã©ã ã§ã¯ããã¹ãŠã®åŒæ°ãæååã§ã¯ãããŸããã
CããŒãžã§ã³ã§ã¯ãã·ã³ãã«ãšã¡ã¢ãªãçŽæ¥æäœããå¿
èŠããããŸãã
char* compose(const char* name, const char* domain) { char* res = malloc(strlen(name)+strlen(domain)+2);
次ã®ããã«äœ¿çšãããŸãã
char* addr = compose("gre","research.att.com");
ã©ã®ãªãã·ã§ã³ãæããã®ãç°¡åã§ããïŒ ã©ã¡ãã䜿ããããã§ããïŒ CããŒãžã§ã³ã§äœãæ··ä¹±ããããšããããŸããïŒ ããïŒ ãªãã§ïŒ
æåŸã«ãcomposeïŒïŒã®ã©ã®ããŒãžã§ã³ãããå¹ççã§ããïŒ C ++-åŒæ°ã®æåãæ°ããå¿
èŠããªããçãæååã«åçã¡ã¢ãªã䜿çšããªãããã
2.1 C ++ã®åŠç¿
ããã¯å¥åŠãªãšããŸããã¯ãªäŸã§ã¯ãããŸããã ç§ã®æèŠã§ã¯ãããã¯å
žåçã§ãã ã§ã¯ããªãå€ãã®æåž«ããFirst Cãã¢ãããŒãã説ãã®ã§ããããïŒ ãªããªãïŒ
-圌ãã¯ãã€ããã£ã
-ã«ãªãã¥ã©ã ã«å¿
èŠãªãã®
-圌ãèªèº«ãããå匷ããããš
-Cã¯C ++ãããå°ãããããããç°¡åã«ãªããŸãã
-åŠçã¯æ°ã«ããªããé
ããæ©ãããCãåŠã°ãªããã°ãªããªã
ããããCã¯C ++ã®æãåçŽãªãŸãã¯æãæçšãªãµãã»ããã§ã¯ãããŸããã ååãªC ++ãç¥ã£ãŠãããšãCãç°¡åã«åŠã¶ããšãã§ããŸããC++ã®åã«Cãå匷ãããšãC ++ã§ç°¡åã«åé¿ã§ããå€ãã®ãšã©ãŒãçºçããããããåé¿ããæ¹æ³ãåŠã¶ããšã«æéãè²»ãããŸãã C ++ãåŠç¿ããããã®æ£ããã¢ãããŒãã«ã€ããŠã¯ãç§ã®èæžãããã°ã©ãã³ã°ïŒC ++ã䜿çšããååãšå®è·µããåç
§ããŠãã ããã æåŸã«ãCã®äœ¿çšæ¹æ³ã«é¢ããç« ããããŸããããã¯ãå€ãã®åŠçã®æå°ã«äœ¿çšãããŠããŸãã ç 究ãç°¡çŽ åããããã«ã第2çã§ã¯C ++ 11ããã³C ++ 14ã䜿çšããŸãã
C ++ 11ã®ãããã§ãC ++ã¯åå¿è
ã«ãšã£ãŠãã䜿ãããããªããŸããã ããšãã°ãèŠçŽ ã®ã·ãŒã±ã³ã¹ã«ãã£ãŠåæåãããæšæºã©ã€ãã©ãªã®ãã¯ãã«ã¯æ¬¡ã®ãšããã§ãã
vector<int> v = {1,2,3,5,8,13};
C ++ 98ã§ã¯ãé
åã§ã®ã¿ãªã¹ããåæåã§ããŸããã C ++ 11ã§ã¯ãä»»æã®åã®ãªã¹ã{}ãåãå
¥ããã³ã³ã¹ãã©ã¯ã¿ãŒãæå®ã§ããŸãã ãã¯ãã«ãµã€ã¯ã«ãå®è¡ã§ããŸãã
for (int x : v) test(x);
testïŒïŒã¯ãvèŠçŽ ããšã«åŒã³åºãããŸãã
forã«ãŒãã¯ä»»æã®ã·ãŒã±ã³ã¹ãééã§ããããã次ã®ããã«èšè¿°ã§ããŸãã
for (int x : {1,2,3,5,8,13}) test(x);
C ++ 11ã§ã¯ãã·ã³ãã«ãªãã®ãã·ã³ãã«ã«ããããšããŸããã åœç¶ãé床ãç ç²ã«ããããšãªãã
3.ç¥è©±2ïŒC ++ã¯ãªããžã§ã¯ãæåããã°ã©ãã³ã°èšèªã§ã
ãã C ++ã¯OOPããã³ãã®ä»ã®ã¹ã¿ã€ã«ããµããŒãããŠããŸãããç¹ã«å¶éãããŠããŸããã OOPãæ±çšããã°ã©ãã³ã°ãªã©ã®ãœãããŠã§ã¢ã¹ã¿ã€ã«ã®åæããµããŒãããŠããŸãã å€ãã®å Žåãæè¯ã®è§£æ±ºçã¯ããã€ãã®ã¹ã¿ã€ã«ã䜿çšããããšã§ãã æè¯ã®æ段ãšã¯ãããçãããããããããããå¹ççã§ãæŽåãããŠãããªã©ã§ãã
ãã®ç¥è©±ã¯ãããããçš®é¡ã®ä»®æ³é¢æ°ãåãã倧èŠæš¡ãªã¯ã©ã¹éå±€ãå¿
èŠãšããªãéããC ++ïŒCãšæ¯èŒããŠïŒãå¿
èŠãšããªããšããçµè«ã«äººã
ãå°ããŸãã ç¥è©±ã確信ããŠããC ++ã¯ãçŽç²ã«ãªããžã§ã¯ãæåã§ã¯ãªããšããäºå®ãéé£ããŠããŸãã ãè¯ãããšãOOPããåäžèŠãããšãOOPã«é¢ä¿ã®ãªãå€ãã®ãã¹ãŠãå«ãC ++ãèªåçã«ãäžè¯ãã«ãªããŸãã ãããã«ããããã®ç¥è©±ã¯C ++ãåŠã°ãªãèšãèš³ã§ãã
äŸïŒ
void rotate_and_draw(vector<Shape*>& vs, int r) { for_each(vs.begin(),vs.end(), [](Shape* p) { p->rotate(r); });
OOPã§ããïŒ ãã¡ãããã¯ã©ã¹éå±€ãšä»®æ³é¢æ°ããããŸãã ããã¯äžè¬çãªããã°ã©ãã³ã°ã§ããïŒ ãã¡ããããã©ã¡ãŒã¿ãŒåãããã³ã³ãããŒïŒãã¯ã¿ãŒïŒãšéåžžã®é¢æ°ããããŸãã
for_eachã é¢æ°åããã°ã©ãã³ã°ã§ããïŒ ãã®ãããªãã®ã ã©ã ãã䜿çšãããŸãïŒæ§ç¯[]ïŒã ãããŠããã®ã¹ã¿ã€ã«ã¯äœã§ããïŒ ããã¯ãC ++ 11ã®ã¢ãã³ãªã¹ã¿ã€ã«ã§ãã
å¯èœæ§ã瀺ãããã«ãæšæºã®forã«ãŒããšfor_eachã©ã€ãã©ãªã¢ã«ãŽãªãºã ã®äž¡æ¹ã䜿çšããŸããã ãã®ã³ãŒãã§ã¯ããããã1ã€ã®ã«ãŒãã®ã¿ã䜿çšããŸãã
3.1äžè¬åãããããã°ã©ãã³ã°ã
ããäžè¬çãªã³ãŒããå¿
èŠã§ããïŒ æçµçã«ãã·ã§ã€ãäžã®ãã€ã³ã¿ãŒãã¯ãã«ã§ã®ã¿æ©èœããŸãã ãªã¹ããšã€ã³ã©ã€ã³é
åã¯ã©ãã§ããïŒ shared_ptrãunique_ptrãªã©ã®ã¹ããŒããã€ã³ã¿ãŒã¯ã©ãã§ããïŒ ãããŠãã·ã§ã€ããšã¯åŒã°ããªãããæç»ïŒïŒããã³å転ïŒïŒã§ãããªããžã§ã¯ãã¯ïŒ 泚æããŠãã ããïŒ
template<typename Iter> void rotate_and_draw(Iter first, Iter last, int r) { for_each(first,last,[](auto p) { p->rotate(r); });
ããã¯ã©ã®ã·ãŒã±ã³ã¹ã§ãæ©èœããŸãã ããã¯æšæºã©ã€ãã©ãªã®ã¢ã«ãŽãªãºã ã®ã¹ã¿ã€ã«ã§ãã autoã䜿çšããŠããªããžã§ã¯ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã«ååãä»ããŸããã ããã¯C ++ 11ã®æ©èœã§ããããåæåäžã«äœ¿çšãããåŒã®ã¿ã€ãã䜿çšãããããšãæå³ãããããpã®ã¿ã€ãã¯æåãšåãã«ãªããŸãã
å¥ã®äŸïŒ
void user(list<unique_ptr<Shape>>& lus, Container<Blob>& vb) { rotate_and_draw(lus.begin(),lus.end()); rotate_and_draw(begin(vb),end(vb)); }
ããã§ãBlobã¯æç»ïŒïŒããã³å転ïŒïŒæäœãæã€ç¹å®ã®ã°ã©ãã£ãã¯ã¿ã€ãã§ãããã³ã³ããã¯ã³ã³ããã®äžçš®ã§ãã æšæºã©ã€ãã©ãªã®ãªã¹ãïŒstd :: listïŒã«ã¯ãã·ãŒã±ã³ã¹ã®å®è¡ã«åœ¹ç«ã€beginïŒïŒããã³endïŒïŒã¡ãœããããããŸãã ããã¯çŸããå€å
žçãªOOPã§ãã ããããã³ã³ãããããŒããªãŒãã³ã·ãŒã±ã³ã¹å埩ã®æšæºå埩ããµããŒãããŠããªãå Žåã¯ã©ãã§ãããã[bïŒeïŒïŒ beginïŒïŒããã³endïŒïŒã¡ãœããããªãå Žå ããŠãééã§ããªãã³ã³ããã®ãããªãã®ãèŠãããšããªãã®ã§ãbeginïŒïŒãšendïŒïŒãå¥ã
ã«å®çŸ©ã§ããŸãã æšæºã©ã€ãã©ãªã¯ãCã¹ã¿ã€ã«ã®é
åã«å¯ŸããŠãã®æ©èœãæäŸãããããContainerãCã®é
åã§ããå Žåãåé¡ã¯è§£æ±ºããŸãã
3.2é©å¿
ã±ãŒã¹ã¯ããè€éã§ãïŒã³ã³ãããŒã«ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãå«ãŸããŠããŠãã¢ã¯ã»ã¹ãšééã®ããã®ç°ãªãã¢ãã«ãããå Žåã¯ã©ãã§ããããïŒ ããšãã°ã次ã®ããã«åœŒã«é£çµ¡ããå¿
èŠããããŸãã
for (auto p = c.first(); p!=nullptr; p=c.next()) { }
ãã®ã¹ã¿ã€ã«ã¯çãããããŸããã 次ã®ãããªã·ãŒã±ã³ã¹[bïŒeïŒã«æžããããšãã§ããŸãã
template<typename T> struct Iter { T* current; Container<T>& c; }; template<typename T> Iter<T> begin(Container<T>& c) { return Iter<T>{c.first(),c}; } template<typename T> Iter<T> end(Container<T>& c) { return Iter<T>{nullptr,c}; } template<typename T> Iter<T> operator++(Iter<T> p) { p.current = pcnext(); return p; } template<typename T> T* operator*(Iter<T> p) { return p.current; }
ãã®å€æŽã¯ç©æ¥µçã§ã¯ãããŸãããæšæºC ++ã©ã€ãã©ãªã§ãµããŒããããŠãããã¹ã¢ãã«ã«ãããããããããã«ãã³ã³ãããŸãã¯ãã®ã¯ã©ã¹ã®éå±€ãå€æŽããå¿
èŠã¯ãããŸããã§ããã ããã¯é©å¿ã§ããããªãã¡ã¯ã¿ãªã³ã°ã§ã¯ãããŸããã ãã®ãããªäžè¬çãªããã°ã©ãã³ã°ææ³ãæšæºã©ã€ãã©ãªã«éå®ãããªãããšã瀺ãããã«ããã®äŸãéžæããŸããã ãŸãããOOãã®å®çŸ©ã«è©²åœããŸããã
C ++ã³ãŒãã¯ãªããžã§ã¯ãæåïŒéå±€ãšä»®æ³é¢æ°ãã©ãã§ã䜿çšããïŒã§ãªããã°ãªããªããšããæŠå¿µã¯ãããã°ã©ã ã®é床ã«æªåœ±é¿ãåãŒããŸãã å®è¡æã«äžé£ã®åã解æããå¿
èŠãããå Žåãããã¯è¯ãã¢ãããŒãã§ãããç§ã¯ããããã䜿çšããŸãã ãã ããããªãæè»æ§ããªãïŒãã¹ãŠã®åãéå±€ã«åãŸãããã§ã¯ãããŸããïŒãä»®æ³é¢æ°ãåŒã³åºããšã€ã³ã©ã€ã³åã劚ããããããã°ã©ã ã50åããšã«é
ããªãå¯èœæ§ããããŸã
4.ç¥è©±3ïŒä¿¡é Œã§ããããã°ã©ã ã§ã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå¿
èŠã§ãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯é©åã§ãããæªäœ¿çšã®ã¡ã¢ãªã®å埩ã«ã¯æé©ã§ã¯ãããŸããã ããã¯äžèœè¬ã§ã¯ãããŸããã ã¡ã¢ãªã¯çŽæ¥å æãããªãå Žåããããå€ãã®ãªãœãŒã¹ã¯åãªãã¡ã¢ãªã§ã¯ãããŸããã äŸïŒ
class Filter {
Filterã³ã³ã¹ãã©ã¯ã¿ãŒã¯2ã€ã®ãã¡ã€ã«ãéããŸãã ãã®åŸãç¹å®ã®ã¿ã¹ã¯ãå®è¡ããããã¡ã€ã«ããã®å
¥åãåãå
¥ããããçµæãå¥ã®ãã¡ã€ã«ã«åºåãããŸãã Filterã§ã¿ã¹ã¯ãããŒãã³ãŒãåããŠã©ã ããšããŠäœ¿çšããããä»®æ³é¢æ°ããªãŒããŒããŒãããç¶æ¿ã¯ã©ã¹ãæäŸããé¢æ°ãšããŠäœ¿çšã§ããŸãã ãªãœãŒã¹ç®¡çã«ã€ããŠã¯ãåé¡ã§ã¯ãããŸããã 次ã®ããã«ãã£ã«ã¿ãŒãå®çŸ©ã§ããŸãã
void user() { Filter flt {âbooksâ,âauthorsâ}; Filter* p = new Filter{ânovelsâ,âfavoritesâ};
ãªãœãŒã¹ç®¡çã®èŠ³ç¹ããèŠããšãåé¡ã¯ããã¡ã€ã«ãéãããã2ã€ã®ã¹ã¬ããã«é¢é£ä»ãããããªãœãŒã¹ãå°æ¥ã®äœ¿çšã®ããã«æ£ããè¿ãããããã«ããæ¹æ³ã§ãã
ã¬ããŒãžã³ã¬ã¯ã¿ãŒã«äŸåããã·ã¹ãã ã§ã®éåžžã®è§£æ±ºçã¯ãåé€ãšãã¹ãã©ã¯ã¿ãåé€ããããšã§ãïŒã¬ããŒãžã³ã¬ã¯ã¿ã«ãã¹ãã©ã¯ã¿ãå«ãŸããããšã¯ãã£ãã«ãªããããã¢ã«ãŽãªãºã ã®åââé¡ã«ã€ãªãããããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããå¯èœæ§ãããããããã¹ãã©ã¯ã¿ãé¿ããã»ããããããã§ãïŒã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãã¹ãŠã®ã¡ã¢ãªãã¯ãªã¢ã§ããŸããããã¡ã€ã«ïŒãã¡ã€ã«ïŒãéããŠãã¡ã¢ãªïŒããã¯ïŒã§ã¯ãªãã¹ã¬ããã«é¢é£ãããã¹ãŠã®ãªãœãŒã¹ãè¿ãå¿
èŠããããŸãã ã¡ã¢ãªã¯èªåçã«è¿ãããŸãããä»ã®ãªãœãŒã¹ã®ç®¡çã¯æåã§å®è¡ãããããããªãŒã¯ããšã©ãŒãçºçããããããšãããããŸãã
C ++ã§äžè¬çã§æšå¥šãããã¢ãããŒãã¯ããã¹ãã©ã¯ã¿ã«äŸåããŠãªãœãŒã¹ãè¿ãããããã«ããããšã§ãã éåžžãã³ã³ã¹ãã©ã¯ã¿ãŒã§ãªãœãŒã¹ãåé€ãããããããã®ææ³ã«ã¯ãResource Acquisition Is InitializationãïŒRAIIïŒãšããååãä»ããããŸãã ãŠãŒã¶ãŒïŒïŒã§ãfltãã¹ãã©ã¯ã¿ã¯æé»çã«isããã³osã¹ã¬ãããã¹ãã©ã¯ã¿ãåŒã³åºããŸãã 次ã«ããã¡ã€ã«ãéããŠãã¹ã¬ããé¢é£ã®ãªãœãŒã¹ã解æŸããŸãã deleteã¯* pã«å¯ŸããŠãåãããšãè¡ããŸãã
ææ°ã®C ++ã®çµéšè±å¯ãªãŠãŒã¶ãŒã¯ããŠãŒã¶ãŒïŒïŒãäžæ Œå¥œã§ãšã©ãŒãçºçããããããšã«æ°ä»ãã§ãããã ã ããããã¯è¯ãã§ãããïŒ
void user2() { Filter flt {âbooksâ,âauthorsâ}; unique_ptr<Filter> p {new Filter{ânovelsâ,âfavoritesâ}};
çŸåšããŠãŒã¶ãŒã®çµäºæã«ïŒïŒ* pã¯èªåçã«è§£æŸãããŸãã ããã°ã©ãã¯ãããå¿ããªãã§ãããã unique_ptrã¯ãçµã¿èŸŒã¿ãã€ã³ã¿ãŒãšæ¯èŒããŠããã©ãŒãã³ã¹ãã¡ã¢ãªãç ç²ã«ããããšãªãããªãœãŒã¹ã確å®ã«è§£æŸããæšæºã©ã€ãã©ãªã¯ã©ã¹ã§ãã
ãã®ãœãªã¥ãŒã·ã§ã³ã¯åé·ãããïŒãã£ã«ã¿ãŒã®ç¹°ãè¿ãïŒãããéåžžã®ãã€ã³ã¿ãŒïŒæ°èŠïŒãšã¹ããŒãïŒunique_ptrïŒã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåé¢ããã«ã¯æé©åãå¿
èŠã§ãã ãããæ¹åããã«ã¯ãC ++ 14 make_uniqueãã«ããŒé¢æ°ã䜿çšããŸãããã®é¢æ°ã¯ãæå®ãããã¿ã€ãã®ãªããžã§ã¯ããäœæãããããæãunique_ptrãè¿ããŸãã
void user3() { Filter flt {âbooksâ,âauthorsâ}; auto p = make_unique<Filter>(ânovelsâ,âfavoritesâ);
ãŸãã¯ããã€ã³ã¿ãŒãä»ããŠãã¹ãŠãæžã蟌ãããã«2çªç®ã®ãã£ã«ã¿ãŒãå¿
èŠã§ãªãéããããã«åªãããªãã·ã§ã³ã§ãã
void user4() { Filter flt {âbooksâ,âauthorsâ}; Filter flt2 {ânovelsâ,âfavoritesâ};
èŠããã«ãããåçŽã§ãããæ確ã§ãããé«éã§ãã
ããããFilterãã¹ãã©ã¯ã¿ã¯äœãããŸããïŒ ãã£ã«ã¿ãªãœãŒã¹ã解æŸããŸã-ãã¡ã€ã«ãéããŸãïŒãã¹ãã©ã¯ã¿ãåŒã³åºããŸãïŒã ããã¯æé»çã«è¡ããããããFilterããä»ã«äœãå¿
èŠãªãå Žåã¯ããã®ãã¹ãã©ã¯ã¿ã«ã€ããŠã®èšåãåãé€ããŠãã³ã³ãã€ã©ã«ããèªäœããã¹ãŠå®è¡ãããããšãã§ããŸãã ãããã£ãŠã次ã®ããã«æžãã ãã§ãã
class Filter {
ãã®ãšã³ããªã¯ãèªåã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã䜿çšããèšèªïŒJavaãCïŒïŒã®ã»ãšãã©ã®ãšã³ããªãããåçŽã§ãããç©å¿ãã«ãããªãŒã¯ã¯ãããŸããã ãŸããæãããªä»£æ¿æ段ãããé«éã§ãã
ããããªãœãŒã¹ç®¡çã®çæ³ã§ãã ã¡ã¢ãªã ãã§ãªãããã¡ã€ã«ãã¹ããªãŒã ãããã¯ãªã©ã®ä»ã®ãªãœãŒã¹ã管çããŸãã ããããããã¯æ¬åœã«å
æ¬çãªãã®ã§ããïŒ æãããªææè
ã1人ãããªããªããžã§ã¯ãã«ã€ããŠã¯ã©ãã§ããïŒ
4.1æææš©ã®ç§»è»¢ïŒç§»è»¢
ã¹ã³ãŒãéã§ãªããžã§ã¯ãã転éããåé¡ãèæ
®ããŠãã ããã åé¡ã¯ãäžèŠãªã³ããŒããšã©ãŒã®çºçãããããã€ã³ã¿ãŒã®äœ¿çšãè¡ããã«ã倧éã®æ
å ±ãã¹ã³ãŒãããååŸããæ¹æ³ã§ãã åŸæ¥äœ¿çšãããŠãããã€ã³ã¿ãŒïŒ
X* make_X() { X* p = new X:
ãããŠããªããžã§ã¯ããåé€ãã責任ã¯èª°ã«ãããŸããïŒ make_XïŒïŒãåŒã³åºãåçŽãªã±ãŒã¹ã§ã¯ãããŸãããäžè¬çãªã±ãŒã¹ã§ã¯ãçãã¯ããã»ã©æçœã§ã¯ãããŸããã make_XïŒïŒããªããžã§ã¯ãããã£ãã·ã¥ããŠã¡ã¢ãªäœ¿çšéãæå°éã«æãããšã©ããªããŸããïŒ userïŒïŒã¯other_userïŒïŒã«ãã€ã³ã¿ãŒãæž¡ãå¿
èŠããããŸããïŒ æ··ä¹±ããå¯èœæ§ã®ããå Žæã¯å€ãããããã®ããã°ã©ãã³ã°ã¹ã¿ã€ã«ã§ã¯ãªãŒã¯ã¯çãããããŸããã shared_ptrãŸãã¯unique_ptrã䜿çšããŠããªããžã§ã¯ãã®ææè
ãçŽæ¥æ±ºå®ã§ããŸãã
unique_ptr<X> make_X();
ãããããªããã€ã³ã¿ãŒã䜿çšããã®ã§ããããïŒ å€ãã®å Žåãããã¯å¿
èŠã§ã¯ãããŸãããå€ãã®å Žåããªããžã§ã¯ãã®éåžžã®äœ¿çšãã泚æãããããŸãã ããšãã°ãMatrixå ç®é¢æ°ã¯2ã€ã®åŒæ°ã®æ°ãããªããžã§ã¯ããåèšãäœæããŸããããã€ã³ã¿ãŒãè¿ããšå¥åŠãªã³ãŒãã«ãªããŸãã
unique_ptr<Matrix> operator+(const Matrix& a, const Matrix& b); Matrix res = *(a+b);
*æåã¯ããã€ã³ã¿ãŒã§ã¯ãªããåèšãå«ããªããžã§ã¯ããååŸããããã«å¿
èŠã§ãã æ¬åœã«å¿
èŠãªã®ã¯ããªããžã§ã¯ããžã®ãã€ã³ã¿ã§ã¯ãªãããªããžã§ã¯ãã§ãã å°ããªãªããžã§ã¯ãã¯ããã«ã³ããŒããããã€ã³ã¿ãŒã¯äœ¿çšããŸããã
double sqrt(double);
äžæ¹ã倧éã®ããŒã¿ãå«ããªããžã§ã¯ãã¯éåžžããã®ããŒã¿ã®ãã³ãã©ãŒã§ãã istreamãstringãvectorãlistãthread-ãããã¯ãã¹ãŠãã»ãã®æ°ãã€ãã䜿çšããŠãã倧ããªããŒã¿ã«ã¢ã¯ã»ã¹ããŸãã ãããªãã¯ã¹ã®è¿œå ã«æ»ããŸãã å¿
èŠãªãã®ïŒ
Matrix operator+(const Matrix& a, const Matrix& b);
ç°¡åïŒ
Matrix operator+(const Matrix& a, const Matrix& b) { Matrix res;
ããã©ã«ãã§ã¯ãresèŠçŽ ã¯rã«ã³ããŒãããŸãããresã¯åé€ããããã®ã¡ã¢ãªã¯è§£æŸããããããèŠçŽ ãã³ããŒããå¿
èŠã¯ãããŸãããèŠçŽ ããçããããšãã§ããŸãã ããã¯C ++ã®æåã®æ¥ããè¡ãããšãã§ããŸããããå®è£
ããã®ã¯é£ããã誰ãããã®ææ³ãç解ããŠããŸããã§ããã C ++ 11ã¯ããªããžã§ã¯ãã®æææš©ã転éãã移åæäœã®åœ¢åŒã§ããè¡šçŸã®çé£ããçŽæ¥ãµããŒãããŸãã doubleèŠçŽ ã®åçŽãª2次å
ãããªãã¯ã¹ãèããŸãã
class Matrix { double* elem;
ã³ããŒæäœã¯ïŒã«ãã£ãŠèªèãããŸãã 移åæäœ-&&ã«ããã 移åæäœã¯ãã¥ãŒããã¹ããŒã«ãããã空ã®ãªããžã§ã¯ãããæ®ãå¿
èŠããããŸãã ãããªãã¯ã¹ã®å Žåãããã¯æ¬¡ã®ãããªãã®ãæå³ããŸãã
Matrix::Matrix(Matrix&& a)
以äžã§ãã ã³ã³ãã€ã©ãŒãreturn resãæ€åºãããšã 圌ã¯è§£å床ãããã«ç Žå£ãããããšãç解ããŠããŸãã è¿åŽåŸã¯äœ¿çšãããŸããã 次ã«ãã³ããŒãã代ããã«ç§»åã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠæ»ãå€ãæž¡ããŸãã ã®ããã«
Matrix r = a+b;
æŒç®å+ïŒïŒå
ã®resã¯ç©ºã«ãªããŸãã ãã¹ãã©ã¯ã¿ã«æ®ã£ãŠããäœæ¥ã¯ã»ãšãã©ãªããrã¯resèŠçŽ ãææããŠããŸãã é¢æ°ïŒæŒç®å+ïŒïŒïŒããçµæã®èŠçŽ ïŒã¡ã¬ãã€ãã®ã¡ã¢ãªã®å ŽåããããŸãïŒãå€æ°ã«ååŸããŸããã ãããŠã圌ãã¯æå°éã®ã³ã¹ãã§ãããããŸããã
C ++ã®å°é家ã¯ãå Žåã«ãã£ãŠã¯ãåªããã³ã³ãã€ã©ãŒãã³ããŒãå®å
šã«æé€ããŠè¿ãããšãã§ãããšææããŠããŸãã ããããããã¯ãããã®å®è£
ã«äŸåããŸãããããŠãåçŽãªããšã®é床ãã³ã³ãã€ã©ãŒãã©ãã»ã©ã¹ããŒãã«åºäŒã£ããã«äŸåããã®ã¯å¥œãã§ã¯ãããŸããã ããã«ãã³ããŒãæé€ããã³ã³ãã€ã©ã¯ãåé
眮ãæé€ã§ããŸãã 倧éã®æ
å ±ãããã¹ã³ãŒãããå¥ã®ã¹ã³ãŒãã«ç§»åããè€éããšã³ã¹ããæé€ããããã®ãã·ã³ãã«ã§ä¿¡é Œæ§ã®é«ãæ®éçãªæ¹æ³ããããŸãã
ããã«ã移åã»ãã³ãã£ã¯ã¹ã¯å²ãåœãŠã«å¯ŸããŠæ©èœããããã
r = a+b;
å²ãåœãŠæŒç®åã®ç§»åæé©åãååŸããŸãã ã³ã³ãã€ã©ãžã®å²ãåœãŠãæé©åããããšã¯ããã«å°é£ã§ãã
å€ãã®å Žåãããããã¹ãŠã®ã³ããŒããã³ç§»åæäœãå®çŸ©ããå¿
èŠãããããŸããã ã¯ã©ã¹ãæåŸ
ã©ããã«åäœããã¡ã³ããŒã§æ§æãããŠããå Žåãããã©ã«ãã®æäœã«åçŽã«äŸåã§ããŸãã äŸïŒ
class Matrix { vector<double> elem;
ãã®ãªãã·ã§ã³ã¯åã®ãªãã·ã§ã³ãšåãããã«åäœããŸããããšã©ãŒãããé©åã«åŠçããã¹ããŒã¹ãããå°ã䜿çšããç¹ãç°ãªããŸãïŒãã¯ãã«ã¯éåžž3ã¯ãŒãã§ãïŒã
ãã³ãã©ãŒã§ã¯ãªããã³ãã«ã¯ã©ãã§ããïŒ intãcomplexã®ããã«å°ããå Žåã§ãå¿é
ããå¿
èŠã¯ãããŸããã ãã以å€ã®å Žåã¯ããã³ãã©ãŒãäœæããããã¹ããŒããã€ã³ã¿ãŒunique_ptrããã³shared_ptrãä»ããŠããããè¿ããŸãã 裞ã®æäœnewãšdeleteã䜿çšããªãã§ãã ããã æ®å¿µãªããããã®äŸã®ãããªãã¯ã¹ã¯æšæºã®ISO C ++ã©ã€ãã©ãªã«ã¯å«ãŸããŠããŸããããããã€ãã®ã©ã€ãã©ãªããããŸãã ããšãã°ããOrigin Matrix Suttonããæ¢ãããã®å®è£
ã«é¢ããã³ã¡ã³ãã«ã€ããŠã¯ãC ++ããã°ã©ãã³ã°èšèªïŒç¬¬4çïŒã®ç¬¬29ç« ãåç
§ããŠãã ããã
ããŒã2