¤³¤³¤Ë¤Þ¤È¤á¤é¤ì¤Æ¤¤¤ë¤Î¤Ï¡¢»ä¤¬¤è¤¯¿Ò¤Í¤é¤ì¤ëC++¤Î¥¹¥¿¥¤¥ë¤È¥Æ¥¯¥Ë¥Ã¥¯¤Ë ´Ø¤¹¤ë¼ÁÌä¤Ç¤¹¡£¤â¤·¤è¤ê¤è¤¤¼ÁÌä¤ä²óÅú¤ËÂФ¹¤ë¥³¥á¥ó¥È¤¬¤¢¤ì¤Ð¡¢±óθ¤Ê¤¯»ä¤Ë ¥á¡¼¥ë(bs@research.att.com)¤Ç¤ªÃΤ餻¤¯¤À¤µ¤¤¡£¤Ê¤ª¡¢¥Û¡¼¥à¥Ú¡¼¥¸¤ò²þÁ±¤¹¤ë ¤¿¤á¤Ë¡¢»ä¤Ï¤¢¤Þ¤ê»þ´Ö¤ò³ä¤±¤Ê¤¤¤È¤¤¤¦¤³¤È¤ò¿´¤Ëα¤á¤Æ¤ª¤¤¤Æ¤¯¤À¤µ¤¤¡£
¤è¤ê°ìÈÌŪ¤Ê¼ÁÌä¤Ï¡¢°ìÈÌŪ¤ÊFAQ¤ò »²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
ÍѸì¤ä³µÇ°¤Ë¤Ä¤¤¤Æ¤Ï¡¢C++ÍѸì²òÀâ¤ò »²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤Îʸ½ñ¤ÎÆâÍÆ¤Ï¡¢¼ÁÌä¤È²óÅú¤ò¤Þ¤È¤á¤¿¤À¤±¤Î¤â¤Î¤Ç¤¢¤ë¤È¤¤¤¦¤³¤È¤ËÃí°Õ¤·¤Æ ¤¯¤À¤µ¤¤¡£¤è¤¤¶µ²Ê½ñ¤Ë¤ß¤é¤ì¤ë¤è¤¦¤Ê¡¢Ãí°Õ¿¼¤¯Áª¤Ð¤ì¤¿ÎãÂê¤È²òÀâ¤ÎÂå¤ï¤ê¤Ë¤Ê¤ë ¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤Þ¤¿¡¢¥ê¥Õ¥¡¥ì¥ó¥¹¥Þ¥Ë¥å¥¢¥ë¤äµ¬³Ê½ñ¤Î¤è¤¦¤Ê¡¢¾ÜºÙ¤ÇÀµ³Î¤Ê »ÅÍͤòÄ󶡤¹¤ë¤â¤Î¤Ç¤â¤¢¤ê¤Þ¤»¤ó¡£C++¤Î¥Ç¥¶¥¤¥ó¤Ë´Ø¤¹¤ë¼ÁÌä¤Ï¡¢C++¤ÎÀ߷פȿʲ½(The Design and Evolution of C++)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£C++¤Èɸ½à¥é¥¤¥Ö¥é¥ê¤Î»ÈÍÑË¡¤Ë´Ø¤¹¤ë ¼ÁÌä¤Ï¡¢¥×¥í¥°¥é¥ß¥ó¥° ¸À¸ìC++¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
°ìÉô¤ÎQ&A¤ËÃí¼á¤ò¤Ä¤±¤¿ Ãæ¹ñ¸ìÌõ¤¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢ ¤³¤Á¤é¤Ë¤ÏÊ̤ÎÃæ¹ñ¸ìÌõ¤¬¤¢¤ê¤Þ¤¹¡£
¤³¤Á¤é¤ËÆüËܸìÌõ¤¬¤¢¤ê¤Þ¤¹¡£
[ÌõÃí] ÆüËܸìÌõ¤Ë´Ø¤¹¤ë¾ðÊó¤Ï¡¢¡ÖÆüËܸìÌõ¤Ë¤Ä¤¤¤Æ¡×¤ò ¤´Í÷¤¯¤À¤µ¤¤¡£
¤È¤Æ¤â´Êñ¤Ê¥×¥í¥°¥é¥à¤ò¤É¤¦½ñ¤¤¤¿¤é¤è¤¤¤«¤È¤¤¤¦¼ÁÌä¤ò(ÆÃ¤Ë³Ø´ü¤Î»Ï¤Þ¤ê¤Ë)¤è¤¯ ¼õ¤±¤Þ¤¹¡£Åµ·¿Åª¤Ê¤Î¤Ï¡¢¿ôÃͤò¤¤¤¯¤Ä¤«ÆÉ¤ß¹þ¤ó¤Ç²¿¤«½èÍý¤·¡¢¤½¤Î·ë²Ì¤ò½ÐÎϤ¹¤ë ¤È¤¤¤¦¤â¤Î¤Ç¤¹¡£°Ê²¼¤Ï¤½¤Î¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à¤Ç¤¹¡£
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<double> v;
double d;
while(cin>>d) v.push_back(d); // Í×ÁǤòÆÉ¤ß¹þ¤à
if (!cin.eof()) { // ÆþÎϤ˼ºÇÔ¤·¤¿¤«³Îǧ¤¹¤ë
cerr << "format error\n";
return 1; // ¥¨¥é¡¼
}
cout << "read " << v.size() << " elements\n";
reverse(v.begin(),v.end());
cout << "elements in reverse order:\n";
for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n';
return 0; // À®¸ù
}
¤³¤Î¥×¥í¥°¥é¥à¤Ë¤Ä¤¤¤Æ¡¢°Ê²¼¤Ë¾¯¤·½ê¸«¤ò½Ò¤Ù¤Þ¤¹¡£
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
vector<double> v;
double d;
while(cin>>d) v.push_back(d); // Í×ÁǤòÆÉ¤ß¹þ¤à
if (!cin.eof()) { // ÆþÎϤ˼ºÇÔ¤·¤¿¤«³Îǧ¤¹¤ë
cin.clear(); // ¥¨¥é¡¼¾õÂÖ¤ò¥¯¥ê¥¢¤¹¤ë
string s;
cin >> s; // ÆþÎϽªÎ»¤ò¼¨¤¹Ê¸»úÎó¤òõ¤¹
if (s != "end") {
cerr << "format error\n";
return 1; // ¥¨¥é¡¼
}
}
cout << "read " << v.size() << " elements\n";
reverse(v.begin(),v.end());
cout << "elements in reverse order:\n";
for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n';
return 0; // À®¸ù
}
´Êñ¤Ê¤³¤È¤ò´Êñ¤ËºÑ¤Þ¤¹É¸½à¥é¥¤¥Ö¥é¥ê¤Î»ÈÍÑÎ㤬¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++Âè3ÈǤΠ¡Öɸ½à¥é¥¤¥Ö¥é¥ê¤Ò¤È¤á¤°¤ê(Tour of the Standard Library)¡×¤Î¾Ï(¥À¥¦¥ó¥í¡¼¥É ²Äǽ)¤Ë¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢¤½¤Á¤é¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
C++¥³¡¼¥Ç¥£¥ó¥°É¸½à¤Î¼ç¤ÊÌÜŪ¤Ï¡¢ÆÃÄê¤Î´Ä¶¤ÎÃæ¤ÇÆÃÄê¤ÎÌÜŪ¤òãÀ®¤¹¤ë ¤¿¤á¤Ë¡¢C++¤Î»ÈÍÑÊýË¡¤Ë´Ø¤¹¤ëµ¬Â§¤òÄê¤á¤ë¤³¤È¤Ç¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¤¢¤é¤æ¤ë»ÈÍÑ ÌÜŪ¤È¤¹¤Ù¤Æ¤Î¥æ¡¼¥¶¤ËŬ¤·¤¿¥³¡¼¥Ç¥£¥ó¥°É¸½à¤¬¤Ò¤È¤Ä¤·¤«¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ï ¤¢¤ê¤¨¤Þ¤»¤ó¡£ÆÃÄê¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó(¤¢¤ë¤¤¤Ï¡¢²ñ¼Ò¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥óʬÌî ¤Ê¤É)¤Ë¤È¤Ã¤Æ¡¢¥³¡¼¥Ç¥£¥ó¥°É¸½à¤¬¤Ê¤¤¤è¤ê¤Ï¡¢Îɤ¤¥³¡¼¥Ç¥£¥ó¥°É¸½à¤¬¤¢¤ë ¤Û¤¦¤¬Ë¾¤Þ¤·¤¤¤Ç¤¹¡£¤½¤Î°ìÊý¤Ç¡¢°¤¤¥³¡¼¥Ç¥£¥ó¥°É¸½à¤Î¤»¤¤¤Ç¡¢¥³¡¼¥Ç¥£¥ó¥° ɸ½à¤¬¤Ê¤¤¤è¤ê¤â¤â¤Ã¤È¤Ò¤É¤¯¤Ê¤ë¤È¤¤¤¦Îã¤ò¤³¤ì¤Þ¤Ç¤Ë¿¤¯¸«¤¿¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
¤¢¤Ê¤¿¤¬»ÈÍѤ¹¤ëµ¬Â§¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥óʬÌî¤Î³Î¤«¤ÊÃ챤ò¤â¤È¤Ë¤è¤¯Ãí°Õ ¤·¤ÆÁª¤ó¤Ç¤¯¤À¤µ¤¤¡£¤¤¤¯¤Ä¤«¤ÎºÇ¤â¤Ò¤É¤¤¥³¡¼¥Ç¥£¥ó¥°É¸½à(¡Öºá¤Ë¤Ê¤é¤Ê¤¤¤è¤¦¤Ë¡× ̾Á°¤òµó¤²¤Þ¤»¤ó¤¬)¤Ï¡¢C++¤Ë¤Ä¤¤¤Æ¤Î¤·¤Ã¤«¤ê¤È¤·¤¿Ã챤¬¤Ê¤¯¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó ʬÌî¤Ë´Ø¤·¤ÆÁêÂÐŪ¤Ë̵ÃΤʿÍã(³«È¯¼Ô¤È¤¤¤¦¤è¤ê¤Ï¡Ö¥¨¥¥¹¥Ñ¡¼¥È¡×¤È¸Æ¤Ð¤ì¤ë ¿Íã)¤È¡¢À©Ìó¤¬Â¿¤¤Êý¤¬¾¯¤Ê¤¤¤è¤ê¤â¤è¤¤¤È¤¤¤Ã¤¿¸í¤Ã¤¿³Î¿®¤ò»ý¤Ã¤¿¿Íã¤Ë¤è¤Ã¤Æ ½ñ¤«¤ì¤¿¤â¤Î¤Ç¤¹¡£¤½¤Î¸í¤Ã¤¿¹Í¤¨¤È¤ÏÂоÈŪ¤Ë¡¢¥×¥í¥°¥é¥Þ¤¬¤â¤Ã¤È¤Ò¤É¤¤µ¬Â§¤Ë ½¾¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤â¤Î¤â¤¢¤ê¤Þ¤¹¡£¤¤¤º¤ì¤Ë¤·¤Æ¤â¡¢°ÂÁ´À¤äÀ¸»ºÀ ¤Ê¤É¤È¤¤¤¦¤â¤Î¤Ï¡¢Àß·×/³«È¯¥×¥í¥»¥¹¤òÄ̤·¤Æ¸þ¾å¤¹¤ë¤â¤Î¤Ç¤¢¤ë¤È¤¤¤¦¤³¤È¤ò˺¤ì ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¸Ä¡¹¤Î¸À¸ì¤Îµ¡Ç½¡¢¤½¤ì¤É¤³¤í¤«¸À¸ì¤Ë¤è¤Ã¤Æ¸þ¾å¤¹¤ë¤â¤Î¤Ç¤Ï ¤¢¤ê¤Þ¤»¤ó¡£
°Ê¾å¤Î¤³¤È¤ËÃí°Õ¤·¤¿¤¦¤¨¤Ç¡¢3¤Ä¤Î¥³¡¼¥Ç¥£¥ó¥°É¸½à¤ò¤ª¤¹¤¹¤á¤·¤Þ¤¹¡£
¶õÇò¤Ç½ªÃ¼¤·¤¿1ñ¸ì¤Ï¡¢¼¡¤Î¤è¤¦¤ËÆÉ¤ß¹þ¤à¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
#include<iostream>
#include<string>
using namespace std;
int main()
{
cout << "Please enter a word:\n";
string s;
cin>>s;
cout << "You entered " << s << '\n';
}
ÌÀ¼¨Åª¤Ê¥á¥â¥ê´ÉÍý¤È¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¹¤ë²ÄǽÀ¤Î¤¢¤ë¸ÇÄêĹ¥Ð¥Ã¥Õ¥¡¤ò»ÈÍÑ ¤·¤Æ¤¤¤Ê¤¤¤³¤È¤ËÃíÌܤ·¤Æ¤¯¤À¤µ¤¤¡£
(1ñ¸ì¤À¤±¤Ç¤Ï¤Ê¤¯)1¹ÔÁ´ÂΤòÆÉ¤ß¹þ¤àɬÍפ¬¤¢¤ë¤Ê¤é¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£
#include<iostream>
#include<string>
using namespace std;
int main()
{
cout << "Please enter a line:\n";
string s;
getline(cin,s);
cout << "You entered " << s << '\n';
}
iostream¤ästring¤Ê¤É¤Îɸ½à¥é¥¤¥Ö¥é¥ê¤Îµ¡Ç½¤Î´Êñ¤Ê¾Ò²ð¤¬¡¢¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++Âè3ÈǤΠÂè3¾Ï(¥ª¥ó¥é¥¤¥ó¤Ç»²¾È²Äǽ)¤Ë¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢¤½¤Á¤é¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ C¤ÈC++¤Ë¤ª¤±¤ëI/O¤Î´Êñ¤Ê»ÈÍÑË¡¤ò¾ÜºÙ¤ËÈæ³Ó¤·¤¿¤â¤Î¤¬¡¢"Learning Standard C++ as a New Language"¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤Á¤é¤Ï»ä¤Î½ÐÈÇʪ°ìÍ÷¤«¤é¥À¥¦¥ó¥í¡¼¥É ¤Ç¤¤Þ¤¹¡£
ºÇ¤â´Êñ¤ÊÊýË¡¤Ï¡¢stringstream¤ò»ÈÍѤ¹¤ëÊýË¡¤Ç¤¹¡£
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
string itos(int i) // int¤òstring¤ËÊÑ´¹¤¹¤ë
{
stringstream s;
s << i;
return s.str();
}
int main()
{
int i = 127;
string ss = itos(i);
const char* p = ss.c_str();
cout << ss << " " << p << "\n";
}
¤â¤Á¤í¤ó¡¢¤³¤Î¥Æ¥¯¥Ë¥Ã¥¯¤Ï¡¢<< ¤ò»ÈÍѤ·¤ÆÊ¸»úÎ󤨽ÐÎϤǤ¤ë·¿¤Ç¤¢¤ì¤Ð¡¢ ¤É¤Î¤è¤¦¤Ê·¿¤Ç¤âÊÑ´¹¤Ç¤¤Þ¤¹¡£Ê¸»úÎ󥹥ȥ꡼¥à¤Î¾ÜºÙ¤Ï¡¢¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++¤Î21.5.3¤ò »²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
C¤ÈƱÍͤˡ¢C++¤Ç¤ÏÇÛÃ֤λÅÊý¤ÏÄêµÁ¤·¤Æ¤¤¤Þ¤»¤ó¡£¤¿¤À¡¢Ëþ¤µ¤»¤Ê¤±¤ì¤Ð ¤Ê¤é¤Ê¤¤°ÕÌ£À©Ìó(semantic constraints)¤À¤±ÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¼ÂÁõ¤¬ °Û¤Ê¤ì¤Ð¡¢°Û¤Ê¤ëÇÛÃ֤λÅÊý¤ò¤·¤Þ¤¹¡£»ä¤¬ÃΤäƤ¤¤ëÃæ¤ÇºÇ¤âÍ¥¤ì¤¿²òÀ⤬¡¢ The Annotated C++ Reference Manual(°ìÈ̤ËARM¤È¸Æ¤Ð¤ì¤Æ¤¤¤ë)¤ÎÃæ¤Ç¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢»Äǰ¤Ê¤¬¤é¡¢¤½¤ì°Ê³°¤Î ÆâÍÆ¤Ï¸Å¤¯¡¢ºÇ¿·¤ÎC++¤Î¼ÂÁõ¤Ë´Ø¤¹¤ëµ½Ò¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤½¤Î²òÀâ¤Ë¤Ï½ÅÍפÊÇÛÃ֤ΠÎã¤ò¼¨¤¹¿Þ¤¬ºÜ¤Ã¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢Èó¾ï¤Ë´Êñ¤ÊÀâÌÀ¤¬¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++¤ÎÂè2¾Ï¤Ë ¤¢¤ê¤Þ¤¹¡£
´ðËÜŪ¤ËC++¤Ç¤Ï¡¢Ã±½ã¤Ë¥µ¥Ö¥ª¥Ö¥¸¥§¥¯¥È¤ò¤Ä¤Ê¤²¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤ò¹½À®¤·¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¼¡¤Ë¼¨¤¹¥³¡¼¥É¤Ï¡¢
struct A { int a,b; };
¤Õ¤¿¤Ä¤Îint¤òʤ٤ÆÉ½¸½¤µ¤ì¡¢¼¡¤Ë¼¨¤¹¥³¡¼¥É¤Ï¡¢
struct B : A { int c; };
A¤Î¸å¤Ëint¤òʤ٤ÆÉ½¸½¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢3¸Ä¤Îint¤òʤ٤ÆÉ½¸½¤µ¤ì¤Þ¤¹¡£
²¾ÁÛ´Ø¿ô¤Ï°ìÈÌŪ¤Ë¡¢²¾ÁÛ´Ø¿ô¤ò»ý¤Ä¥¯¥é¥¹¤Î³Æ¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥Ý¥¤¥ó¥¿(vptr)¤ò »ý¤¿¤»¤ë¤³¤È¤Ç¼Â¸½¤·¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥Ý¥¤¥ó¥¿¤ÏŬÀڤʴؿô¥Æ¡¼¥Ö¥ë(vtbl)¤ò»Ø¤·¤Þ¤¹¡£ ³Æ¥¯¥é¥¹¤ÏÆÈ¼«¤Îvtbl¤ò»ý¤Á¡¢¤½¤Î¥¯¥é¥¹¤Î¤¹¤Ù¤Æ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¶¦Í¤·¤Þ¤¹¡£
"this"¤¬C++(¼ÂºÝ¤ÏC with Classes)¤ËƳÆþ¤µ¤ì¤¿¤Î¤¬¡¢¥ê¥Õ¥¡¥ì¥ó¥¹¤¬Æ³Æþ¤µ¤ì¤ë Á°¤À¤Ã¤¿¤«¤é¤Ç¤¹¡£¤Á¤Ê¤ß¤Ë¡¢Smalltalk¤Î"self"¤Ç¤Ï¤Ê¤¯¡¢Simula¤Ë ¤Ê¤é¤Ã¤Æ"this"¤òÁª¤Ó¤Þ¤·¤¿¡£
¤Õ¤¿¤Ä¤Î°Û¤Ê¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¢¥É¥ì¥¹¤¬°Û¤Ê¤ë¤â¤Î¤Ë¤Ê¤ë¤è¤¦¤ËÊݾڤ¹¤ë¤¿¤á ¤Ç¤¹¡£Æ±¤¸Íýͳ¤Ç¡¢"new"¤Ï¾ï¤Ë°Û¤Ê¤ë¥ª¥Ö¥¸¥§¥¯¥È¤òÊÖ¤·¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤ò¹Í¤¨ ¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
class Empty { };
void f()
{
Empty a, b;
if (&a; == &b;) cout << "¤¢¤ê¤¨¤Ê¤¤: ¥³¥ó¥Ñ¥¤¥é¶¡µë¼Ô¤Ë¥¨¥é¡¼¤òÊó¹ð¤»¤è";
Empty* p1 = new Empty;
Empty* p2 = new Empty;
if (p1 == p2) cout << "¤¢¤ê¤¨¤Ê¤¤: ¥³¥ó¥Ñ¥¤¥é¶¡µë¼Ô¤Ë¥¨¥é¡¼¤òÊó¹ð¤»¤è";
}
¤Þ¤¿¡¢¶õ¤Î´ðÄ쥯¥é¥¹¤ÏÆÈΩ¤·¤¿¥Ð¥¤¥È¤Çɽ¸½¤¹¤ëɬÍפ¬¤Ê¤¤¤È¤¤¤¦¶½Ì£¿¼¤¤ µ¬Â§¤¬¤¢¤ê¤Þ¤¹¡£
struct X : Empty {
int a;
// ...
};
void f(X* p)
{
void* p1 = p;
void* p2 = &p-;>a;
if (p1 == p2) cout << "¤¹¤Ð¤é¤·¤¤: ¤è¤¤¥ª¥×¥Æ¥£¥Þ¥¤¥¶¤À";
}
¤³¤ÎºÇŬ²½¤Ï°ÂÁ´¤Ç¤¢¤ê¡¢¤È¤Æ¤âÌò¤ËΩ¤Á¤Þ¤¹¡£¥×¥í¥°¥é¥Þ¤Ï¶õ¤Î¥¯¥é¥¹¤ò »È¤Ã¤Æ¡¢¤È¤Æ¤âñ½ã¤Ê³µÇ°¤ò¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤Ê¤·¤Ëɽ¸½¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£ ºÇ¿·¤Î¥³¥ó¥Ñ¥¤¥é¤ÎÃæ¤Ë¤Ï¡¢¤³¤Î¡Ö¶õ¤Î´ðÄ쥯¥é¥¹¤ÎºÇŬ²½(empty base class optimization)¡×µ¡Ç½¤òÄ󶡤·¤Æ¤¤¤ë¤â¤Î¤â¤¢¤ê¤Þ¤¹¡£
ÇÛÎó¤ÎÈϰϤΤ褦¤ÊÄê¿ô¼°¤ÎÃæ¤Ç»ÈÍѤǤ¤ëÄê¿ô¤¬É¬Íפʾì¹ç¡¢¤Õ¤¿¤Ä¤ÎÁªÂò»è ¤¬¤¢¤ê¤Þ¤¹¡£
class X {
static const int c1 = 7;
enum { c2 = 19 };
char v1[c1];
char v2[c2];
// ...
};
°ì¸«¤·¤¿¤È¤³¤í¡¢c1¤ÎÀë¸À¤ÎÊý¤¬¤¹¤Ã¤¤ê¤·¤Æ¤¤¤ë¤è¤¦¤Ë¸«¤¨¤Þ¤¹¤¬¡¢¤³¤Î¥¯¥é¥¹ Æâ½é´ü²½¹½Ê¸¤Ï¡¢Äê¿ô¼°¤Ç½é´ü²½¤µ¤ì¤¿À°¿ô·¿¤Îstatic const¤«Îóµó·¿¤Ç¤Ê¤±¤ì¤Ð ¤Ê¤ê¤Þ¤»¤ó¡£¤³¤ì¤Ï¤«¤Ê¤ê¤ÎÀ©¸Â¤Ç¤¹¡£
class Y {
const int c3 = 7; // ¥¨¥é¡¼: static¤Ç¤Ï¤Ê¤¤
static int c4 = 7; // ¥¨¥é¡¼: const¤Ç¤Ï¤Ê¤¤
static const float c5 = 7; // ¥¨¥é¡¼: À°¿ô¤Ç¤Ï¤Ê¤¤
};
»ä¤Ï¡Öenum¥È¥ê¥Ã¥¯¡×¤ò¤è¤¯»È¤¤¤Þ¤¹¡£¤Ê¤¼¤Ê¤é¡¢°Ü¿¢À¤¬¹â¤¯¡¢Èóɸ½à³ÈÄ¥¤Î ¥¯¥é¥¹Æâ½é´ü²½¹½Ê¸¤ò»È¤¦µ¤¤Ë¤µ¤»¤Ê¤¤¤«¤é¤Ç¤¹¡£
¤½¤ì¤Ç¤Ï¡¢¤Ê¤¼¤³¤Î¤è¤¦¤ÊÉÔÊØ¤ÊÀ©¸Â¤¬¤¢¤ë¤Î¤Ç¤·¤ç¤¦¤«¡£¥¯¥é¥¹¤Ï°ìÈÌŪ¤Ë ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤ÎÃæ¤ÇÀë¸À¤µ¤ì¡¢¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Ï¿¤¯¤ÎËÝÌõñ°Ì(translation units)¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Þ¤¹¡£¤·¤«¤·¡¢Ê£»¨¤Ê¥ê¥ó¥«µ¬Â§¤òÈò¤±¤ë¤¿¤á¤Ë¡¢C++¤Ï ¤¹¤Ù¤Æ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤¬°ì°Õ¤ÊÄêµÁ¤ò»ý¤Ä¤³¤È¤òÍ׵ᤷ¤Þ¤¹¡£¤â¤·¡¢C++¤¬¥ª¥Ö¥¸¥§¥¯¥È ¤È¤·¤Æ¥á¥â¥ê¤Ë³ÊǼ¤¹¤ëɬÍפΤ¢¤ëÍ×ÁǤΥ¯¥é¥¹ÆâÄêµÁ¤òǧ¤á¤ì¤Ð¡¢¤³¤Îµ¬Â§¤Ë°ãÈ¿ ¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£C++¤ÎÀ߷פˤª¤±¤ë¥È¥ì¡¼¥É¥ª¥Õ¤Ë´Ø¤¹¤ëÀâÌÀ¤Ï¡¢C++¤ÎÀ߷פȿʲ½¤ò»²¾È¤·¤Æ ¤¯¤À¤µ¤¤¡£
const¤òÄê¿ô¼°¤ÎÃæ¤Ç»È¤¦É¬Íפ¬¤Ê¤±¤ì¤Ð¡¢¤â¤Ã¤È½ÀÆðÀ¤òÆÀ¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
class Z {
static char* p; // ÄêµÁ¤Ç½é´ü²½¤¹¤ë
const int i; // ¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç½é´ü²½¤¹¤ë
public:
Z(int ii) :i(ii) { }
};
char* Z::p = "hello, there";
¥¯¥é¥¹¤Î³°¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¸Â¤ê¡¢static¥á¥ó¥Ð¤Î¥¢¥É¥ì¥¹¤ò¼èÆÀ¤Ç¤¤Þ¤¹¡£
class AE {
// ...
public:
static const int c6 = 7;
static const int c7 = 31;
};
const int AE::c7; // ÄêµÁ
int f()
{
const int* p1 = &AE;::c6; // ¥¨¥é¡¼: c6¤Ïº¸ÊÕÃͤǤϤʤ¤
const int* p2 = &AE;::c7; // OK
// ...
}
´Êñ¤ÊÅú¤¨¤Ï¡Ö¤â¤Á¤í¤ó¸Æ¤Ð¤ì¤Þ¤¹¤è!¡×¤Ç¤¹¤¬¡¢¤³¤Î¼ê¤Î¼ÁÌä¤Ë¤è¤¯Åº¤¨¤é¤ì¤Æ ¤¯¤ë¥×¥í¥°¥é¥àÎã¤ò¸«¤Æ¤ß¤Þ¤·¤ç¤¦¡£
void f()
{
X* p = new X;
// p¤ò»ÈÍѤ¹¤ë
}
¤Ä¤Þ¤ê¡¢"new"¤ÇÀ¸À®¤µ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤¬¡¢´Ø¿ô¤Î½ª¤ï¤ê¤Ç²òÊü¤µ¤ì¤ë
¤È¤¤¤¦(¸í¤Ã¤¿)ÁÛÄê¤ò¤·¤Æ¤¤¤Þ¤¹¡£
´ðËÜŪ¤Ë¡¢¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤·¤¿¥¹¥³¡¼¥×¤ÎÀ¸Â¸´ü´Ö¤ò±Û¤¨¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤ò ¸ºß¤µ¤»¤Æ¤ª¤¤¿¤¤¤È¤¤À¤±"new"¤ò»ÈÍѤ¹¤ë¤Ù¤¤Ç¤¹¡£»ÈÍѸå¤Ï¡¢"delete"¤Ç¤½¤Î ¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
X* g(int i) { /* ... */ return new X(i); } // X¤Ïg()¤Î¸Æ¤Ó½Ð¤·¤ò±Û¤¨¤ÆÂ¸ºß¤¹¤ë
void h(int i)
{
X* p = g(i);
// ...
delete p;
}
¥¹¥³¡¼¥×¤ÎÃæ¤À¤±¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤ò¸ºß¤µ¤»¤¿¤¤¾ì¹ç¤Ï¡¢"new"¤ò»ÈÍѤ»¤º¤Ë¡¢Ã±¤Ë
ÊÑ¿ô¤òÄêµÁ¤·¤Þ¤¹¡£
{
ClassName x;
// x¤ò»ÈÍѤ¹¤ë
}
ÊÑ¿ô¤Ï¥¹¥³¡¼¥×¤Î½ª¤ï¤ê¤Ç°ÅÌۤΤ¦¤Á¤Ë²òÊü¤µ¤ì¤Þ¤¹¡£
new¤ò»ÈÍѤ·¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤·¡¢¤½¤ÎƱ¤¸¥¹¥³¡¼¥×¤Î½ª¤ï¤ê¤Ç²òÊü¤¹¤ë ¥³¡¼¥É¤Ï¡¢½¹¤¯¡¢¸í¤ê¤òÈȤ·¤ä¤¹¤¯¡¢¸úΨ¤¬°¤¤¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ê ¥³¡¼¥É¤Ç¤¹¡£
void fct() // ½¹¤¯¡¢¸í¤ê¤òÈȤ·¤ä¤¹¤¯¡¢¸úΨ¤¬°¤¤
{
X* p = new X;
// p¤ò»ÈÍѤ¹¤ë
delete p;
}
¤¤¤¤¤¨¡¢°ãÈ¿¤·¤Þ¤»¤ó¡£"friend"¤Ï¥¢¥¯¥»¥¹¤òµö²Ä¤¹¤ë¤¿¤á¤ÎÌÀ¼¨Åª¤Ê¥á¥«¥Ë¥º¥à ¤Ç¡¢¥á¥ó¥Ð¥·¥Ã¥×¤Î¤è¤¦¤Ê¤â¤Î¤Ç¤¹¡£(ɸ½àµ¬³Ê¤Ë½àµò¤·¤¿¥×¥í¥°¥é¥à¤Ç¤Ï)¥½¡¼¥¹¤Î Êѹ¹¤Ê¤·¤Ë¥¯¥é¥¹¤Ø¤Î¥¢¥¯¥»¥¹¤òµö²Ä¤¹¤ë¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
class X {
int i;
public:
void m(); // X::m()¤Ë¥¢¥¯¥»¥¹¤òµö²Ä¤¹¤ë
friend void f(X&); // f(X&)¤Ë¥¢¥¯¥»¥¹¤òµö²Ä¤¹¤ë
// ...
};
void X::m() { i++; /* X::m()¤ÏX::i¤Ë¥¢¥¯¥»¥¹¤Ç¤¤ë */ }
void f(X& x) { x.i++; /* f(X&)¤ÏX::i¤Ë¥¢¥¯¥»¥¹¤Ç¤¤ë */ }
C++¤ÎÊݸî¥â¥Ç¥ë¤Ë´Ø¤¹¤ëÀâÌÀ¤Ï¡¢C++¤ÎÀ߷פȿʲ½¤Î2.10¤È¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++¤Î11.5, 15.3, C.11¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤Î¼ÁÌä¤Ï¤¤¤í¤¤¤í¤È¤«¤¿¤Á¤òÊѤ¨¤Æ¤ä¤Ã¤Æ¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ê ¼ÁÌä¤Ç¤¹¡£
struct Point {
int x,y;
Point(int xx = 0, int yy = 0) :x(xx), y(yy) { }
};
Point p1(1,2);
Point p2 = p1;
¤³¤³¤Ç¡¢p2.x==p1.x ¤È p2.y==p1.y ¤Ë¤Ê¤ê¤Þ¤¹¡£Â¿¤¯¤Î¾ì¹ç¡¢¤³¤ì¤Ï¤Þ¤µ¤Ë´üÂÔ¤·¤¿
Ä̤ê¤Î·ë²Ì(¤Ç¤¢¤ê¡¢C¤È¤Î¸ß´¹À¤Ë¤È¤Ã¤ÆÉԲķç)¤Ç¤¹¤¬¡¢¼¡¤ÎÎã¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
class Handle {
private:
string name;
X* p;
public:
Handle(string n)
:name(n), p(0) { /* X ¤ò³ÍÆÀ¤·¡¢p ¤Ë¤½¤ì¤ò»Ø¤µ¤»¤ë */ }
~Handle() { delete p; /* X ¤ò²òÊü¤¹¤ë */ }
// ...
};
void f(const string& hh)
{
Handle h1(hh);
Handle h2 = h1; // ¤á¤Á¤ã¤¯¤Á¤ã¤Ê¾õÂ֤ˤʤë!
// ...
}
¤³¤³¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¥³¥Ô¡¼¤Ë¤è¤ê¡¢h2.name==h1.name ¤È h2.p==h1.p ¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤ì¤ÏºÇ°¤Î»öÂÖ¤ò¤â¤¿¤é¤·¤Þ¤¹¡£f()¤ò½ªÎ»¤·¤¿¤È¤¡¢h1 ¤È h2 ¤Î¥Ç¥¹¥È¥é¥¯¥¿
¤¬µ¯Æ°¤µ¤ì¡¢h1.p ¤È h2.p ¤¬»Ø¤·¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤¬2ÅÙºï½ü¤µ¤ì¤Æ¤·¤Þ¤¤¤Þ¤¹¡£
¤³¤ì¤òÈò¤±¤ë¤Ë¤Ï¤É¤¦¤¹¤ì¤Ð¤è¤¤¤Ç¤·¤ç¤¦¤«¡£ºÇ¤â´Êñ¤Ê²ò·èÊýË¡¤Ï¡¢¥³¥Ô¡¼¤¹¤ë ¥ª¥Ú¥ì¡¼¥·¥ç¥ó¤òÈó¸ø³«¤Ë¤·¤Æ¥³¥Ô¡¼¤òËɤ°¤È¤¤¤¦ÊýË¡¤Ç¤¹¡£
class Handle {
private:
string name;
X* p;
Handle(const Handle&); // ¥³¥Ô¡¼¤òËɤ°
Handle& operator=(const Handle&);
public:
Handle(string n)
:name(n), p(0) { /* X ¤ò³ÍÆÀ¤·¡¢p ¤Ë¤½¤ì¤ò»Ø¤µ¤»¤ë */ }
~Handle() { delete p; /* X ¤ò²òÊü¤¹¤ë */ }
// ...
};
void f(const string& hh)
{
Handle h1(hh);
Handle h2 = h1; // ¥¨¥é¡¼ (¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤êÊó¹ð¤µ¤ì¤ë)
// ...
}
¥³¥Ô¡¼¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢¤â¤Á¤í¤ó¡¢ÌÜŪ¤È¤¹¤ë¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤òÍѰդ¹¤ë
¤¿¤á¤Ë¡¢¥³¥Ô¡¼¥¤¥Ë¥·¥ã¥é¥¤¥¶¤È¥³¥Ô¡¼ÂåÆþ¤òÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤µ¤Æ¡¢Point ¤ËÌá¤ê¤Þ¤·¤ç¤¦¡£Point ¤Ë¤È¤Ã¤Æ¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥³¥Ô¡¼¥»¥Þ¥ó¥Æ¥£¥¯¥¹ ¤ËÌäÂê¤Ï¤¢¤ê¤Þ¤»¤ó¡£ÌäÂê¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Ë¤¢¤ê¤Þ¤¹¡£
struct Point {
int x,y;
Point(int xx = 0, int yy = 0) :x(xx), y(yy) { }
};
void f(Point);
void g()
{
Point orig; // ¥Ç¥Õ¥©¥ë¥ÈÃÍ (0,0) ¤ò»ý¤Ä orig ¤òÀ¸À®¤¹¤ë
Point p1(2); // ¥Ç¥Õ¥©¥ë¥È y ºÂɸÃÍ 0 ¤ò»ý¤Ä p1 ¤òÀ¸À®¤¹¤ë
f(2); // Point(2,0) ¤ò¸Æ¤Ó½Ð¤¹
}
orig ¤È p1 ¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ëÍøÊØÀ¤òÆÀ¤ë¤¿¤á¤Ë¡¢¥Ç¥Õ¥©¥ë¥È°ú¿ô¤¬ÍѰդµ¤ì¤Æ
¤¤¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢f() ¤Î¸Æ¤Ó½Ð¤·»þ¤Ë 2 ¤¬ Point(2,0) ¤ËÊÑ´¹¤µ¤ì¤ë¤³¤È¤Ë¶Ã¤¯
¿Í¤¬¤¤¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£°ú¿ô¤ò¤Ò¤È¤Ä¼è¤ë¥³¥ó¥¹¥È¥é¥¯¥¿¤ÏÊÑ´¹¤òÄêµÁ¤·¤Þ¤¹¡£
¤³¤ì¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç°ÅÌÛ¤ÎÊÑ´¹¤È¤Ê¤ê¤Þ¤¹¡£¤³¤Î¤è¤¦¤ÊÊÑ´¹¤òÌÀ¼¨¤µ¤»¤ë¤Ë¤Ï¡¢
¥³¥ó¥¹¥È¥é¥¯¥¿¤ò explict ¤ÈÀë¸À¤·¤Þ¤¹¡£
struct Point {
int x,y;
explicit Point(int xx = 0, int yy = 0) :x(xx), y(yy) { }
};
void f(Point);
void g()
{
Point orig; // ¥Ç¥Õ¥©¥ë¥ÈÃÍ (0,0) ¤ò»ý¤Ä orig ¤òÀ¸À®¤¹¤ë
Point p1(2); // ¥Ç¥Õ¥©¥ë¥È y ºÂɸÃÍ 0 ¤ò»ý¤Ä p1 ¤òÀ¸À®¤¹¤ë
// ¤³¤ì¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ÎÌÀ¼¨Åª¤Ê¸Æ¤Ó½Ð¤·¤Ç¤¢¤ë
f(2); // ¥¨¥é¡¼ (°ÅÌÛ¤ÎÊÑ´¹¤ò»î¤ß¤¿)
Point p2 = 2; // ¥¨¥é¡¼ (°ÅÌÛ¤ÎÊÑ´¹¤ò»î¤ß¤¿)
Point p3 = Point(2); // OK (ÌÀ¼¨Åª¤ÊÊÑ´¹)
}
¤¢¤Ê¤¿¤Î¥³¥ó¥Ñ¥¤¥é¤ËÌäÂ꤬¤¢¤ë¤Î¤«¤â¤·¤ì¤Þ¤»¤ó¡£¥³¥ó¥Ñ¥¤¥é¤¬¸Å¤¤¤«¡¢¤¦¤Þ¤¯ ¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¡¢¤¢¤ë¤¤¤Ï¡¢¤¢¤Ê¤¿¤Î¥³¥ó¥Ô¥å¡¼¥¿¤¬µì¼°¤Ê¤Î¤«¤â¤·¤ì ¤Þ¤»¤ó¡£¤½¤Î¤è¤¦¤ÊÌäÂê¤Ë¤Ï¤ªÌò¤ËΩ¤Æ¤Þ¤»¤ó¡£
¤·¤«¤·¡¢¤¢¤Ê¤¿¤¬¥³¥ó¥Ñ¥¤¥ë¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¥×¥í¥°¥é¥à¤ÎÀ߷פ¬¤Þ¤º¤¤¤Î¤Ç¡¢ ¥³¥ó¥Ñ¥¤¥é¤¬¥³¥ó¥Ñ¥¤¥ë»þ¤Ë²¿É´¤â¤Î¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤È²¿Ëü¹Ô¤â¤Î¥³¡¼¥É¤ò²òÀÏ ¤·¤Æ¤¤¤ë²ÄǽÀ¤¬¹â¤¤¤Ç¤¹¡£¸¶ÍýŪ¤Ë¤Ï¡¢¤³¤ì¤òÈò¤±¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¤â¤·¤³¤Î ÌäÂ꤬¤¢¤Ê¤¿¤¬»ÈÍѤ·¤Æ¤¤¤ë¥é¥¤¥Ö¥é¥ê¤Î¥Ù¥ó¥À¤Ë¤è¤ëÀ߷פˤ¢¤ë¤Ê¤é¡¢(¤â¤Ã¤ÈÎɤ¤ ¥é¥¤¥Ö¥é¥ê/¥Ù¥ó¥À¤ËÊѤ¨¤ë°Ê³°¤Ë)¤¢¤Ê¤¿¤Ë¤Ç¤¤ë¤³¤È¤Ï¤¢¤Þ¤ê¤¢¤ê¤Þ¤»¤ó¡£¤·¤«¤·¡¢ ¤¢¤Ê¤¿¼«¿È¤Î¥³¡¼¥É¤Ê¤é¡¢Êѹ¹¸å¤ÎºÆ¥³¥ó¥Ñ¥¤¥ë¤¬ºÇ¾®¸Â¤È¤Ê¤ë¤è¤¦¤Ë¹½À®¤¹¤ë¤³¤È¤¬ ¤Ç¤¤Þ¤¹¡£¤½¤Î¤è¤¦¤ÊÀ߷פϴؿ´»ö¹à¤ò¤¦¤Þ¤¯Ê¬³ä¤µ¤»¤ë¤Î¤Ç¡¢°ìÈÌŪ¤Ë¤è¤êÍ¥¤ì¤¿¡¢ ¥á¥¤¥ó¥Æ¥Ê¥ó¥¹²Äǽ¤ÊÀ߷פȤʤê¤Þ¤¹¡£
¼¡¤Î¤è¤¦¤Ê¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥à¤Îŵ·¿Åª¤ÊÎã¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
class Shape {
public: // Shape¤ÎÍøÍѼԤؤΥ¤¥ó¥¿¥Õ¥§¥¤¥¹
virtual void draw() const;
virtual void rotate(int degrees);
// ...
protected: // ¶¦Ḁ̈ǡ¼¥¿ (Shape¤Î¼ÂÁõ¼Ô¸þ¤±)
Point center;
Color col;
// ...
};
class Circle : public Shape {
public:
void draw() const;
void rotate(int) { }
// ...
protected:
int radius;
// ...
};
class Triangle : public Shape {
public:
void draw() const;
void rotate(int);
// ...
protected:
Point a, b, c;
// ...
};
¾åµ¤Î¥³¡¼¥É¤ÎÌÜŪ¤Ï¡¢ÍøÍѼԤÏShape¤Î¸ø³«¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤òÄ̤·¤Æ¿Þ·Á¤òÁàºî
¤·¡¢(Circle¤äTriangle¤Î¤è¤¦¤Ê)Ƴ½Ð¥¯¥é¥¹¤Î¼ÂÁõ¼Ô¤Ï¡¢protected¥á¥ó¥Ð¤Çɽ¸½
¤µ¤ì¤¿¼ÂÁõ¤Î¥¢¥¹¥Ú¥¯¥È¤ò¶¦Í¤¹¤ë¡¢¤È¤¤¤¦¤â¤Î¤Ç¤¹¡£
¤³¤Î°ì¸«Ã±½ã¤½¤¦¤Ê¹Í¤¨¤Ë¤Ï¡¢»°¤Ä¤Î½ÅÂç¤ÊÌäÂ꤬¤¢¤ê¤Þ¤¹¡£
¤·¤¿¤¬¤Ã¤Æ¡¢ÍøÍѼԤؤΥ¤¥ó¥¿¥Õ¥§¥¤¥¹¤È¤·¤Æ¤ÎƯ¤¤â¤¹¤ë´ðÄ쥯¥é¥¹¤Î¡Ö¼ÂÁõ ¼Ô¤ËÍÍѤʾðÊó¡×¤Ï¡¢¼ÂÁõ¤ÎÉÔ°ÂÄꤵ¡¢(¼ÂÁõ¾ðÊó¤¬ÊѤ俤Ȥ¤Î)ÍøÍѼԥ³¡¼¥É¤ÎÉÔÍ× ¤ÊºÆ¥³¥ó¥Ñ¥¤¥ë¡¢¤½¤·¤Æ¡¢ÍøÍѼԥ³¡¼¥É¤Ø¤Î¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î²á¾ê¤Ê¥¤¥ó¥¯¥ë¡¼¥É(¡Ö ¼ÂÁõ¼Ô¤ËÍÍѤʾðÊó¡×¤¬¤½¤ì¤é¤Î¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤òɬÍפȤ¹¤ë¤¿¤á)¤Î¸¶°ø¤È¤Ê¤ê¤Þ¤¹¡£ ¤³¤ì¤Ï¡ÖÉÔ°ÂÄê¤Ê´ðÄ쥯¥é¥¹ÌäÂê¡×¤È¤·¤Æ¤âÃΤé¤ì¤Æ¤¤¤Þ¤¹¡£
ÌÀ¤é¤«¤Ê²ò·èÊýË¡¤Ï¡¢¡Ö¼ÂÁõ¼Ô¤ËÍÍѤʾðÊó¡×¤òÍøÍѼԤؤΥ¤¥ó¥¿¥Õ¥§¥¤¥¹¤È¤·¤Æ »ÈÍѤµ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤«¤é¼è¤ê½ü¤¯¤³¤È¤Ç¤¹¡£¤Ä¤Þ¤ê¡¢¥¤¥ó¥¿¥Õ¥§¥¤¥¹¡¢½ã¿è¤Ê¥¤¥ó¥¿ ¥Õ¥§¥¤¥¹¤òºîÀ®¤¹¤ë¤Î¤Ç¤¹¡£¤½¤·¤Æ¡¢¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤òÃê¾Ý¥¯¥é¥¹¤Çɽ¸½¤¹¤ë¤Î¤Ç¤¹¡£
class Shape {
public: // Shape¤ÎÍøÍѼԤؤΥ¤¥ó¥¿¥Õ¥§¥¤¥¹
virtual void draw() const = 0;
virtual void rotate(int degrees) = 0;
virtual Point center() const = 0;
// ...
// ¥Ç¡¼¥¿¤Ê¤·
};
class Circle : public Shape {
public:
void draw() const;
void rotate(int) { }
Point center() const { return cent; }
// ...
protected:
Point cent;
Color col;
int radius;
// ...
};
class Triangle : public Shape {
public:
void draw() const;
void rotate(int);
Point center() const;
// ...
protected:
Color col;
Point a, b, c;
// ...
};
¤³¤ì¤Ç¡¢ÍøÍÑ¼Ô¤ÏÆ³½Ð¥¯¥é¥¹¤Î¼ÂÁõ¤ÎÊѹ¹¤Ë±Æ¶Á¤ò¼õ¤±¤Þ¤»¤ó¡£»ä¤Ï¤³¤Î¥Æ¥¯¥Ë¥Ã¥¯
¤Ç¡¢¥Ó¥ë¥É²ó¿ô¤ò¿ô·å¸º¾¯¤µ¤»¤¿¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
¤·¤«¤·¤Ê¤¬¤é¡¢¤¹¤Ù¤Æ¤Î(¤¢¤ë¤¤¤Ïñ¤Ë¤¤¤¯¤Ä¤«¤Î)Ƴ½Ð¥¯¥é¥¹¤Ë¶¦Ä̤ʾðÊó¤¬ ¼ÂºÝ¤Ë¤¢¤ë¤È¤·¤¿¤é¤É¤¦¤Ç¤·¤ç¤¦¤«¡£¤½¤Î¾ì¹ç¤Ï¡¢Ã±½ã¤Ë¤½¤Î¾ðÊó¤ò¥¯¥é¥¹¤Ë¤·¤Æ¡¢ ¤½¤Î¥¯¥é¥¹¤«¤é¤â·Ñ¾µ¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£
class Shape {
public: // Shape¤ÎÍøÍѼԤؤΥ¤¥ó¥¿¥Õ¥§¥¤¥¹
virtual void draw() const = 0;
virtual void rotate(int degrees) = 0;
virtual Point center() const = 0;
// ...
// ¥Ç¡¼¥¿¤Ê¤·
};
struct Common {
Color col;
// ...
};
class Circle : public Shape, protected Common {
public:
void draw() const;
void rotate(int) { }
Point center() const { return cent; }
// ...
protected:
Point cent;
int radius;
};
class Triangle : public Shape, protected Common {
public:
void draw() const;
void rotate(int);
Point center() const;
// ...
protected:
Point a, b, c;
};
¤½¤ÎɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤ÎÃæ¤Ë¥Ç¡¼¥¿¤òÃÖ¤¤¿¤¯¤Ê¤¤¤Ê¤é¡¢¥¤¥ó¥¿ ¥Õ¥§¥¤¥¹¤òÄêµÁ¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Ë¤½¤Î¥Ç¡¼¥¿¤òÃÖ¤«¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£Âå¤ï¤ê¤ËƳ½Ð ¥¯¥é¥¹¤ËÃÖ¤¤¤Æ¤¯¤À¤µ¤¤¡£¤Ê¤¼¥³¥ó¥Ñ¥¤¥ë¤Ë¤³¤ó¤Ê¤Ë »þ´Ö¤¬¤«¤«¤ë¤Î¤Ç¤·¤ç¤¦¤«¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
»þ¤Ë¤Ï¡¢¥¯¥é¥¹¤ÎÃæ¤Ë¥Ç¡¼¥¿É½¸½¤òÃÖ¤¤¿¤¯¤Ê¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¡£ ¼¡¤ÎÊ£ÁÇ¿ô¥¯¥é¥¹¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
template<class Scalar> class complex {
public:
complex() : re(0), im(0) { }
complex(Scalar r) : re(r), im(0) { }
complex(Scalar r, Scalar i) : re(r), im(i) { }
// ...
complex& operator+=(const complex& a)
{ re+=a.re; im+=a.im; return *this; }
// ...
private:
Scalar re, im;
};
¤³¤Î·¿¤Ï¡¢ÁȤ߹þ¤ß·¿¤È¤Û¤ÜƱ¤¸¤è¤¦¤Ë»ÈÍѤµ¤ì¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£½ã¿è¤Ê
¥í¡¼¥«¥ë¥ª¥Ö¥¸¥§¥¯¥È(¤Ä¤Þ¤ê¡¢¥Ò¡¼¥×¾å¤Ç¤Ï¤Ê¤¯¡¢¥¹¥¿¥Ã¥¯¾å¤Ë³ä¤êÅö¤Æ¤é¤ì¤ë
¥ª¥Ö¥¸¥§¥¯¥È)¤¬À¸À®¤Ç¤¤Æ¡¢Ã±½ã¤Ê±é»»¤¬Å¬Àڤ˥¤¥ó¥é¥¤¥ó²½¤µ¤ì¤ë¤³¤È¤òÊݾڤ¹¤ë
¤¿¤á¤Ë¡¢Àë¸À¤ÎÃæ¤Ë¥Ç¡¼¥¿É½¸½¤¬É¬Íפˤʤê¤Þ¤¹¡£½ã¿è¤Ê¥í¡¼¥«¥ë¥ª¥Ö¥¸¥§¥¯¥È¤È
¥¤¥ó¥é¥¤¥ó²½¤Ï¡¢Ê£ÁÇ¿ô¥¯¥é¥¹¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸À¸ì¤ËÁȤ߹þ¤ß¤ÎÊ£ÁÇ¿ô·¿¤Ë
¶á¤Å¤±¤ë¤Î¤Ë·ç¤«¤»¤Þ¤»¤ó¡£
¿¤¯¤Î¥¯¥é¥¹¤¬´ðÄ쥯¥é¥¹¤È¤·¤Æ»È¤ï¤ì¤ë¤è¤¦¤ËÀ߷פµ¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¤«¤é¤Ç¤¹¡£ Îã¤È¤·¤Æ¡¢Ê£ÁÇ¿ô¥¯¥é¥¹¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¤Þ¤¿¡¢²¾ÁÛ´Ø¿ô¤ò»ý¤Ä¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢²¾ÁÛ´Ø¿ô¸Æ¤Ó½Ð¤·¥á¥«¥Ë¥º¥à¤Ë ɬÍפʥá¥â¥ê¶õ´Ö¤òɬÍפȤ·¤Þ¤¹(°ìÈÌŪ¤Ë¤Ò¤È¤Ä¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ·¤Æ1¥ï¡¼¥É ɬÍפˤʤë)¡£¤³¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬½ÅÂç¤Ç¤¢¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¤·¡¢Â¾¤Î¸À¸ì(¤¿¤È¤¨ ¤ÐC¤ÈFortran)¤Î¥Ç¡¼¥¿¤È¤Î¥á¥â¥ê¥ì¥¤¥¢¥¦¥È¤Î¸ß´¹À¤ÎÌäÂê¤Ë¤Ê¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¡£
À߷פÎÍýÏÀŪº¬µò¤Ë¤Ä¤¤¤Æ¤Ï¡¢C++¤ÎÀ߷פȿʲ½¤ò»²¾È¤·¤Æ ¤¯¤À¤µ¤¤¡£
²¾Á۸ƤӽФ·(virtual call)¤Ï¡¢ÉÔ´°Á´¤Ê¾ðÊó¤ò¤â¤È¤Ëưºî¤¹¤ë»ÅÁȤߤǤ¹¡£ ¶ñÂÎŪ¤Ë¸À¤¦¤È¡¢"virtual"¤ò»È¤¦¤³¤È¤Ç¡¢¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤À¤±¤¬Ê¬¤«¤Ã¤Æ¤¤¤Æ¡¢ ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀµ³Î¤Ê·¿¤¬Ê¬¤«¤é¤Ê¤¤´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤¤Þ¤¹¡£ ¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢¾ðÊ󤬤¹¤Ù¤ÆÂ·¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ÆÃ¤Ë¡¢ À¸À®¤·¤¿¤¤¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀµ³Î¤Ê·¿¤òÃΤäƤ¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¡Ö¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¸Æ¤Ó½Ð¤·¡×¤ò²¾ÁÛ(virtual)¤Ë¤¹¤ë¤³¤È¤Ï¤Ç¤ ¤Þ¤»¤ó¡£
¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤Ë´ÖÀÜŪ¤ÊÊýË¡¤ò»ÈÍѤ¹¤ë¥Æ¥¯¥Ë¥Ã¥¯¤Ï¤è¤¯¡¢²¾ÁÛ¥³¥ó¥¹¥È ¥é¥¯¥¿¤È¸Æ¤Ð¤ì¤Æ¤¤¤Þ¤¹¡£¤½¤ÎÎã¤Ï¡¢¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++Âè3ÈǤÎ15.6.2¤ò»²¾È ¤·¤Æ¤¯¤À¤µ¤¤¡£
¤¿¤È¤¨¤Ð¡¢°Ê²¼¤Ë¼¨¤¹¤Î¤Ï¡¢Ãê¾Ý¥¯¥é¥¹¤ò»ÈÍѤ·¤ÆÅ¬Àڤʷ¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò À¸À®¤¹¤ë¥Æ¥¯¥Ë¥Ã¥¯¤Ç¤¹¡£
struct F { // ¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®´Ø¿ô¤Ø¤Î¥¤¥ó¥¿¥Õ¥§¥¤¥¹
virtual A* make_an_A() const = 0;
virtual B* make_a_B() const = 0;
};
void user(const F& fac)
{
A* p = fac.make_an_A(); // ŬÀڤʷ¿¤Î A ¤òÀ¸À®¤¹¤ë
B* q = fac.make_a_B(); // ŬÀڤʷ¿¤Î B ¤òÀ¸À®¤¹¤ë
// ...
}
struct FX : F {
A* make_an_A() const { return new AX(); } // AX ¤Ï A ¤«¤éƳ½Ð¤µ¤ì¤Æ¤¤¤ë
B* make_a_B() const { return new BX(); } // BX ¤Ï B ¤«¤éƳ½Ð¤µ¤ì¤Æ¤¤¤ë
};
struct FY : F {
A* make_an_A() const { return new AY(); } // AY ¤Ï A ¤«¤éƳ½Ð¤µ¤ì¤Æ¤¤¤ë
B* make_a_B() const { return new BY(); } // BY ¤Ï B ¤«¤éƳ½Ð¤µ¤ì¤Æ¤¤¤ë
};
int main()
{
FX x;
FY y;
user(x); // ¤³¤Îuser¤ÏAX¤ÈBX¤òÀ¸À®¤¹¤ë
user(y); // ¤³¤Îuser¤ÏAY¤ÈBY¤òÀ¸À®¤¹¤ë
user(FX()); // ¤³¤Îuser¤ÏAX¤ÈBX¤òÀ¸À®¤¹¤ë
user(FY()); // ¤³¤Îuser¤ÏAY¤ÈBY¤òÀ¸À®¤¹¤ë
// ...
}
¤³¤ì¤Ï¡¢¡Ö¥Õ¥¡¥¯¥È¥ê¥Ñ¥¿¡¼¥ó¡×¤È¸Æ¤Ð¤ì¤ë¤â¤Î¤Î°ì¼ï¤Ç¤¹¡£
¥Ý¥¤¥ó¥È¤Ï¡¢user()¤Ï AX ¤ä AY ¤Î¤è¤¦¤Ê¥¯¥é¥¹¤Î¾ðÊó¤È¤Ï´°Á´¤ËÀÚ¤êÎ¥¤µ¤ì¤Æ¤¤¤ë
¤È¤¤¤¦¤È¤³¤í¤Ç¤¹¡£
¿¤¯¤Î¥¯¥é¥¹¤¬´ðÄ쥯¥é¥¹¤È¤·¤Æ»È¤ï¤ì¤ë¤è¤¦¤ËÀ߷פµ¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¤«¤é¤Ç¤¹¡£ ²¾ÁÛ´Ø¿ô¤Ï¡¢Æ³½Ð¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤ÎƯ¤¤ò¤¹¤ë¥¯¥é¥¹¤ÎÃæ ¤Ç¤À¤±°ÕÌ£¤ò¤Ê¤·¤Þ¤¹(¤½¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï°ìÈÌŪ¤Ë¡¢¥Ò¡¼¥×¾å¤Ë³ä¤êÅö¤Æ¤é¤ì¡¢ ¥Ý¥¤¥ó¥¿¤«¥ê¥Õ¥¡¥ì¥ó¥¹¤òÄ̤·¤Æ¥¢¥¯¥»¥¹¤µ¤ì¤ë)¡£
¤½¤ì¤Ç¤Ï¡¢¤¤¤Ä¥Ç¥¹¥È¥é¥¯¥¿¤ò²¾ÁÛ´Ø¿ô¤ÈÀë¸À¤·¤¿¤é¤è¤¤¤Î¤Ç¤·¤ç¤¦¤«¡£¥¯¥é¥¹ ¤Ë¾¯¤Ê¤¯¤È¤â¤Ò¤È¤Ä²¾ÁÛ´Ø¿ô¤¬¤¢¤ë¤È¤¤Ï¤¤¤Ä¤Ç¤â¤½¤¦¤·¤Æ¤¯¤À¤µ¤¤¡£¥¯¥é¥¹¤Ë²¾ÁÛ ´Ø¿ô¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤Ï¡¢¤½¤Î¥¯¥é¥¹¤¬Æ³½Ð¥¯¥é¥¹¤Ø¤Î¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤ÎƯ¤¤ò¤¹¤ë ¤³¤È¤Î¤·¤ë¤·¤Ç¤¢¤ê¡¢¤½¤Î¾ì¹ç¤Ï¡¢Æ³½Ð¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢´ðÄ쥯¥é¥¹¤Î ¥Ý¥¤¥ó¥¿¤ò²ð¤·¤Æ²òÂΤµ¤ì¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£ ¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¡¼¥É¤ò¸«¤Æ¤¯¤À¤µ¤¤¡£
class Base {
// ...
virtual ~Base();
};
class Derived : public Base {
// ...
~Derived();
};
void f()
{
Base* p = new Derived;
delete p; // ~Derived¤¬³Î¼Â¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë¤è¤¦¤Ë²¾Áۥǥ¹¥È¥é¥¯¥¿¤¬»È¤ï¤ì¤ë
}
Base¤Î¥Ç¥¹¥È¥é¥¯¥¿¤¬²¾ÁÛ´Ø¿ô¤Ç¤Ê¤«¤Ã¤¿¤é¡¢Derived¤Î¥Ç¥¹¥È¥é¥¯¥¿¤Ï¸Æ¤Ó½Ð¤µ¤ì
¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢Derived¤Î¥ª¥Ö¥¸¥§¥¯¥È¤¬½êͤ¹¤ë¥ê¥½¡¼¥¹¤¬²òÊü¤µ¤ì¤Ê¤¤¤È¤¤¤¦
¤è¤¦¤Ê¡¢°¤¤±Æ¶Á¤ò¤â¤¿¤é¤¹¤³¤È¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£
½ã¿è²¾ÁÛ´Ø¿ô¤È¤Ï¡¢Æ³½Ð¥¯¥é¥¹¤Ç¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤´Ø¿ô¤Ç¡¢ ÄêµÁ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£²¾ÁÛ´Ø¿ô¤Ï¡¢"=0"¤È¤¤¤¦´ñ̯¤Ê¹½Ê¸¤ò»ÈÍѤ·¤Æ ¡Ö½ã¿è(pure)¡×¤Ç¤¢¤ë¤ÈÀë¸À¤µ¤ì¤Þ¤¹¡£¼¡¤ÎÎã¤ò¸«¤Æ¤¯¤À¤µ¤¤¡£
class Base {
public:
void f1(); // ²¾ÁÛ´Ø¿ô¤Ç¤Ï¤Ê¤¤
virtual void f2(); // ²¾ÁÛ´Ø¿ô¤Ç¤¢¤ë¤¬¡¢½ã¿è²¾ÁÛ´Ø¿ô¤Ç¤Ï¤Ê¤¤
virtual void f3() = 0; // ½ã¿è²¾ÁÛ´Ø¿ô
};
Base b; // ¥¨¥é¡¼: ½ã¿è²¾ÁÛ´Ø¿ô f3 ¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Æ¤¤¤Ê¤¤
¤³¤³¤Ç¡¢Base¤Ï(½ã¿è²¾ÁÛ´Ø¿ô¤ò»ý¤Ä¤¿¤á)Ãê¾Ý¥¯¥é¥¹¤Ë¤Ê¤ë¤Î¤Ç¡¢Base¥¯¥é¥¹¤Î
¥ª¥Ö¥¸¥§¥¯¥È¤òľÀÜÀ¸À®¤¹¤ë¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£¤Ä¤Þ¤ê¡¢Base¤Ï(ÌÀ¼¨Åª¤Ë)´ðÄì
¥¯¥é¥¹¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤ò¸«¤Æ¤¯¤À¤µ¤¤¡£
class Derived : public Base {
// f1¤Ê¤·: ÌäÂê¤Ê¤·
// f2¤Ê¤·: ÌäÂê¤Ê¤·¡£Base::f2¤«¤é·Ñ¾µ¤¹¤ë
void f3();
};
Derived d; // OK: Derived::f3¤ÏBase::f3¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ë
Ãê¾Ý¥¯¥é¥¹¤Ï¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤òÄêµÁ¤¹¤ë¤Î¤Ë¤È¤Æ¤âÌòΩ¤Á¤Þ¤¹¡£¼ÂºÝ¡¢½ã¿è²¾ÁÛ´Ø¿ô
¤À¤±¤ò»ý¤Ä¥¯¥é¥¹¤Ï¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤È¤è¤¯¸Æ¤Ð¤ì¤Þ¤¹¡£
½ã¿è²¾ÁÛ´Ø¿ô¤ÏÄêµÁ¤Ç¤¤Þ¤¹¡£
Base::f3() { /* ... */ }
¤³¤ì¤Ï(Ƴ½Ð¥¯¥é¥¹¤Ëñ½ã¤Ç¶¦Ä̤ʼÂÁõ¤òÄ󶡤¹¤ë¤Î¤Ë)»þÀÞÌòΩ¤Á¤Þ¤¹¡£¤·¤«¤·¡¢
Ƴ½Ð¥¯¥é¥¹¤Ç¤Ï°ÍÁ³¤È¤·¤Æ¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
Ƴ½Ð¥¯¥é¥¹¤Ç½ã¿è²¾ÁÛ´Ø¿ô¤òÄêµÁ¤·¤Ê¤¤¾ì¹ç¡¢¤½¤ÎƳ½Ð¥¯¥é¥¹¤ÏÃê¾Ý¥¯¥é¥¹¤Ë ¤Ê¤ê¤Þ¤¹¡£
class D2 : public Base {
// f1¤Ê¤·: ÌäÂê¤Ê¤·
// f2¤Ê¤·: ÌäÂê¤Ê¤·¡£Base::f2¤«¤é·Ñ¾µ¤¹¤ë
// f3¤Ê¤·: ÌäÂê¤Ê¤¤¤¬¡¢D2 ¤ÏÃê¾Ý¥¯¥é¥¹¤Î¤Þ¤Þ
};
D2 d; // ¥¨¥é¡¼: ½ã¿è²¾ÁÛ´Ø¿ôBase::f3¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Æ¤¤¤Ê¤¤
½½Ê¬¤ÊɬÍ×À¤¬¤¢¤ë¤è¤¦¤Ë¤Ï»×¤¨¤Þ¤»¤ó(¤Ç¤·¤¿)¡£
¤Ç¤¤Þ¤¹¤¬¡¢Ãí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤¢¤Ê¤¿¤¬´üÂÔ¤·¤¿Ä̤ê¤Ë¤Ïưºî¤·¤Ê¤¤¤«¤â¤·¤ì ¤Þ¤»¤ó¡£¥³¥ó¥¹¥È¥é¥¯¥¿¤Î½èÍýÃæ¤Ï¡¢Æ³½Ð¥¯¥é¥¹¤Î¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¬¤Þ¤À¤µ¤ì¤Æ ¤¤¤Ê¤¤¾õÂ֤ʤΤǡ¢²¾Á۸ƤӽФ·¥á¥«¥Ë¥º¥à¤Ï̵¸ú¤Ë¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Ï ´ðÄ쥯¥é¥¹¤«¤é¹½ÃÛ¤µ¤ì¤Þ¤¹¡£¡ÖƳ½Ð¥¯¥é¥¹¤ÎÁ°¤Ë´ðÄ쥯¥é¥¹¡×¤Ç¤¹¡£
¼¡¤ÎÎã¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
#include<string>
#include<iostream>
using namespace std;
class B {
public:
B(const string& ss) { cout << "B constructor\n"; f(ss); }
virtual void f(const string&) { cout << "B::f\n";}
};
class D : public B {
public:
D(const string & ss) :B(ss) { cout << "D constructor\n";}
void f(const string& ss) { cout << "D::f\n"; s = ss; }
private:
string s;
};
int main()
{
D d("Hello");
}
¤³¤Î¥×¥í¥°¥é¥à¤Ï¼¡¤Î¤è¤¦¤Ë½ÐÎϤ·¤Þ¤¹¡£
B constructor B::f D constructorD::f¤Ç¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ¤â¤·µ¬Â§¤¬°Û¤Ê¤ê¡¢B::B()¤«¤éD::f()¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¤·¤¿¤é¤É¤¦¤Ê¤ë¤«¹Í¤¨¤Æ¤ß¤Æ ¤¯¤À¤µ¤¤¡£¥³¥ó¥¹¥È¥é¥¯¥¿D::D()¤Ï¤Þ¤À¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç¡¢D::f()¤Ï°ú¿ô¤ò¤Þ¤À ½é´ü²½¤µ¤ì¤Æ¤¤¤Ê¤¤string s¤ËÂåÆþ¤·¤è¤¦¤È¤¹¤ë¤Ç¤·¤ç¤¦¡£¤½¤Î·ë²Ì¡¢¤ª¤½¤é¤¯¤¹¤°¤Ë ¥¯¥é¥Ã¥·¥å¤¹¤ë¤Ç¤·¤ç¤¦¡£
¥ª¥Ö¥¸¥§¥¯¥È¤Î²òÂΤϡִðÄ쥯¥é¥¹¤ÎÁ°¤ËƳ½Ð¥¯¥é¥¹¡×¤Î½ç¤Ç¹Ô¤ï¤ì¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢²¾ÁÛ´Ø¿ô¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ÎÃæ¤ÈƱ¤¸¤è¤¦¤Ë¿¶¤ëÉñ¤¤¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢ ¥í¡¼¥«¥ë¤ÊÄêµÁ¤À¤±¤¬»ÈÍѤµ¤ì¤Þ¤¹ - (º£²òÂΤµ¤ì¤Æ¤¤¤ë)¥ª¥Ö¥¸¥§¥¯¥È¤ÎƳ½Ð¥¯¥é¥¹ ¤ÎÉôʬ¤Ë¿¨¤ì¤Ê¤¤¤è¤¦¤Ë¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤¿´Ø¿ô¤Ø¤Î¸Æ¤Ó½Ð¤·¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£
¾ÜºÙ¤Ï¡¢C++¤ÎÀß·×¤È ¿Ê²½¤Î13.2.4.2¡¢ ¤¢¤ë¤¤¤Ï¥×¥í¥°¥é¥ß¥ó¥° ¸À¸ìC++Âè3ÈǤÎ15.4.3¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤Îµ¬Â§¤Ï¼ÂÁõ¤¬ºî¤ê½Ð¤·¤¿¤â¤Î¤À¤È¸À¤ï¤ì¤¿¤³¤È¤¬¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤¦¤Ç¤Ï¤¢¤ê ¤Þ¤»¤ó¡£¼ÂºÝ¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤«¤é¤Î²¾ÁÛ´Ø¿ô¸Æ¤Ó½Ð¤·¤ò¾¤Î´Ø¿ô¤«¤é¤Î¸Æ¤Ó½Ð¤·¤È ¤Þ¤Ã¤¿¤¯Æ±¤¸¤è¤¦¤Ë¤¹¤ë¤È¤¤¤¦¡¢°ÂÁ´¤Ç¤Ê¤¤µ¬Â§¤ò¼ÂÁõ¤¹¤ë¤³¤È¤ÏÈó¾ï¤Ë´Êñ¤Ç¤·¤ç¤¦¡£ ¤·¤«¤·¡¢¤½¤ì¤Ï´ðÄ쥯¥é¥¹¤Ç³ÎΩ¤µ¤ì¤¿ÉÔÊѾò·ï¤Ë°Í¸¤·¤Æ²¾ÁÛ´Ø¿ô¤ò½ñ¤±¤Ê¤¤¤È¤¤¤¦ ¤³¤È¤ò°Å¤Ë¼¨¤·¤Æ¤¤¤Þ¤¹¡£¤½¤ì¤Ï¤È¤ó¤Ç¤â¤Ê¤¤¤³¤È¤Ç¤¹¡£
¤Ç¤¤Þ¤¹¤¬¡¢¤Ê¤¼¤½¤¦¤·¤¿¤¤¤Î¤Ç¤·¤ç¤¦¤«¡£°ìÈÌŪ¤Ë¤Õ¤¿¤Ä¤ÎÍýͳ¤¬¤¢¤ê¤Þ¤¹¡£
²¾ÁÛ´Ø¿ô¸Æ¤Ó½Ð¤·¤òÈò¤±¤ë¤¿¤á¤Ë¥¯¥é¥¹³¬ÁؤˡÖÀ©¸Â¡×¤òÀߤ±¤ëɬÍ×À¤¬ËÜÅö¤Ë ¤¢¤ë¤Ê¤é¡¢¤½¤â¤½¤â¤Ê¤¼²¾ÁÛ´Ø¿ô¤Ë¤¹¤ë¤Î¤«¤È¸À¤¦¿Í¤¬¤¤¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£»ä¤Ï¡¢ ¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬½ÅÍפʴؿô¤òÂ礷¤¿Íýͳ¤â¤Ê¤¯Ã±¤Ë¡Ö¤¤¤Ä¤â¤½¤¦¤·¤Æ¤¤¤ë¤«¤é¡× ¤È¤¤¤¦¤À¤±¤Ç²¾ÁÛ´Ø¿ô¤Ë¤·¤Æ¤¤¤ëÎã¤ò¸«¤¿¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
¤â¤¦°ìÊý¤Î¡¢ÏÀÍýŪ¤ÊÍýͳ¤¬¤¢¤Ã¤ÆÆ³½Ð¤µ¤»¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¡¢¤È¤¤¤¦ÌäÂê¤Ë¤Ï ²ò·èÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£»Äǰ¤Ê¤¬¤é¡¢¤½¤ÎÊýË¡¤ÏÈþ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£¤½¤ì¤Ï¡¢¥¯¥é¥¹ ³¬ÁØÃæ¤ÎºÇ²¼ÁØ¤ÎÆ³½Ð¥¯¥é¥¹¤Ï²¾ÁÛ´ðÄì¤ò¹½ÃÛ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ë °Í¸¤·¤Æ¤¤¤Þ¤¹¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
class Usable;
class Usable_lock {
friend class Usable;
private:
Usable_lock() {}
Usable_lock(const Usable_lock&) {}
};
class Usable : public virtual Usable_lock {
// ...
public:
Usable();
Usable(char*);
// ...
};
Usable a;
class DD : public Usable { };
DD dd; // ¥¨¥é¡¼: DD::DD()¤Ï¥×¥é¥¤¥Ù¡¼¥È¥á¥ó¥Ð¤Î
// Usable_lock::Usable_lock()¤Ë¥¢¥¯¥»¥¹¤Ç¤¤Ê¤¤
(C++¤ÎÀ߷פȿʲ½ 11.4.3¤è¤ê)
µÄÏÀ¤òñ½ã²½¤·¤Æ¤·¤Þ¤¤¤Þ¤·¤¿¤¬¡¢¤³¤ì¤ÏFAQ¤Ç¤¢¤Ã¤Æ¡¢³Ø½ÑÏÀʸ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
¤½¤ó¤Ê¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£Âå¤ï¤ê¤ÎÊýË¡¤òÍѤ¤¤ë¤³¤È¤Çñ°ì·Ñ¾µ¤¬¤Ê¤¯¤Æ¤â ¥×¥í¥°¥é¥ß¥ó¥°¤¬¤Ç¤¤ë¤Î¤ÈƱÍͤˡ¢Â¿½Å·Ñ¾µ¤¬¤Ê¤¯¤Æ¤â¥×¥í¥°¥é¥ß¥ó¥°¤Ç¤¤Þ¤¹¡£ ¤½¤ì¤É¤³¤í¤«¡¢¥¯¥é¥¹¤¹¤é¤Ê¤¯¤Æ¤â¥×¥í¥°¥é¥ß¥ó¥°¤Ç¤¤Þ¤¹¡£C¤¬¤½¤ì¤ò¾ÚÌÀ¤·¤Æ¤¤¤Þ¤¹¡£ ¤·¤«¤·¡¢ÀÅŪ·¿¸¡ºº¤È·Ñ¾µ¤ò»ý¤Ä¸½Âå¤Î¤É¤Î¸À¸ì¤â²¿¤é¤«¤Î·Á¼°¤Î¿½Å·Ñ¾µµ¡Ç½¤ò Ä󶡤·¤Æ¤¤¤Þ¤¹¡£C++¤Ç¤ÏÃê¾Ý¥¯¥é¥¹¤¬¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤È¤·¤Æ¤ÎÌò³ä¤ò¤·¤Ð¤·¤Ð²Ì¤·¡¢ ¥¯¥é¥¹¤Ï¿¤¯¤Î¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤ò»ý¤Ä¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¡Ö¿½Å·Ñ¾µ¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¡× ¤È¤ß¤Ê¤µ¤ì¤Æ¤¤¤ë¤½¤Î¾¤Î¸À¸ì¤Ç¤Ï¡¢½ã¿èÃê¾Ý¥¯¥é¥¹¤ËÁêÅö¤¹¤ë¤â¤Î¤ËÊÌ̾¤ò Í¿¤¨¤Æ¤¤¤ë¤À¤±¤Ç¤¹¡£¤½¤ì¤Ï¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤È¸Æ¤Ð¤ì¤Æ¤¤¤Þ¤¹¡£ ¸À¸ì¤¬·Ñ¾µ(ñ°ì·Ñ¾µ¤È¿½Å·Ñ¾µ¤ÎξÊý)¤òÄ󶡤¹¤ëÍýͳ¤Ï¡¢¸À¸ì¤¬¥µ¥Ý¡¼¥È¤¹¤ë ·Ñ¾µ¤Ï°ìÈÌŪ¤Ë¡¢·Ñ¾µ¤ò²óÈò¤¹¤ëÊýË¡(¤¿¤È¤¨¤Ð¡¢¥µ¥Ö¥ª¥Ö¥¸¥§¥¯¥È¤äÊÌ¡¹¤Ë³ä¤êÅö¤Æ ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Õ¥©¥ï¡¼¥Ç¥£¥ó¥°´Ø¿ô¤Î»ÈÍÑ)¤è¤ê¤â¡¢¥×¥í¥°¥é¥ß¥ó¥°¤ò ÍÆ°×¤Ë¤¹¤ë¤³¤È¤ä¡¢ÏÀÍýŪ¤Ê¸í¤ê¤ò¤ß¤Ä¤±¤ë¤³¤È¡¢Êݼé¤Î¤·¤ä¤¹¤µ¡¢¤½¤·¤Æ ¤·¤Ð¤·¤Ð¸úΨ¤ÎÅÀ¤ÇÍ¥¤ì¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£
¤³¤Î¼ÁÌä¤Ï(¿¤¯¤Î¥Ð¥ê¥¨¡¼¥·¥ç¥ó¤Ç)¤Õ¤Ä¤¦¼¡¤Î¤è¤¦¤Ê¥³¡¼¥ÉÎã¤Ç¼¨¤µ¤ì¤Þ¤¹¡£
#include<iostream>
using namespace std;
class B {
public:
int f(int i) { cout << "f(int): "; return i+1; }
// ...
};
class D : public B {
public:
double f(double d) { cout << "f(double): "; return d+1.3; }
// ...
};
int main()
{
D* pd = new D;
cout << pd->f(2) << '\n';
cout << pd->f(2.3) << '\n';
}
¤³¤ì¤Ï¼¡¤Î¤è¤¦¤Ë½ÐÎϤ·¤Þ¤¹¡£
f(double): 3.3 f(double): 3.6¤·¤«¤·¡¢¼¡¤Î¤è¤¦¤Ë½ÐÎϤµ¤ì¤ë¤È(¸í¤Ã¤Æ)ͽÁÛ¤¹¤ë¿Í¤â¤¤¤Þ¤¹¡£
f(int): 3 f(double): 3.6
Ê̤θÀ¤¤Êý¤ò¤¹¤ì¤Ð¡¢D ¤È B ¤Î´Ö¤Ë¤Ï¥ª¡¼¥Ð¡¼¥í¡¼¥É¤Î²ò·è¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ¥³¥ó¥Ñ¥¤¥é¤Ï D ¤Î¥¹¥³¡¼¥×¤òÄ´¤Ù¡¢´Ø¿ô"double f(double)"¤ò¤Ò¤È¤Ä¸«¤Ä¤±¡¢ ¤½¤ì¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£B ¤Î(ÊĤ¸¤¿)¥¹¥³¡¼¥×¤ËÏǤ蘆¤ì¤ë¤³¤È¤Ï·è¤·¤Æ¤¢¤ê¤Þ¤»¤ó¡£ C++¤Ç¤Ï¡¢¥¹¥³¡¼¥×¤ò¸Ù¤¤¤À¥ª¡¼¥Ð¡¼¥í¡¼¥É¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î°ìÈÌŪ¤Êµ¬Â§¤Ë ¤Ä¤¤¤Æ¤Ï¡¢Æ³½Ð¥¯¥é¥¹¤Î¥¹¥³¡¼¥×¤âÎã³°¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó(¾ÜºÙ¤Ï¡¢C++¤ÎÀ߷פȿʲ½¡¢ ¤¢¤ë¤¤¤Ï¥×¥í¥°¥é¥ß¥ó¥° ¸À¸ìC++Âè3ÈǤò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£
¤·¤«¤·¡¢´ðÄ쥯¥é¥¹¤ÈƳ½Ð¥¯¥é¥¹¤«¤é¤¹¤Ù¤Æ¤Îf()¤ò¥ª¡¼¥Ð¡¼¥í¡¼¥É¤·¤¿¤¤¤È ¤·¤¿¤é¤É¤¦¤¹¤ë¤Î¤Ç¤·¤ç¤¦¤«¡£¤½¤ì¤Ï¡¢usingÀë¸À¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç´Êñ¤Ë¹Ô¤¨¤Þ¤¹¡£
class D : public B {
public:
using B::f; // B¤Î¤¹¤Ù¤Æ¤Îf()¤òÍøÍѲÄǽ¤Ë¤¹¤ë
double f(double d) { cout << "f(double): "; return d+1.3; }
// ...
};
¾åµ¤Î¤è¤¦¤ËÊѹ¹¤¹¤ë¤È¡¢¼¡¤Î¤è¤¦¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£
f(int): 3 f(double): 3.6¥ª¡¼¥Ð¡¼¥í¡¼¥É¤Î²ò·è¤Ï¡¢ºÇ¤âŬ¤·¤¿f()¤òÁªÂò¤¹¤ë¤¿¤á¤Ë¡¢B¤Îf()¤ÈD¤Îf()¤ËŬÍÑ ¤µ¤ì¤Þ¤·¤¿¡£
¤Þ¤¢»È¤¨¤ë¤Ç¤·¤ç¤¦¤¬¡¢¤ä¤ß¤¯¤â¤Ë»ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£Â¾¤Ë¤â¤Ã¤È¤è¤¤ ÊýË¡¤¬¤¢¤ë¤³¤È¤ÎÊý¤¬Â¿¤¤¤Ç¤¹¡£¼¡¤Î¥³¡¼¥É¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
void compute(cmplx z, double d)
{
cmplx z2 = z+d; // C++¥¹¥¿¥¤¥ë
z2 = f(z2); // z2¤ò»ÈÍѤ¹¤ë
cmplx& z3 = *new cmplx(z+d); // Java¥¹¥¿¥¤¥ë(Java¤¬ + ±é»»»Ò¤ò¥ª¡¼¥Ð¡¼¥í¡¼¥É¤Ç¤¤ë¤È²¾Äê)
z3 = f(z3);
delete &z3;
}
z3¤ËÂФ¹¤ë"new"¤Î»ÈÍѤϤ®¤³¤Á¤Ê¤¯¡¢ÌµÂ̤Ǥ¢¤ê¡¢¥í¡¼¥«¥ëÊÑ¿ô¤Î´·ÍÑŪ¤Ê »È¤¤Êý(z2)¤ÈÈæ¤Ù¤Æ¤âÃÙ¤¯¤Ê¤ê¤Þ¤¹¡£Æ±¤¸¥¹¥³¡¼¥×¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤ò"delete"¤¹¤ë ¤Î¤Ç¤¢¤ì¤Ð¡¢¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤Ë"new"¤ò»ÈÍѤ¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤½¤Î¤è¤¦¤Ê ¥ª¥Ö¥¸¥§¥¯¥È¤Ï¥í¡¼¥«¥ëÊÑ¿ô¤Ë¤¹¤Ù¤¤Ç¤¹¡£
¤¤¤¨¡¢¤Ç¤¤Þ¤¹¡£¤½¤ÎÊýË¡¤Ï¤È¤Æ¤â´Êñ¤Ç°ìÈÌŪ¤Ç¤¹¡£
¼¡¤Î¥³¡¼¥É¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
template<class Container>
void draw_all(Container& c)
{
for_each(c.begin(),c.end(),mem_fun(&Shape;::draw));
}
¤â¤··¿¥¨¥é¡¼¤¬¤¢¤ë¤È¤¹¤ì¤Ð¡¢¤½¤ì¤Ï¤«¤Ê¤êÊ£»¨¤Êfor_each()¸Æ¤Ó½Ð¤·¤Î²ò·è¤ÎÃæ¤Ë
¤¢¤ë¤Ï¤º¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Æ¥Ê¤ÎÍ×ÁǤη¿¤¬int¤Ç¤¢¤ë¾ì¹ç¡¢for_each()¸Æ¤Ó½Ð¤·
¤Ë´ØÏ¢¤·¤¿¤¢¤ë¼ï¤Î¤ï¤«¤ê¤Ë¤¯¤¤¥¨¥é¡¼¤¬µ¯¤³¤ê¤Þ¤¹(int¤ËÂФ·¤ÆShape::draw()¤ò
µ¯Æ°¤Ç¤¤Ê¤¤¤¿¤á)¡£
¤³¤Î¤è¤¦¤Ê¥¨¥é¡¼¤òÁᤤÃʳ¬¤Ç¸«¤Ä¤±¤ë¤¿¤á¤Ë¡¢¼¡¤Î¤è¤¦¤Ë½ñ¤¯¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
template<class Container>
void draw_all(Container& c)
{
Shape* p = c.front(); // Shape*¤Î¥³¥ó¥Æ¥Ê¤À¤±¼õ¤±Æþ¤ì¤ë
for_each(c.begin(),c.end(),mem_fun(&Shape;::draw));
}
²¾¤ÎÊÑ¿ô p ¤ò½é´ü²½¤¹¤ë¤³¤È¤Ç¡¢ºÇ¿·¤Î¥³¥ó¥Ñ¥¤¥é¤Î¿¤¯¤ÏÍý²ò¤·¤ä¤¹¤¤¥¨¥é¡¼
¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥È¥ê¥Ã¥¯¤Ï¡¢¤¢¤é¤æ¤ë¸À¸ì¤Ç¤è¤¯
ÍѤ¤¤é¤ì¤Æ¤¤¤Æ¡¢¿·¤·¤¤¹½Ê¸¤Î¤¿¤á¤Ë¤Ïºî¤é¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤â¤Î¤Ç¤¹¡£
¥×¥í¥À¥¯¥·¥ç¥ó¥³¡¼¥É¤ÎÃæ¤Ç¤Ï¡¢»ä¤Ï¤ª¤½¤é¤¯¼¡¤Î¤è¤¦¤Ë½ñ¤¯¤Ç¤·¤ç¤¦¡£
template<class Container>
void draw_all(Container& c)
{
typedef typename Container::value_type T;
Can_copy<T,Shape*>(); // Shape*¤À¤±¤Î¥³¥ó¥Æ¥Ê¤ò¼õ¤±Æþ¤ì¤ë
for_each(c.begin(),c.end(),mem_fun(&Shape;::draw));
}
¤³¤ì¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤·¤Æ¤¤¤ë¤³¤È¤¬¤Ï¤Ã¤¤ê¤·¤Þ¤¹¡£
Can_copy¥Æ¥ó¥×¥ì¡¼¥È¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤¤Þ¤¹¡£
template<class T1, class T2> struct Can_copy {
static void constraints(T1 a, T2 b) { T2 c = a; b = a; }
Can_copy() { void(*p)(T1,T2) = constraints; }
};
Can_copy¤Ï¡¢T1¤¬T2¤ËÂåÆþ¤Ç¤¤ë¤³¤È¤ò(¥³¥ó¥Ñ¥¤¥ë»þ¤Ë)¸¡ºº¤·¤Þ¤¹¡£
Can_copy<T,Shape*>¤Ï¡¢T ¤¬Shape*¤Ç¤¢¤ë¤«¡¢Shape¤«¤épublic·Ñ¾µ¤·¤¿¥¯¥é¥¹
¤Î¥Ý¥¤¥ó¥¿¤«¡¢Shape*¤Ø¤Î¥æ¡¼¥¶ÄêµÁ¤ÎÊÑ´¹¤ò»ý¤Ä·¿¤Ç¤¢¤ë¤«¤ò¸¡ºº¤·¤Þ¤¹¡£
ÄêµÁ¤ÏºÇ¾®¸Â¤Ë¶á¤¤¤³¤È¤ËÃíÌܤ·¤Æ¤¯¤À¤µ¤¤¡£³Æ¹Ô¤Ï°Ê²¼¤Î¤³¤È¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£
¤µ¤é¤Ë¡¢¤³¤ÎÄêµÁ¤Ë¤Ï¼¡¤Î¤è¤¦¤Ê¹¥¤Þ¤·¤¤ÆÃÀ¤¬¤¢¤ê¤Þ¤¹¡£
¤½¤ì¤Ç¤Ï¡¢¤Ê¤¼Can_copy()¤Î¤è¤¦¤Ê(¤¢¤ë¤¤¤Ï¤â¤Ã¤È´Ê·é¤Ê)¤â¤Î¤¬¸À¸ì¤Ë´Þ¤Þ¤ì¤Æ ¤¤¤Ê¤¤¤Î¤Ç¤·¤ç¤¦¤«¡£C++¤Î À߷פȿʲ½¤Ë¤Ï¡¢°ìÈÌŪ¤ÊÀ©Ìó¤òɽ¸½¤¹¤ë¤³¤È¤ÎÆñ¤·¤µ¤Ë´Ø¤¹¤ëʬÀϤ¬´Þ¤Þ¤ì¤Æ ¤¤¤Þ¤¹¡£¤½¤ì°ÊÍè¡¢¤³¤ì¤é¤ÎÀ©Ì󥯥饹¤ò´Êñ¤Ë½ñ¤±¤Æ¡¢Ê¬¤ê¤ä¤¹¤¤¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸ ¤ò½ÐÎϤ¹¤ë¡¢Â¿¤¯¤Î¥¢¥¤¥Ç¥¢¤¬½Ð¤Æ¤¤Þ¤·¤¿¡£¤¿¤È¤¨¤Ð¡¢ÀèÄø¤ÎCan_copy¤ÎÃæ¤Ç¹Ô¤Ã¤¿ ´Ø¿ô¥Ý¥¤¥ó¥¿¤ò»ÈÍѤ¹¤ëÊýË¡¤Ï¡¢Alex Stepanov¤ÈJeremy Siek¤¬¹Í¤¨¤À¤·¤¿¤â¤Î¤À¤È »×¤¤¤Þ¤¹¡£Can_copy¤¬É¸½à¤Ë¤Ê¤ë¤Ë¤Ï¤Þ¤ÀÁᤤ¤È»×¤¤¤Þ¤¹¡£¤â¤Ã¤È»ÈÍѤµ¤ì¤ëɬÍפ¬ ¤¢¤ê¤Þ¤¹¡£ ¤µ¤é¤Ë¡¢C++¥³¥ß¥å¥Ë¥Æ¥£¤Ç¤ÏÊ̤ηÁ¼°¤ÎÀ©Ì󤬻Ȥï¤ì¤Æ¤¤¤Þ¤¹¡£¹ÈϰϤˤ錄¤ë »ÈÍѤˤª¤¤¤Æ¡¢¤É¤Î¤è¤¦¤Ê·Á¼°¤ÎÀ©Ì󥯥ó¥×¥ì¡¼¥È¤¬ºÇ¤â¸ú²ÌŪ¤Ç¤¢¤ë¤«¤È¤¤¤¦¤³¤È ¤Ë¤Ï¡¢¤Þ¤ÀÅý°ì¤·¤¿¸«²ò¤ÏÆÀ¤é¤ì¤Æ¤¤¤Þ¤»¤ó¡£
¤·¤«¤·¡¢¤½¤Î¥¢¥¤¥Ç¥¢¤ÏÈó¾ï¤Ë°ìÈÌŪ¤Ç¤¢¤ê¡¢À©Ìó¤Î¸¡ºº¤Î¤¿¤á¤Ë¶ñÂÎŪ¤ËÄó°Æ¡¢ Ä󶡤µ¤ì¤¿¸À¸ìµ¡Ç½¤è¤ê¤â°ìÈÌŪ¤Ç¤¹¡£¤¤¤º¤ì¤Ë¤·¤Æ¤â¡¢¥Æ¥ó¥×¥ì¡¼¥È¤òµ½Ò¤¹¤ë ¤È¤¤Ë¤Ï¡¢»ä¤¿¤Á¤ÏC++¤Îɽ¸½ÎϤòºÇÂç¸Â¤ËÍøÍѤǤ¤Þ¤¹¡£ ¼¡¤ÎÎã¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
template<class T, class B> struct Derived_from {
static void constraints(T* p) { B* pb = p; }
Derived_from() { void(*p)(T*) = constraints; }
};
template<class T1, class T2> struct Can_copy {
static void constraints(T1 a, T2 b) { T2 c = a; b = a; }
Can_copy() { void(*p)(T1,T2) = constraints; }
};
template<class T1, class T2 = T1> struct Can_compare {
static void constraints(T1 a, T2 b) { a==b; a!=b; a<b; }
Can_compare() { void(*p)(T1,T2) = constraints; }
};
template<class T1, class T2, class T3 = T1> struct Can_multiply {
static void constraints(T1 a, T2 b, T3 c) { c = a*b; }
Can_multiply() { void(*p)(T1,T2,T3) = constraints; }
};
struct B { };
struct D : B { };
struct DD : D { };
struct X { };
int main()
{
Derived_from<D,B>();
Derived_from<DD,B>();
Derived_from<X,B>();
Derived_from<int,B>();
Derived_from<X,int>();
Can_compare<int,float>();
Can_compare<X,B>();
Can_multiply<int,float>();
Can_multiply<int,float,double>();
Can_multiply<B,X>();
Can_copy<D*,B*>();
Can_copy<D,B*>();
Can_copy<int,B*>();
}
// ŵ·¿Åª¤Ê¡ÖÍ×ÁǤÏMybase¤«¤éƳ½Ð¤µ¤ì¤¿¤â¤Î¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡×¤È¤¤¤¦À©Ìó
template<class T> class Container : Derived_from<T,Mybase> {
// ...
};
¼Â¤Î¤È¤³¤í¡¢Derived_from¤ÏƳ½Ð¤ò¸¡ºº¤·¤Æ¤¤¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢ÊÑ´¹¤Ç¤¤ë¤«¤ò¸¡ºº
¤·¤Æ¤¤¤Þ¤¹¡£¤·¤«¤·¡¢¤³¤ì¤Ï¤·¤Ð¤·¤ÐÎɤ¤À©Ìó¤Ë¤Ê¤ê¤Þ¤¹¡£À©Ìó¤ËÎɤ¤Ì¾Á°¤òÉÕ¤±¤ë
¤Î¤ÏÆñ¤·¤¤¤³¤È¤Ç¤¹¡£
·¿¥·¥¹¥Æ¥à¤Ë·ç´Ù¤¬À¸¤¸¤ë¤«¤é¤Ç¤¹¡£¼¡¤ÎÎã¤ò¤ß¤Æ¤¯¤À¤µ¤¤¡£
class Apple : public Fruit { void apple_fct(); /* ... */ };
class Orange : public Fruit { /* ... */ }; // Orange¤Ë¤Ïapple_fct()¤¬¤Ê¤¤
vector<Apple*> v; // Apple¤Îvector
void f(vector<Fruit*>& vf) // ̵³²¤ÊFruitÁàºî´Ø¿ô
{
vf.push_back(new Orange); // orange¤òfruit¤Îvector¤ËÄɲ乤ë
}
void h()
{
f(v); // ¥¨¥é¡¼: vector<Apple*>¤òvector<Fruit*>¤È¤·¤ÆÅϤ¹¤³¤È¤Ï¤Ç¤¤Ê¤¤
for (int i=0; i<v.size(); ++i) v[i]->apple_fct();
}
¤â¤·f(v)¤Î¸Æ¤Ó½Ð¤·¤¬Ç§¤á¤é¤ì¤Æ¤¤¤¿¤é¡¢Orange¤¬Apple¤È¤·¤Æ¿¶¤ëÉñ¤¦¤³¤È¤Ë¤Ê¤Ã¤Æ
¤·¤Þ¤¦¤Ç¤·¤ç¤¦¡£
¾¤Î¸À¸ìÀ߷פòÁªÂò¤·¤Æ°ÂÁ´¤Ç¤Ê¤¤ÊÑ´¹¤òǧ¤á¤Æ¤â¡¢¼Â¹Ô»þ¸¡ºº¤Ë¤ÏÍê¤ë¤³¤È¤Ë ¤Ê¤ê¤Þ¤¹¡£v¤ÎÍ×ÁǤإ¢¥¯¥»¥¹¤¹¤ë¤¿¤Ó¤Ë¼Â¹Ô»þ¸¡ºº¤¬É¬Íפˤʤꡢh()¤Ïv¤ÎºÇ¸å¤Î Í×ÁǤ˥¢¥¯¥»¥¹¤·¤¿»þÅÀ¤ÇÎã³°¤ò¥¹¥í¡¼¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
¤¤¤¤¤¨¡£¥¸¥§¥Í¥ê¥¯¥¹¤È¤Ï¤½¤â¤½¤âÃê¾Ý¥¯¥é¥¹¤ÎÅü°á¹½Ê¸(syntactic sugar)¤Ç¤¹¡£ ¤Ä¤Þ¤ê¡¢(Java¤Ç¤¢¤í¤¦¤ÈC#¤Ç¤¢¤í¤¦¤È)¥¸¥§¥Í¥ê¥¯¥¹¤Ç¤Ï¡¢Àµ³Î¤ËÄêµÁ¤µ¤ì¤¿¥¤¥ó¥¿ ¥Õ¥§¥¤¥¹¤ËÂФ·¤Æ¥×¥í¥°¥é¥à¤·¡¢°ìÈÌŪ¤Ë²¾ÁÛ´Ø¿ô¸Æ¤Ó½Ð¤·¤ÈưŪ¥¥ã¥¹¥È¤ÎξÊý¤Î ¥³¥¹¥È¡¢¤¢¤ë¤¤¤Ï¤½¤Î¤É¤Á¤é¤«¤¬¤«¤«¤ê¤Þ¤¹¡£
¥Æ¥ó¥×¥ì¡¼¥È¤Ï¥¸¥§¥Í¥ê¥Ã¥¯¥×¥í¥°¥é¥ß¥ó¥°¤ä¥Æ¥ó¥×¥ì¡¼¥È¥á¥¿¥×¥í¥°¥é¥ß¥ó¥° ¤Ê¤É¤ò¡¢À°¿ô¥Æ¥ó¥×¥ì¡¼¥È°ú¿ô¡¢ÆÃ¼ì²½¡¢ÁȤ߹þ¤ß·¿¤È¥æ¡¼¥¶ÄêµÁ·¿¤ÎÅý°ìŪ¤Ê¼è¤ê °·¤¤¡¢¤È¤¤¤Ã¤¿µ¡Ç½¤òÁȤ߹ç¤ï¤»¤Æ¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢¡Ö¥¸¥§¥Í¥ê¥¯¥¹¡× ¤È¤ÏÈæ¤Ù¤â¤Î¤Ë¤Ê¤é¤Ê¤¤¤Û¤É¤Î½ÀÆðÀ¡¢°ìÈÌÀ¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤òÆÀ¤Æ¤¤¤Þ¤¹¡£STL¤¬ ¤½¤ÎºÇ¹â¤ÎÎã¤Ç¤¹¡£
½ÀÆðÀ¤òÆÀ¤ëÂå¤ï¤ê¤Ë¡¢¥¨¥é¡¼¤Î¸¡½Ð¤¬Ã٤줿¤ê¡¢À¨¤Þ¤¸¤¯Ê¬¤ê¤Å¤é¤¤¥¨¥é¡¼ ¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ¹¤ë¤È¤¤¤Ã¤¿¡¢¤¢¤Þ¤ê˾¤Þ¤·¤¯¤Ê¤¤·ë²Ì¤¬¤â¤¿¤é¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ë ¤Ä¤¤¤Æ¤Ï¸½ºß¡¢À©Ì󥯥饹¤Ç´ÖÀÜŪ¤Ë¼è¤ê¾å¤²¤é¤ì¤Æ ¤¤¤Þ¤¹¤·¡¢C++0x¤Î¥³¥ó¥»¥×¥È¤ÇľÀܼè¤ê¾å¤²¤é¤ì¤ë¤Ç¤·¤ç¤¦¡£(»ä¤Î½ÐÈÇʪ¤ÈÄó°Æ¡¢¤½¤·¤Æ¡¢É¸½à²½°Ñ°÷²ñ¤Î¥µ¥¤¥È¤Ë¤¢¤ë¤¹¤Ù¤Æ¤Î Ä󰯤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£
½é¿´¼Ô¤Ø¤Î²óÅú:
qsort(array,asize,sizeof(elem),elem_compare);¤Ï¤«¤Ê¤ê´ñ̯¤Ç¡¢
sort(vec.begin(),vec.end());¤è¤ê¤âÍý²ò¤·¤Ë¤¯¤¤¤Ç¤¹¡£
struct Record {
string name;
// ...
};
struct name_compare { // "name"¤ò¥¡¼¤È¤·¤ÆRecords¤òÈæ³Ó¤¹¤ë
bool operator()(const Record& a, const Record& b) const
{ return a.name<b.name; }
};
void f(vector<Record>& vs)
{
sort(vs.begin(), vs.end(), name_compare());
// ...
}
¤·¤«¤â¡¢Â¿¤¯¤Î¿Í¤¬¡¢sort()¤Ï·¿°ÂÁ´¤Ç¤¢¤ê¡¢»ÈÍѤ¹¤ë¤Î¤Ë¥¥ã¥¹¥È¤òɬÍפȤ»¤º¡¢
ɸ½à¤Î·¿¤Î¾ì¹ç¤Ë¤Ïcompare()´Ø¿ô¤ò½ñ¤¯É¬Íפ¬¤Ê¤¤¤È¤¤¤¦¤³¤È¤òɾ²Á¤·¤Æ¤¤¤Þ¤¹¡£
¤è¤ê¾Ü¤·¤¤²òÀâ¤Ï¡¢»ä¤ÎÏÀʸ"Learning C++ as a New language"¤ò»²¾È¤·¤Æ ¤¯¤À¤µ¤¤¡£»ä¤Î½ÐÈÇʪ °ìÍ÷¤«¤é¥À¥¦¥ó¥í¡¼¥É¤Ç¤¤Þ¤¹¡£
sort()¤¬qsort()¤è¤ê¤âÀǽ¤¬Í¥¤ì¤Æ¤¤¤ë¤³¤È¤¬Â¿¤¤¤Î¤Ï¡¢¥¤¥ó¥é¥¤¥ó²½¤¬¤¦¤Þ¤¯ ¹Ô¤ï¤ì¤ë¤«¤é¤Ç¤¹¡£
´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤È¤Ï¡¢²¿¤é¤«¤ÎÊýË¡¤Ç´Ø¿ô¤Î¤è¤¦¤Ë¿¶¤ëÉñ¤¦¥ª¥Ö¥¸¥§¥¯¥È¤Î ¤³¤È¤Ç¤¹¡£°ìÈÌŪ¤Ë¤Ï¡¢Å¬Íѱ黻»Òoperator()¤òÄêµÁ¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È ¤Î¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£
´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Ï´Ø¿ô¤è¤ê¤â°ìÈÌŪ¤Ê³µÇ°¤Ç¤¹¡£¤Ê¤¼¤Ê¤é¡¢(ÀÅŪ¥í¡¼¥«¥ëÊÑ¿ô ¤Î¤è¤¦¤Ë)Ê£¿ô²ó¤Î¸Æ¤Ó½Ð¤·¤Ë¤ï¤¿¤Ã¤ÆÊÝ»ý¤µ¤ì¤ë¾õÂÖ¤ò»ý¤Ä¤³¤È¤¬¤Ç¤¡¢(ÀÅŪ ¥í¡¼¥«¥ëÊÑ¿ô¤È¤Ï°Û¤Ê¤ê)¤½¤Î¾õÂÖ¤ò¥ª¥Ö¥¸¥§¥¯¥È¤Î³°¤«¤é½é´ü²½¤¹¤ë¤³¤È¤äÄ´¤Ù¤ë ¤³¤È¤¬¤Ç¤¤ë¤«¤é¤Ç¤¹¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
class Sum {
int val;
public:
Sum(int i) :val(i) { }
operator int() const { return val; } // Ãͤò¼è¤ê½Ð¤¹
int operator()(int i) { return val+=i; } // ŬÍÑ
};
void f(vector<int> v)
{
Sum s = 0; // ½é´üÃÍ 0
s = for_each(v.begin(), v.end(), s); // Á´Í×ÁǤÎÃͤò¹ç·×¤¹¤ë
cout << "the sum is " << s << "\n";
// ¼¡¤Î¤è¤¦¤Ë¤¹¤ë¤³¤È¤â¤Ç¤¤ë
cout << "the sum is " << for_each(v.begin(), v.end(), Sum(0)) << "\n";
}
¥¤¥ó¥é¥¤¥óÄêµÁ¤µ¤ì¤¿Å¬Íѱ黻»Ò¤ò»ý¤Ä´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢¥ª¥×¥Æ¥£¥Þ¥¤¥¶¤ò
º®Í𤵤»¤ë²ÄǽÀ¤Î¤¢¤ë¥Ý¥¤¥ó¥¿¤¬¤Ê¤¤¤¿¤á¡¢¤¤Á¤ó¤È¥¤¥ó¥é¥¤¥ó²½¤µ¤ì¤ë¤È¤¤¤¦
¤³¤È¤ËÃíÌܤ·¤Æ¤¯¤À¤µ¤¤¡£¸½ºß¤Î¥ª¥×¥Æ¥£¥Þ¥¤¥¶¤Ï¡¢´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò²ð¤·¤¿
¸Æ¤Ó½Ð¤·¤ò¥¤¥ó¥é¥¤¥ó²½¤¹¤ë¤³¤È¤¬¤Û¤È¤ó¤É(ÀäÂФË?)¤Ç¤¤Þ¤»¤ó¡£
´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Ïɸ½à¥é¥¤¥Ö¥é¥ê¤ÎÃæ¤Ç¡¢½ÀÆðÀ¤òÄ󶡤¹¤ë¤¿¤á¤Ë¹ÈÏ°Ï¤Ë ¤ï¤¿¤Ã¤Æ»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤¹¡£
auto_ptr¤Ï¤È¤Æ¤âñ½ã¤Ê¥Ï¥ó¥É¥ë¥¯¥é¥¹¤Î°ìÎã¤Ç¡¢<memory>¤ÎÃæ¤ÇÄêµÁ¤µ¤ì¡¢ ¡Ö¥ê¥½¡¼¥¹¼èÆÀ¤Ï½é´ü²½¤Ç¤¢¤ë¡×¥Æ¥¯¥Ë¥Ã¥¯¤ò»ÈÍѤ·¤Æ Îã³°°ÂÁ´À¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£auto_ptr¤Ï¥Ý¥¤¥ó¥¿¤òÊÝ»ý¤·¡¢¥Ý¥¤¥ó¥¿¤Î¤è¤¦¤Ë»ÈÍÑ ¤¹¤ë¤³¤È¤¬¤Ç¤¡¢¥¹¥³¡¼¥×¤Î½ª¤ï¤ê¤ÇÊÝ»ý¤·¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤·¤Þ¤¹¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
#include<memory>
using namespace std;
struct X {
int m;
// ..
};
void f()
{
auto_ptr<X> p(new X);
X* q = new X;
p->m++; // ¥Ý¥¤¥ó¥¿¤Î¤è¤¦¤Ëp¤ò»ÈÍѤ¹¤ë
q->m++;
// ...
delete q;
}
...¤ÎÉôʬ¤ÇÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¡¢p¤¬ÊÝ»ý¤·¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ïauto_ptr¤Î
¥Ç¥¹¥È¥é¥¯¥¿¤Ë¤è¤Ã¤ÆÀµ¤·¤¯²òÊü¤µ¤ì¤Þ¤¹¡£°ìÊý¡¢q¤¬»Ø¤·¤Æ¤¤¤ëX¤Ï¡¢¥á¥â¥ê¥ê¡¼¥¯
¤òµ¯¤³¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++¤Î14.4.2¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
auto_ptr¤ÏÈó¾ï¤Ë·ÚÎ̤ʥ¯¥é¥¹¤Ç¤¹¡£¶ñÂÎŪ¤Ë¸À¤¦¤È¡¢¤³¤ì¤Ï¥ê¥Õ¥¡¥ì¥ó¥¹¥«¥¦ ¥ó¥¿Êý¼°¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ï¡Ö¤¢¤ê¤Þ¤»¤ó¡×¡£auto_ptr¤òÊ̤Îauto_ptr¤Ë¡Ö¥³¥Ô¡¼¡×¤·¤¿ ¾ì¹ç¡¢ÂåÆþÀè¤Îauto_ptr¤¬¥Ý¥¤¥ó¥¿¤òÊÝ»ý¤·¡¢ÂåÆþ¸µ¤Îauto_ptr¤Ï0¤òÊÝ»ý¤·¤Þ¤¹¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
#include<memory>
#include<iostream>
using namespace std;
struct X {
int m;
// ..
};
int main()
{
auto_ptr<X> p(new X);
auto_ptr<X> q(p);
cout << "p " << p.get() << " q " << q.get() << "\n";
}
¾åµ¤Î¥³¡¼¥É¤Ï¡¢¼¡¤Ë¼¨¤¹¤è¤¦¤Ë¡¢0¥Ý¥¤¥ó¥¿¤Î¸å¤ËÈó0¥Ý¥¤¥ó¥¿¤òɽ¼¨¤¹¤ë¤Ï¤º¤Ç¤¹¡£
p 0x0 q 0x378d0auto_ptr::get()¤ÏÊÝ»ý¤·¤Æ¤¤¤ë¥Ý¥¤¥ó¥¿¤òÊÖ¤·¤Þ¤¹¡£
¤³¤Î¡Ö°Üư¥»¥Þ¥ó¥Æ¥£¥¯¥¹¡×¤Ï¡¢Ä̾ï¤Î¡Ö¥³¥Ô¡¼¥»¥Þ¥ó¥Æ¥£¥¯¥¹¡×¤È¤Ï°Û¤Ê¤ê¡¢ °Õ³°¤Ç¤·¤ç¤¦¡£ÆÃ¤Ë¡¢auto_ptr¤òɸ½à¥³¥ó¥Æ¥Ê¤ÎÍ×ÁǤȤ·¤ÆÀäÂФ˻ÈÍѤ·¤Ê¤¤¤Ç ¤¯¤À¤µ¤¤¡£É¸½à¥³¥ó¥Æ¥Ê¤ÏÄ̾ï¤Î¥³¥Ô¡¼¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤òÍ׵ᤷ¤Þ¤¹¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
std::vector<auto_ptr<X> >v; // ¥¨¥é¡¼auto_ptr¤ÏÇÛÎó¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ï¤Ê¤¯¡¢Ã±°ì¤ÎÍ×ÁǤؤΥݥ¤¥ó¥¿¤òÊÝ»ý¤·¤Þ¤¹¡£
void f(int n)
{
auto_ptr<X> p(new X[n]); // ¥¨¥é¡¼
// ...
}
¤³¤ì¤Ï¡¢¥Ç¥¹¥È¥é¥¯¥¿¤¬¥Ý¥¤¥ó¥¿¤ò"delete[]"¤Ç¤Ï¤Ê¤¯¡¢"delete"¤Ç²òÊü¤·¡¢»Ä¤ê
¤Î n-1 ¤Î X ¤ËÂФ¹¤ë¥Ç¥¹¥È¥é¥¯¥¿¤òµ¯Æ°¤Ç¤¤Ê¤¤¤¿¤á¡¢¥¨¥é¡¼¤Ë¤Ê¤ê¤Þ¤¹¡£
¤½¤ì¤Ç¤Ï¡¢ÇÛÎó¤òÊÝ»ý¤¹¤ë¤¿¤á¤Ëauto_array¤ò»È¤Ã¤¿Êý¤¬¤è¤¤¤Î¤Ç¤·¤ç¤¦¤«¡£ auto_array¤È¤¤¤¦¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤Ê¤¼¤Ê¤é¡¢É¬Íפ¬¤Ê¤¤¤«¤é¤Ç¤¹¡£vector¤ò »È¤¦¤Î¤¬¤è¤ê¤è¤¤²ò·èÊýË¡¤Ç¤¹¡£
void f(int n)
{
vector<X> v(n);
// ...
}
...¤ÎÉôʬ¤ÇÎã³°¤¬È¯À¸¤·¤Æ¤â¡¢v¤Î¥Ç¥¹¥È¥é¥¯¥¿¤¬Àµ¤·¤¯µ¯Æ°¤µ¤ì¤Þ¤¹¡£
C++ɸ½à¥é¥¤¥Ö¥é¥ê¤Ï¡¢ÍÍѤǡ¢ÀÅŪ¤Ë·¿°ÂÁ´¤Ç¤¢¤ê¡¢¸úΨŪ¤Ê¥³¥ó¥Æ¥Ê¤Î¥»¥Ã¥È ¤òÄ󶡤·¤Þ¤¹¡£vector, list, map¤¬¤½¤ÎÂåɽŪ¤ÊÎã¤Ç¤¹¡£
vector<int> vi(10); vector<Shape*> vs; list<string> lst; list<double> l2 map<string,Record*> tbl; map< Key,vector<Record*> > t2;Í¥¤ì¤¿C++¤Î¶µ²Ê½ñ¤Ï¤ß¤Ê¤³¤ì¤é¤Î¥³¥ó¥Æ¥Ê¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Æ¤¤¤Þ¤¹¡£ÆÃ¤ËÍýͳ¤¬ ¤Ê¤±¤ì¤Ð¡¢ÇÛÎó¤ä¡Ö¼êÀ½¡×¤Î¥³¥ó¥Æ¥Ê¤è¤ê¤â¤³¤Á¤é¤ò»ÈÍѤ·¤¿Êý¤¬¤è¤¤¤Ç¤·¤ç¤¦¡£
¤³¤ì¤é¤Î¥³¥ó¥Æ¥Ê¤ÏƱ¼ï(homogeneous)¥³¥ó¥Æ¥Ê¤Ç¤¹¡£¤Ä¤Þ¤ê¡¢Æ±¤¸·¿¤ÎÍ×ÁǤò ÊÝ»ý¤·¤Þ¤¹¡£¤â¤·¥³¥ó¥Æ¥Ê¤Ë¤¤¤¯¤Ä¤«¤Î°Û¤Ê¤ë·¿¤ÎÍ×ÁǤòÊÝ»ý¤·¤¿¤¤¤Ê¤é¡¢union¤ò »ÈÍѤ¹¤ë¤«¡¢Â¿ÂÖ·¿(polymorphic type)¤Ø¤Î¥Ý¥¤¥ó¥¿¤Î¥³¥ó¥Æ¥Ê(Ä̾盧¤Á¤é¤ÎÊý¤¬ ¤º¤Ã¤ÈÎɤ¤)¤ò»ÈÍѤ·¤ÆÉ½¸½¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ ŵ·¿Åª¤ÊÎã¤Ï¼¡¤Î¤è¤¦¤Ê¤â¤Î¤Ç¤¹¡£
vector<Shape*> vi; // Shape¤Ø¤Î¥Ý¥¤¥ó¥¿¤Îvector¤³¤³¤Ç¡¢vi¤ÏShape¤«¤éƳ½Ð¤µ¤ì¤¿¤â¤Î¤Ê¤é¤É¤Î¤è¤¦¤Ê·¿¤ÎÍ×ÁǤǤâÊÝ»ý¤Ç¤¤Þ¤¹¡£ ¤Ä¤Þ¤ê¡¢vi¤Ï¡¢¤½¤Î¤¹¤Ù¤Æ¤ÎÍ×ÁǤ¬Shape(Àµ³Î¤Ë¤ÏShape¤Ø¤Î¥Ý¥¤¥ó¥¿)¤Ç¤¢¤ë¤È¤¤¤¦ ÅÀ¤ÇƱ¼ï¥³¥ó¥Æ¥Ê¤Ç¤¢¤ê¡¢Circle, Triangle¤Ê¤É¤Î¤è¤¦¤Ê¡¢¼ï¡¹¤µ¤Þ¤¶¤Þ¤ÊShape¤Î Í×ÁǤòÊÝ»ý¤Ç¤¤ë¤È¤¤¤¦°ÕÌ£¤Ç°Û¼ï(heterogenous)¥³¥ó¥Æ¥Ê¤Ç¤¹¡£
¤·¤¿¤¬¤Ã¤Æ¡¢¤¢¤ë°ÕÌ£¡¢(¤É¤Î¸À¸ì¤Ç¤â)¤¹¤Ù¤Æ¤Î¥³¥ó¥Æ¥Ê¤Ï¡¢¤½¤Î¤¹¤Ù¤Æ¤ÎÍ×ÁÇ¤Ë ¥æ¡¼¥¶¤¬°Í¸¤¹¤ë¶¦Ä̤Υ¤¥ó¥¿¥Õ¥§¥¤¥¹¤¬Â¸ºß¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤¿¤á¡¢Æ±¼ï¥³¥ó¥Æ¥Ê ¤È¸À¤¨¤Þ¤¹¡£°Û¼ï¥³¥ó¥Æ¥Ê¤È¹Í¤¨¤é¤ì¤Æ¤¤¤ë¥³¥ó¥Æ¥Ê¤òÄ󶡤·¤Æ¤¤¤ë¸À¸ì¤Ï¡¢Ã±¤Ëɸ½à ¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤ò»ý¤ÄÍ×ÁǤΥ³¥ó¥Æ¥Ê¤òÄ󶡤·¤Æ¤¤¤ë¤Ë¤¹¤®¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢Java¤Î ¥³¥ì¥¯¥·¥ç¥ó¤Ï¡¢Object(¤Ø¤Î¥ê¥Õ¥¡¥ì¥ó¥¹)¤Î¥³¥ó¥Æ¥Ê¤òÄ󶡤·¡¢Í×ÁǤμºݤη¿¤ò ÃΤ뤿¤á¤Ë(¶¦Ä̤Î)Object¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤ò»ÈÍѤ·¤Þ¤¹¡£
C++ɸ½à¥é¥¤¥Ö¥é¥ê¤ÏƱ¼ï¥³¥ó¥Æ¥Ê¤òÄ󶡤·¤Þ¤¹¡£¤½¤ÎÍýͳ¤Ï¡¢¤Û¤È¤ó¤É¤Î¥±¡¼¥¹ ¤ÇºÇ¤â´Êñ¤Ë»ÈÍѤǤ¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤ËºÇÎɤΥ¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¡¢ÉÔɬÍ×¤Ê ¼Â¹Ô»þ¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬¤«¤«¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£
C++¤Ç°Û¼ï¥³¥ó¥Æ¥Ê¤¬É¬Íפʤ顢¤¹¤Ù¤Æ¤ÎÍ×ÁǤ˶¦Ä̤Υ¤¥ó¥¿¥Õ¥§¥¤¥¹¤òÄêµÁ¤·¤Æ¡¢ ¤½¤ì¤é¤òÊÝ»ý¤¹¤ë¥³¥ó¥Æ¥Ê¤òºîÀ®¤·¤Æ¤¯¤À¤µ¤¤¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
class Io_obj { /* ... */ }; // object I/O¤Ë²Ã¤ï¤ë¤Î¤ËɬÍפʥ¤¥ó¥¿¥Õ¥§¥¤¥¹
vector<Io_obj*> vio; // ¥Ý¥¤¥ó¥¿¤òľÀÜ´ÉÍý¤·¤¿¤¤¾ì¹ç
vector< Handle<Io_obj> > v2; // ¥¹¥Þ¡¼¥È¥Ý¥¤¥ó¥¿¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤ò°·¤ï¤»¤¿¤¤¾ì¹ç
ɬÍפ¬¤Ê¤±¤ì¤Ð¡¢¼ÂÁõ¤Î¾ÜºÙ¤ÎºÇ¤â²¼¤Î¥ì¥Ù¥ë¤Þ¤Ç¤ÏÍ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£
vector<void*> memory; // ɬÍפˤʤ뤳¤È¤Ï¤Û¤È¤ó¤É¤Ê¤¤¼ÂÁõ¤Î¾ÜºÙ¤Î¥ì¥Ù¥ë¤¬Ä㤹¤®¤ë¤«¤Ï¡¢¥¥ã¥¹¥È¤¬¤ä¤¿¤é¿¤¯¤Ê¤ë¤È¤¤¤¦¤³¤È¤«¤é ¤ï¤«¤ê¤Þ¤¹¡£
¥×¥í¥°¥é¥à¤Ë¤è¤Ã¤Æ¤Ï¡¢Boost::Any¤Î¤è¤¦¤ÊAny¥¯¥é¥¹¤òÂå¤ï¤ê¤Ë»ÈÍѤǤ¤ë¤³¤È ¤â¤¢¤ê¤Þ¤¹¡£
vector<Any> v;
¤½¤ó¤Ê¤ËÃÙ¤¯¤Ï¤¢¤ê¤Þ¤»¤ó¡£¡Ö²¿¤ÈÈæ¤Ù¤Æ¤«¡×¤È¤¤¤¦¤Î¤¬¤ª¤½¤é¤¯¤â¤Ã¤ÈÌòΩ¤Ä Åú¤¨¤Ê¤Î¤«¤â¤·¤ì¤Þ¤»¤ó¡£É¸½à¥é¥¤¥Ö¥é¥ê¥³¥ó¥Æ¥Ê¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ë¤Ä¤¤¤ÆÉÔËþ¤ò ¸À¤¦¿Íã¤ÎÌäÂê¤Ï¡¢¼¡¤Î¤è¤¦¤Ê»°¤Ä¤Î¿¿¤ÎÌäÂê(¤¢¤ë¤¤¤Ï¿¤¯¤Î¿ÀÏää¥Ç¥Þ)¤Î¤Ò¤È¤Ä ¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤·¤¿¡£
¤½¤ì¤Ç¤Ï¡¢¤³¤³¤Ç¤³¤ì¤é¤ÎÌäÂê¤Ë¤Ä¤¤¤ÆÄ´¤Ù¤Æ¤ß¤Þ¤·¤ç¤¦¡£ vector<X>¤Ï狼¤¬ºî¤Ã¤¿ÆÃ¼ì²½¤µ¤ì¤¿My_container<X>¤è¤ê¤âÃÙ¤¤¤³¤È¤¬ ¤è¤¯¤¢¤ê¤Þ¤¹¡£¤½¤ì¤Ï¡¢My_container<X>¤¬ X ¤Ø¤Î¥Ý¥¤¥ó¥¿¤Î¥³¥ó¥Æ¥Ê¤È¤·¤Æ ¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£É¸½à¥³¥ó¥Æ¥Ê¤ÏÃͤΥ³¥Ô¡¼¤òÊÝ»ý¤·¡¢¥³¥ó¥Æ¥Ê¤ËÄɲà ¤µ¤ì¤ë¤È¤¤ËÃͤò¥³¥Ô¡¼¤·¤Þ¤¹¡£¤³¤ì¤Ï¾®¤µ¤ÊÃͤˤȤäƤϴðËÜŪ¤ËÈó¾ï¤ËŬ¤·¤Æ ¤¤¤Þ¤¹¤¬¡¢µðÂç¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤È¤Ã¤Æ¤Ï¤Þ¤Ã¤¿¤¯Å¬¤·¤Æ¤¤¤Þ¤»¤ó¡£
vector<int> vi;
vector<Image> vim;
// ...
int i = 7;
Image im("portrait.jpg"); // ¥Õ¥¡¥¤¥ë¤«¤é¥¤¥á¡¼¥¸¤òÆÉ¤ß¹þ¤ß¡¢½é´ü²½¤¹¤ë
// ...
vi.push_back(i); // i(¤Î¥³¥Ô¡¼)¤ò v ¤ËÄɲ乤ë
vim.push_back(im); // im(¤Î¥³¥Ô¡¼¤òvim¤ËÄɲ乤ë
¤³¤³¤Ç¡¢¤â¤·portrait.jpg¤¬¿ô¥á¥¬¥Ð¥¤¥È¤¢¤ê¡¢Image¤¬ÃÍ¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤ò»ý¤Ä(¤¹¤Ê
¤ï¤Á¥³¥Ô¡¼ÂåÆþ¤È¥³¥Ô¡¼¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¥³¥Ô¡¼¤òºî¤ë)¾ì¹ç¡¢vim.push_back(im)¤Ï
ËÜÅö¤Ë¹â¤¯¤Ä¤¯¤Ç¤·¤ç¤¦¡£¤·¤«¤·¡¢(¤è¤¯¸À¤ï¤ì¤ë¤è¤¦¤Ë)¤½¤ì¤¬Èó¾ï¤ËÌäÂê¤È¤Ê¤ë¤Ê¤é¡¢
¤½¤¦¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£Âå¤ï¤ê¤Ë¥Ï¥ó¥É¥ë¤Î¥³¥ó¥Æ¥Ê¤ò»ÈÍѤ¹¤ë¤«¡¢¥Ý¥¤¥ó¥¿
¤Î¥³¥ó¥Æ¥Ê¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢¤â¤·Image¤¬»²¾È¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤ò»ý¤Ã¤Æ
¤¤¤¿¤Ê¤é¡¢¾åµ¤Î¥³¡¼¥É¤Ï¥³¥Ô¡¼¥³¥ó¥¹¥È¥é¥¯¥¿¸Æ¤Ó½Ð¤·¤Î¥³¥¹¥È¤À¤±¤¬¤«¤«¤ê¤Þ¤¹¡£
¤½¤ì¤Ï¡¢Â¿¤¯¤Î¥¤¥á¡¼¥¸Áàºî±é»»¤ÈÈæ¤Ù¤¿¤é¤µ¤µ¤¤¤Ê¤â¤Î¤Ç¤¹¡£
¤¢¤ë¥¯¥é¥¹(¤¿¤È¤¨¤ÐÁ°½Ò¤ÎImage)¤¬ÀµÅö¤ÊÍýͳ¤¬¤¢¤Ã¤Æ¥³¥Ô¡¼¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤ò»ý¤Ä
¾ì¹ç¡¢¥Ý¥¤¥ó¥¿¤òÊÝ»ý¤¹¤ë¥³¥ó¥Æ¥Ê¤¬Å¬Àڤʲò·èºö¤È¤Ê¤ë¤³¤È¤¬Â¿¤¯¤¢¤ê¤Þ¤¹¡£
vector<int> vi;
vector<Image*> vim;
// ...
Image im("portrait.jpg"); // ¥Õ¥¡¥¤¥ë¤«¤é¥¤¥á¡¼¥¸¤òÆÉ¤ß¹þ¤ß¡¢½é´ü²½¤¹¤ë
// ...
vi.push_back(7); // 7(¤Î¥³¥Ô¡¼)¤ò v ¤ËÄɲ乤ë
vim.push_back(&im); // &im(¤Î¥³¥Ô¡¼)¤òvim¤ËÄɲ乤ë
¤â¤Á¤í¤ó¡¢¥Ý¥¤¥ó¥¿¤ò»ÈÍѤ¹¤ë¤Ê¤é¡¢¥ê¥½¡¼¥¹´ÉÍý¤ò¹Íθ¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¤¬¡¢
¥Ý¥¤¥ó¥¿¤òÊÝ»ý¤¹¤ë¥³¥ó¥Æ¥Ê¤Ï¤½¤ì¼«¿È¸úΨŪ¤Ç°Â²Á¤Ê¥ê¥½¡¼¥¹¥Ï¥ó¥É¥ë¤È¤Ê¤ê
¤Þ¤¹(¡Ö½êͤ¹¤ë¡×¥ª¥Ö¥¸¥§¥¯¥È¤ò²òÊü¤¹¤ë¥Ç¥¹¥È¥é¥¯¥¿¤ò»ý¤Ä¥³¥ó¥Æ¥Ê¤¬É¬ÍפË
¤Ê¤ë¤³¤È¤¬¤è¤¯¤¢¤ê¤Þ¤¹)¡£
¼¡¤Ë¤è¤¯¤¢¤ëËÜÅö¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ÎÌäÂê¤Ï¡¢Â¿¿ô¤Î(string,X)¤ÎÁÈ¤Ë ÂФ¹¤ëmap<string,X>¤Î»ÈÍѤÎÌäÂê¤Ç¤¹¡£map¤Ï¡¢less-than¤Î¥³¥¹¥È¤¬Ä㤯¡¢¤è¤¤¥Ï¥Ã¥·¥å´Ø¿ô ¤òºî¤ì¤Ê¤¤¡¢Èæ³ÓŪ¾®¤µ¤Ê¥³¥ó¥Æ¥Ê(¤¿¤È¤¨¤Ð¿ôÉ´¡¢¿ôÀé¤ÎÍ×ÁÇ -- 10000Í×ÁǤòÊÝ»ý ¤¹¤ëmap¤ÎÍ×ÁǤؤΥ¢¥¯¥»¥¹¤Ë¤Ï¡¢¤ª¤è¤½9²ó¤ÎÈæ³Ó¤Î¥³¥¹¥È¤¬¤«¤«¤ë)¤Ë¤ÏÍ¥¤ì¤¿ ¤â¤Î¤Ç¤¹¡£Â¿¤¯¤Îʸ»úÎó¤ò°·¤¤¡¢¤è¤¤¥Ï¥Ã¥·¥å´Ø¿ô¤¬¤¢¤ë¤Ê¤é¡¢¥Ï¥Ã¥·¥å¥Æ¡¼¥Ö¥ë ¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£É¸½à²½°Ñ°÷²ñ¤Îµ»½Ñ¥ì¥Ý¡¼¥È(Technical Report)¤Ë ¤è¤ëunordered_map¤¬¸½ºß¹¤¯ÍøÍѲÄǽ¤Ç¡¢ÂçÄñ¤Î¼«²ÈÀ½¤Î¤â¤Î¤è¤ê¤Ï¤ë¤«¤ËÍ¥¤ì¤Æ ¤¤¤Þ¤¹¡£
(const char*,X)¤ÎÁȤò»ÈÍѤ¹¤ë¤È¡¢(string,X)¤ÎÁȤߤè¤ê¤â¹â®²½¤Ç¤¤ë¤³¤È ¤¬¤¢¤ê¤Þ¤¹¤¬¡¢< ±é»»»Ò¤ÏC¥¹¥¿¥¤¥ë¤Îʸ»úÎó¤ËÂФ·¤Æ¼½ñ½ç¤Ë¤è¤ëÈæ³Ó¤ò¹Ô¤ï¤Ê¤¤ ¤È¤¤¤¦¤³¤È¤ò˺¤ì¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤µ¤é¤Ë¡¢X ¤¬Â礤±¤ì¤Ð¡¢¥³¥Ô¡¼¤ÎÌäÂê¤âµ¯¤³¤ë ¤«¤â¤·¤ì¤Þ¤»¤ó(¤½¤ì¤Ï¤¤¤Ä¤â¤ÎÊýË¡¤Î¤Ò¤È¤Ä¤Ç²ò·è¤·¤Æ¤¯¤À¤µ¤¤)¡£
¿¯ÆþŪ(intrusive)¥ê¥¹¥È¤Ï¤È¤Æ¤â¹â®¤Ç¤¹¡£¤·¤«¤·¡¢¤½¤â¤½¤â¥ê¥¹¥È¤¬É¬Í×¤Ç ¤¢¤ë¤Î¤«¤É¤¦¤«¤è¤¯¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£vector¤Ï¤è¤ê¥³¥ó¥Ñ¥¯¥È¤Ç¤¢¤ë¤Î¤Ç¡¢ ¤Û¤È¤ó¤É¤Î¾ì¹ç(Äɲääºï½ü¤ò¤¹¤ë¤È¤¤Ç¤â)¡¢¤è¤ê¾®¤µ¤¯¡¢¹â®¤Ë¤Ê¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¾¯¿ô¤ÎÀ°¿ô¤ÎÍ×ÁǤòÊÝ»ý¤¹¤ë¥ê¥¹¥È¤ò°·¤¦¾ì¹ç¡¢vector¤Ï(¤É¤ó¤Ê)list¤è¤ê ¤â¤«¤Ê¤ê¹â®¤Ç¤¹¡£¤µ¤é¤Ë¡¢¿¯ÆþŪ(intrusive)¥ê¥¹¥È¤Ï¡¢ÁȤ߹þ¤ß·¿¤òľÀÜÊÝ»ý ¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤»¤ó(int¤Ë¤Ï¥ê¥ó¥¯¥á¥ó¥Ð¤¬¤¢¤ê¤Þ¤»¤ó)¡£¤·¤¿¤¬¤Ã¤Æ¡¢ËÜÅö¤Ë ¥ê¥¹¥È¤¬É¬Íפ«¡¢¤¹¤Ù¤Æ¤ÎÍ×ÁÇ·¿¤Ë¥ê¥ó¥¯¥Õ¥£¡¼¥ë¥É¤òÄɲäǤ¤ë¤«¤òÁÛÄꤷ¤Æ ¤ß¤Æ¤¯¤À¤µ¤¤¡£É¸½à¥é¥¤¥Ö¥é¥ê¤Î¥ê¥¹¥È¤Ï½é¤á¤«¤é¡¢Í×ÁǤòÁÞÆþ¤¹¤ëÁàºî¤´¤È¤Ë ³ä¤êÅö¤Æ¤È¥³¥Ô¡¼(¤½¤·¤ÆÍ×ÁǤòºï½ü¤¹¤ëÁàºî¤´¤È¤Ë²òÊü)¤ò¹Ô¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È ¥¢¥í¥±¡¼¥¿¤ò»ý¤Ästd::list¤Ë¤È¤Ã¤Æ¡¢¤³¤ì¤Ï½ÅÍפǤ¹¡£¥³¥Ô¡¼¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬ Â礤¯¤Ê¤¤¾®¤µ¤ÊÍ×ÁǤËÂФ·¤Æ¤Ï¡¢ºÇŬ²½¤µ¤ì¤¿¥¢¥í¥±¡¼¥¿¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¸¡Æ¤ ¤·¤Æ¤¯¤À¤µ¤¤¡£¼«ºî¤Î¿¯ÆþŪ(intrusive)¥ê¥¹¥È¤Ï¡¢¥ê¥¹¥È¤ò»È¤¦É¬Íפ¬¤¢¤Ã¤Æ¡¢ ºÇ¸å¤Ë¤¢¤È¾¯¤·¤À¤±¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬É¬ÍפȤµ¤ì¤ë¤È¤³¤í¤Ç¤À¤±»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£
vector¤¬½ù¡¹¤Ë¿Ä¹¤·¤Æ¤¤¤¯¤È¤¤Î¥³¥¹¥È¤òµ¤¤Ë¤¹¤ë¿Íã¤â¤¤¤Þ¤¹¡£»ä¤â°ÊÁ°¤Ï µ¤¤Ë¤·¤Æ¤¤¤Þ¤·¤¿¤·¡¢¿Ä¹¤òºÇŬ²½¤¹¤ë¤¿¤á¤Ëreserve()¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤·¤¿¡£¤·¤«¤·¡¢ »ä¤Î¥³¡¼¥É¤ò¬Äꤷ¤Æ¡¢²¿ÅÙ¤â¼ÂºÝ¤Î¥×¥í¥°¥é¥à¤ÎÃæ¤Çreserve()¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹ ¾å¤ÎÍøÅÀ¤ò¸«¤Ä¤±¤ë¤Î¤Ë¶ìÏ«¤·¤¿¸å¤Ï¡¢¥¤¥Æ¥ì¡¼¥¿¤Î̵¸ú²½(iterator invalidation)¤ò Èò¤±¤ëɬÍפΤ¢¤ë¤È¤³¤í(»ä¤Î¥³¡¼¥É¤ÎÃæ¤Ç¤Ïµ©¤Ê¥±¡¼¥¹)°Ê³°¤Ç¤Ï»È¤¦¤³¤È¤ò»ß¤á ¤Þ¤·¤¿¡£ºÇ¸å¤Ë¤â¤¦°ìÅÙ¡£ºÇŬ²½¤¹¤ëÁ°¤Ë¬Äꤷ¤Æ¤¯¤À¤µ¤¤¡£
¥á¥â¥ê¥ê¡¼¥¯¤Î¤Ê¤¤¥³¡¼¥É¤ò½ñ¤¯¤³¤È¤Ç¤¹¡£¥³¡¼¥ÉÃæ¤Î¤¤¤¿¤ë¤È¤³¤í¤Çnew±é»»¡¢ delete±é»»¡¢¥Ý¥¤¥ó¥¿±é»»¤ò¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢ÌÀ¤é¤«¤Ë¤É¤³¤«¤Ç¤Ø¤Þ¤ò¤·¤Æ¡¢¥á¥â¥ê ¥ê¡¼¥¯¤òµ¯¤³¤·¤¿¤ê¡¢Ì»ҤΥݥ¤¥ó¥¿¤¬¤Ç¤¤Æ¤·¤Þ¤Ã¤¿¤ê¤·¤Þ¤¹¡£¤³¤ì¤Ï¥á¥â¥ê³ä¤ê Åö¤Æ¤ò¤É¤ì¤À¤±ÍÑ¿´¿¼¤¯¤¹¤ë¤«¤Ë¤«¤«¤ï¤ê¤Þ¤»¤ó¡£¥³¡¼¥É¤¬Ê£»¨¤Ë¤Ê¤ë¤È¡¢¤¢¤Ê¤¿¤¬ Èñ¤ä¤¹»þ´Ö¤ÈÅØÎϤϤ䤬¤ÆÌµÂ̤ˤʤë¤Ç¤·¤ç¤¦¡£·ë¶É¤Ï¡¢´ÉÍý¤·¤ä¤¹¤¤·¿¤ÎÃæ¤Ë¥á¥â¥ê ¤Î¼èÆÀ¤È²òÊü¤ò𬤹¤È¤¤¤¦¥Æ¥¯¥Ë¥Ã¥¯¤¬¤¦¤Þ¤¯¤¤¤¤Þ¤¹¡£É¸½à¥³¥ó¥Æ¥Ê¤¬¤½¤Î¤è¤¤Î㠤Ǥ¹¡£É¸½à¥³¥ó¥Æ¥Ê¤Ï²áÅÙ¤ËÅØÎϤ¹¤ë¤³¤È¤Ê¤·¤Ë¡¢Í×ÁǤΤ¿¤á¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥á¥â¥ê ¤ò¤¢¤Ê¤¿¤¬´ÉÍý¤¹¤ë¤è¤ê¤â¤¦¤Þ¤¯´ÉÍý¤·¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤òstring¤Èvector¤ò»È¤ï¤º ¤Ë½ñ¤¤¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main() // string¤ò¤¤¤¸¤¯¤ê²ó¤¹¤Ä¤Þ¤é¤Ê¤¤¥×¥í¥°¥é¥à
{
cout << "enter some whitespace-separated words:\n";
vector<string> v;
string s;
while (cin>>s) v.push_back(s);
sort(v.begin(),v.end());
string cat;
typedef vector<string>::const_iterator Iter;
for (Iter p = v.begin(); p!=v.end(); ++p) cat += *p+"+";
cout << cat << '\n';
}
¤½¤Î¥×¥í¥°¥é¥à¤ÏºÇ½é¤«¤éÀµ¤·¤¯Æ°ºî¤¹¤ë¤Ç¤·¤ç¤¦¤«¡£¥á¥â¥ê¥ê¡¼¥¯¤·¤Ê¤¤¤È¤É¤¦
¤ä¤Ã¤ÆÈ½ÃǤ¹¤ë¤Î¤Ç¤·¤ç¤¦¤«¡£
¾åµ¤Î¥³¡¼¥É¤Ë¤Ï¡¢ÌÀ¼¨Åª¤Ê¥á¥â¥ê´ÉÍý¡¢¥Þ¥¯¥í¡¢¥¥ã¥¹¥È¡¢¥ª¡¼¥Ð¡¼¥Õ¥í¡¼ ¸¡ºº¡¢ÌÀ¼¨Åª¤Ê¥µ¥¤¥ºÀ©¸Â¡¢¤½¤·¤Æ¥Ý¥¤¥ó¥¿¤¬¤Ê¤¤¤³¤È¤ËÃíÌܤ·¤Æ¤¯¤À¤µ¤¤¡£ ´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Èɸ½à¥¢¥ë¥´¥ê¥º¥à¤ò»È¤¨¤Ð¡¢¥Ý¥¤¥ó¥¿¤Î¤è¤¦¤Ë»È¤ï¤ì¤Æ¤¤¤ë ¥¤¥Æ¥ì¡¼¥¿¤â¼è¤ê½ü¤¯¤³¤È¤¬¤Ç¤¤ë¤Ç¤·¤ç¤¦¤¬¡¢¤³¤Î¤è¤¦¤Ê¾®¤µ¤Ê¥×¥í¥°¥é¥à¤Ç ¤½¤¦¤¹¤ë¤Î¤Ï¤ä¤ê²á¤®¤À¤È»×¤¤¤Þ¤·¤¿¡£
¤³¤ì¤é¤Î¥Æ¥¯¥Ë¥Ã¥¯¤Ï´°àú¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤·¡¢ÂηÏŪ¤Ë¤¤¤Ä¤Ç¤â´Êñ¤Ë»È¤¨¤ë ¤È¤¤¤¦¤ï¤±¤Ç¤â¤¢¤ê¤Þ¤»¤ó¡£¤·¤«¤·¡¢°Õ³°¤È¹ÈϰϤˤ錄¤Ã¤ÆÅ¬ÍѤµ¤ì¡¢ÌÀ¼¨Åª¤Ê ¥á¥â¥ê¤Î¼èÆÀ¤È²òÊü¤¬¾¯¤Ê¤¯¤Ê¤ë¤³¤È¤Ç¡¢¥×¥í¥°¥é¥à¤Î»Ä¤ê¤ÎÉôʬ¤¬¤è¤êÇİ®¤·¤ä ¤¹¤¯¤Ê¤ê¤Þ¤¹¡£ Á᤯¤â1981ǯ¤Ë»ä¤Ï¡¢Çİ®¤·¤Æ¤ª¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤Èó¾ï¤Ë¿¤¯¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò ¿ô½½¸Ä¤Ë¾¯¤Ê¤¯¤¹¤ë¤³¤È¤Ç¡¢¥×¥í¥°¥é¥à¤òÀµ¤·¤¯Æ°ºî¤µ¤»¤ë¤Î¤ËɬÍפÊÃÎŪ¤Êºî¶È¤¬¡¢ Èó¾ï¤ËÆñ¤·¤¤¤â¤Î¤«¤é°·¤¤¤ä¤¹¤¤¤â¤Î¡¢¤È¤¤Ë¤Ï´Êñ¤Ë¤Ê¤ë¤³¤È¤µ¤¨¤¢¤Ã¤¿¤È»ØÅ¦ ¤·¤Þ¤·¤¿¡£
¤â¤·¤¢¤Ê¤¿¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥óÎΰè¤Ë¡¢ÌÀ¼¨Åª¤Ê¥á¥â¥ê´ÉÍý¤òºÇ¾®¸Â¤ËÍÞ¤¨¤Æ ¥×¥í¥°¥é¥ß¥ó¥°¤·¤ä¤¹¤¯¤¹¤ë¥é¥¤¥Ö¥é¥ê¤¬¤Ê¤¤¤Ê¤é¡¢¤½¤Î¤è¤¦¤Ê¥é¥¤¥Ö¥é¥ê¤ò½é¤á ¤ËºîÀ®¤¹¤ë¤³¤È¤¬¡¢¤¢¤Ê¤¿¤Î¥×¥í¥°¥é¥à¤òÀµ³Î¤Ë´°À®¤µ¤»¤ëºÇ¤âÁᤤÊýË¡¤«¤â¤·¤ì ¤Þ¤»¤ó¡£
¥Æ¥ó¥×¥ì¡¼¥È¤Èɸ½à¥é¥¤¥Ö¥é¥ê¤Ï¿ôǯÁ°¤ÈÈæ¤Ù¤Æ¤â¡¢¥³¥ó¥Æ¥Ê¡¢¥ê¥½¡¼¥¹¥Ï¥ó¥É¥ë ¤ÎÍøÍѤ¬¤º¤Ã¤È³Ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Îã³°¤Î»ÈÍѤϤۤȤó¤ÉÉԲķç¤Ê¤â¤Î¤Ë¤Ê¤Ã¤Æ¤¤ ¤Þ¤¹¡£
¤½¤ì¤Ç¤â¤ä¤Ï¤ê¡¢¤¢¤Ê¤¿¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÃæ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î°ìÉô¤Ç¡¢³ä¤ê Åö¤Æ¤È²òÊü¤ò°ÅÌۤ˰·¤¨¤Ê¤¤¾ì¹ç¤Ï¡¢¥á¥â¥ê¥ê¡¼¥¯¤¹¤ë²ÄǽÀ¤òºÇ¾®¸Â¤ËÍÞ¤¨¤ë ¤¿¤á¤Ë¥ê¥½¡¼¥¹¥Ï¥ó¥É¥ë¤òÍøÍѤǤ¤Þ¤¹¡£°Ê²¼¤Ë¼¨¤¹¤Î¤Ï¡¢¼«Í³µ²±Îΰè¾å¤Ë³ä¤ê Åö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ò´Ø¿ô¤«¤éÊÖ¤¹É¬ÍפΤ¢¤ëÎã¤Ç¤¹¡£¤³¤ì¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤ò ²òÊü¤·Ëº¤ì¤ë¤¤Ã¤«¤±¤È¤Ê¤ê¤Þ¤¹¡£·ë¶É¡¢¥Ý¥¤¥ó¥¿¤ò¸«¤¿¤À¤±¤Ç¤Ï¡¢²òÊü¤¹¤ëɬÍפ¬ ¤¢¤ë¤«¤É¤¦¤«¡¢²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢²òÊü¤¹¤ëÀÕǤ¤Ïï¤Ë¤¢¤ë¤Î¤«¤òÃΤ뤳¤È¤Ï ¤Ç¤¤Þ¤»¤ó¡£¥ê¥½¡¼¥¹¥Ï¥ó¥É¥ë(¤³¤ÎÎã¤Ç¤Ïɸ½à¥é¥¤¥Ö¥é¥ê¤Îauto_ptr)¤ò»ÈÍѤ¹¤ë¤È¡¢ ÀÕǤ¤Î½êºß¤¬¤Ï¤Ã¤¤ê¤È¤·¤Þ¤¹¡£
#include<memory>
#include<iostream>
using namespace std;
struct S {
S() { cout << "make an S\n"; }
~S() { cout << "destroy an S\n"; }
S(const S&) { cout << "copy initialize an S\n"; }
S& operator=(const S&) { cout << "copy assign an S\n"; }
};
S* f()
{
return new S; // ¤³¤Î S ¤ò²òÊü¤¹¤ëÀÕǤ¤Ïï¤Ë¤¢¤ë¤Î¤«
};
auto_ptr<S> g()
{
return auto_ptr<S>(new S); // ¤³¤Î S ¤ò²òÊü¤¹¤ëÀÕǤ¤òÌÀ¼¨Åª¤Ë°Ü¤¹
}
int main()
{
cout << "start main\n";
S* p = f();
cout << "after f() before g()\n";
// S* q = g(); // ¤³¤Î¥¨¥é¡¼¤Ï¥³¥ó¥Ñ¥¤¥é¤¬¸«¤Ä¤±¤ë
auto_ptr<S> q = g();
cout << "exit main\n";
// ¤³¤³¤Ç *p ¤Ï¥ê¡¼¥¯¤¹¤ë
// ¤³¤³¤Ç *q ¤Ï°ÅÌۤ˲òÊü¤µ¤ì¤ë
}
¤¿¤Àñ¤Ë¥á¥â¥ê¤À¤±¤Ç¤Ê¤¯¡¢¥ê¥½¡¼¥¹°ìÈ̤ˤĤ¤¤Æ¹Í¤¨¤Æ¤¯¤À¤µ¤¤¡£
¤¢¤Ê¤¿¤Î´Ä¶¤Ç¤³¤ì¤é¤Î¥Æ¥¯¥Ë¥Ã¥¯¤ò·ÏÅýŪ¤ËŬÍѤǤ¤Ê¤¤¾ì¹ç(¤É¤³¤«Â¾¤Î ¤È¤³¤í¤Ç½ñ¤«¤ì¤¿¥³¡¼¥É¤ò»ÈÍѤ·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤ä¡¢¤¢¤Ê¤¿¤Î¥×¥í¥°¥é¥à ¤Î°ìÉô¤òĶÊݼéŪ¤Ê¿Í¤¬½ñ¤¤¤¿¾ì¹ç¤Ê¤É)¤Ï¡¢¤¢¤Ê¤¿¤Îɸ½à³«È¯¼ê½ç¤ÎÃæ¤Ç¥á¥â¥ê ¥ê¡¼¥¯¤Î¸¡½Ð´ï¤ò»È¤¦¤«¡¢¥¬¥Ù¡¼¥¸¥³¥ì¥¯¥¿¤òÁȤ߹þ¤à¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£
¤â¤·¤½¤¦¤·¤¿¤¤¤Ê¤é¡¢¤â¤Á¤í¤órealloc()¤ò»È¤¦¤³¤È¤Ï¤Ç¤¤Þ¤¹¡£ ¤·¤«¤·¡¢realloc()¤Ï¡¢malloc()(¤È¤½¤ì¤ÈƱÎà¤Î´Ø¿ô)¤¬³ä¤êÅö¤Æ¤¿¡¢¥æ¡¼¥¶ÄêµÁ¤Î ¥³¥Ô¡¼¥³¥ó¥¹¥È¥é¥¯¥¿¤ò»ý¤¿¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇÛÎó¤ËÂФ·¤ÆÆ°ºî¤¹¤ë¤³¤È¤¬ÊÝ¾Ú ¤µ¤ì¤Æ¤¤¤ë¤À¤±¤Ç¤¹¡£¤µ¤é¤Ë¡¢realloc()¤Ïñ½ã¤ÊͽÁÛ¤ËÈ¿¤·¤Æ¡¢¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï °ú¿ô¤ÎÇÛÎó¤ò¥³¥Ô¡¼¤¹¤ë¤³¤È¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤ò˺¤ì¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£
C++¤Ç¥á¥â¥ê¤ÎºÆ³ä¤êÅö¤Æ¤ò°·¤¦¤Ë¤Ï¡¢vector¤Î¤è¤¦¤Êɸ½à¥³¥ó¥Æ¥Ê¤ò»ÈÍѤ¹¤ë ¤Î¤¬¤è¤ê¤è¤¤ÊýË¡¤Ç¤¹¡£É¸½à¥³¥ó¥Æ¥Ê¤Ï¼«Á³¤Ë¿Ä¹¤·¤Æ¤¤¤ ¤Þ¤¹¡£
"malloc()"¤Ï´Ø¿ô¤Ç¡¢°ú¿ô¤Ë(¥Ð¥¤¥È)¿ô¤ò¼è¤ê¡¢Ì¤½é´ü²½¤Îµ²±Îΰè¤ò»Ø¤¹void*¤ò ÊÖ¤·¤Þ¤¹¡£"new"¤Ï±é»»»Ò¤Ç¡¢°ú¿ô¤Ë·¿¤È(¥ª¥×¥·¥ç¥ó¤Ç)¤½¤Î·¿¤ËÂФ¹¤ë½é´üÃͤν¸¹ç ¤ò¼è¤ê¡¢¤½¤Î·¿¤Î(¥ª¥×¥·¥ç¥ó¤Ç)½é´ü²½ºÑ¤ß¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤·¤Þ¤¹¡£ ξ¼Ô¤Î°ã¤¤¤Ï¡¢¥æ¡¼¥¶ÄêµÁ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤òñ½ã¤Ç¤Ï¤Ê¤¤½é´ü²½¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤Ç ³ä¤êÅö¤Æ¤ë¤È¤¤Ë¤â¤Ã¤È¤â¤Ï¤Ã¤¤ê¤·¤Þ¤¹¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
class Circle : public Shape {
public:
Cicle(Point c, int r);
// ¥Ç¥Õ¥©¥ë¥È¥³¥ó¥¹¥È¥é¥¯¥¿¤Ê¤·
// ...
};
class X {
public:
X(); // ¥Ç¥Õ¥©¥ë¥È¥³¥ó¥¹¥È¥é¥¯¥¿
// ...
};
void f(int n)
{
void* p1 = malloc(40); // (̤½é´ü²½¤Î)40¥Ð¥¤¥È¤ò³ä¤êÅö¤Æ¤ë
int* p2 = new int[10]; // ̤½é´ü²½¤Îint¤ò10¸Ä³ä¤êÅö¤Æ¤ë
int* p3 = new int(10); // ½é´üÃͤ¬10¤Îint¤ò1¸Ä³ä¤êÅö¤Æ¤ë
int* p4 = new int(); // ½é´üÃͤ¬0¤Îint¤ò1¸Ä³ä¤êÅö¤Æ¤ë
int* p4 = new int; // ̤½é´ü²½¤Îint¤ò1¸Ä³ä¤êÅö¤Æ¤ë
Circle* pc1 = new Circle(Point(0,0),10); // »ØÄꤵ¤ì¤¿°ú¿ô¤ÎÃͤǹ½ÃÛ¤µ¤ì¤¿
// Circle¤ò³ä¤êÅö¤Æ¤ë
Circle* pc2 = new Circle; // ¥Ç¥Õ¥©¥ë¥È¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¤Ê¤¤¤Î¤Ç¥¨¥é¡¼
X* px1 = new X; // ¥Ç¥Õ¥©¥ë¥È¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¹½ÃÛ¤µ¤ì¤¿X¤ò³ä¤êÅö¤Æ¤ë
X* px2 = new X(); // ¥Ç¥Õ¥©¥ë¥È¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¹½ÃÛ¤µ¤ì¤¿X¤ò³ä¤êÅö¤Æ¤ë
X* px2 = new X[10]; // ¥Ç¥Õ¥©¥ë¥È¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¹½ÃÛ¤µ¤ì¤¿X¤ò10¸Ä³ä¤êÅö¤Æ¤ë
// ...
}
"(ÃÍ)"¤È¤¤¤¦É½µ¤Ç½é´üÃͤò»ØÄꤷ¤¿¤È¤¡¢¤½¤ÎÃͤǽé´ü²½¤µ¤ì¤ë¤³¤È¤ËÃíÌܤ·¤Æ ¤¯¤À¤µ¤¤¡£»Äǰ¤Ê¤¬¤é¡¢ÇÛÎó¤Ë¤Ï¤½¤Î¤è¤¦¤Ê»ØÄê¤Ï¤Ç¤¤Þ¤»¤ó¡£Â¿¤¯¤Î¾ì¹ç¡¢vector¤Ï¡¢ ¼«Í³µ²±Îΰè¾å¤Ë³ä¤êÅö¤Æ¤é¤ì¤ëÇÛÎó¤ËÂå¤ï¤ëÍ¥¤ì¤¿ÁªÂò»è¤È¤Ê¤ê¤Þ¤¹¡£(¤¿¤È¤¨¤Ð¡¢ Îã³°°ÂÁ´À¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤)¡£
malloc()¤ò»ÈÍѤ¹¤ë¤È¤¤Ï¤¤¤Ä¤Ç¤â¡¢½é´ü²½¤¹¤ë¤³¤È¤È¡¢ÊÖ¤µ¤ì¤¿¥Ý¥¤¥ó¥¿¤òŬÀÚ ¤Ê·¿¤ØÊÑ´¹¤¹¤ë¤³¤È¤ËÃí°Õ¤òʧ¤ï¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£¤µ¤é¤Ë¡¢É¬ÍפʥХ¤¥È¿ô¤òÀµ¤· ¤¯¼èÆÀ¤·¤¿¤«¤Ë¤âµ¤¤ò¤Ä¤±¤ëɬÍפ¬¤¢¤ë¤Ç¤·¤ç¤¦¡£½é´ü²½¤ò¹Íθ¤ËÆþ¤ì¤¿¾ì¹ç¡¢ malloc()¤Ènew¤È¤Î´Ö¤Ë¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Îº¹¤Ï¤¢¤ê¤Þ¤»¤ó¡£
malloc()¤Ï¥á¥â¥ê¤ÎÉÔ¤ò 0 ¤òÊÖ¤¹¤³¤È¤ÇÄÌÃΤ·¤Þ¤¹¡£new¤Ï¥á¥â¥ê¤Î³ä¤êÅö¤Æ ¤È½é´ü²½¤Î¼ºÇÔ¤òÎã³°¤ò¥¹¥í¡¼¤·¤ÆÄÌÃΤ·¤Þ¤¹¡£
new¤ÇÀ¸À®¤µ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤Ïdelete¤Ç²òÂΤµ¤ì¤Þ¤¹¡£malloc()¤Ç³ä¤êÅö¤Æ¤é¤ì ¤¿¥á¥â¥êÎΰè¤Ïfree()¤Ç²òÊü¤µ¤ì¤Þ¤¹¡£
malloc()¤Ènew¤òƱ¤¸¥×¥í¥°¥é¥à¤ÎÃæ¤Ç»ÈÍѤǤ¤ë¤È¤¤¤¦°ÕÌ£¤Ç¤Ï¡¢Åú¤¨¤Ï¥¤¥¨¥¹ ¤Ç¤¹¡£
malloc()¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤ò³ä¤êÅö¤Æ¤Æ¡¢delete¤Ç²òÊü¤¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¤È¤¤¤¦ °ÕÌ£¤Ç¤Ï¡¢Åú¤¨¤Ï¥Î¡¼¤Ç¤¹¡£new¤Ç³ä¤êÅö¤Æ¤Æ¡¢free()¤Ç²òÊü¤¹¤ë¤³¤È¤â¡¢new¤Ç³ä¤ê Åö¤Æ¤é¤ì¤¿ÇÛÎó¤ËÂФ·¤Ærealloc()¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤¤Þ¤»¤ó¡£
C++¤Î±é»»»Ònew¤Èdelete¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥È¤ÎŬÀÚ¤ÊÀ¸À®¤È²òÂΤòÊݾڤ·¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤È¥Ç¥¹¥È¥é¥¯¥¿¤òµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ë¤È¤³¤í¤Ç¤Ï¡¢ ¤½¤ì¤òµ¯Æ°¤·¤Þ¤¹¡£C¥¹¥¿¥¤¥ë¤Î´Ø¿ô¡¢malloc()¡¢calloc()¡¢free()¡¢realloc()¤Ï¡¢ ¤½¤ì¤òÊݾڤ·¤Þ¤»¤ó¡£¤µ¤é¤Ë¡¢new¤Èdelete¤Ç»ÈÍѤµ¤ì¤ë¥á¥â¥ê¤Î¼èÆÀ¤È²òÊü¤Î¥á¥« ¥Ë¥º¥à¤¬¡¢malloc()¤Èfree()¤Î¤â¤Î¤È¸ß´¹À¤¬¤¢¤ë¤È¤¤¤¦ÊݾڤϤ¢¤ê¤Þ¤»¤ó¡£ ²¾¤Ë¤³¤ì¤é¤òº®ºß¤µ¤»¤¿¥¹¥¿¥¤¥ë¤¬¡¢¤¢¤Ê¤¿¤Î¥·¥¹¥Æ¥à¤Çưºî¤·¤¿¤È¤·¤Æ¤â¡¢º£¤Î ¤È¤³¤í¤½¤ì¤Ïñ¤Ë¡Ö¥é¥Ã¥¡¼¡×¤Ç¤¢¤Ã¤¿¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
¤â¤·realloc()¤ÎɬÍ×À¤ò´¶¤¸¤ë¤Ê¤é(¤½¤¦´¶¤¸¤ë¿Í¤Ï¿¤¤)¡¢É¸½à¥é¥¤¥Ö¥é¥ê ¤Îvector¤ò»È¤¦¤³¤È¤ò¸¡Æ¤¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
// ÆþÎϤ«¤éñ¸ì¤òÆÉ¤ß¹þ¤ó¤Ç¡¢string¤Îvector¤Ë³ÊǼ¤¹¤ë vector<string> words; string s; while (cin>>s && s!=".") words.push_back(s);
vector¤ÏɬÍפ˱þ¤¸¤Æ³ÈÄ¥¤µ¤ì¤Þ¤¹¡£
"Learning Standard C++ as a New Language"¤Ë¤¢¤ëÎã¤ÈµÄÏÀ¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ »ä¤Î½ÐÈÇʪ°ìÍ÷¤«¤é ¥À¥¦¥ó¥í¡¼¥É¤Ç¤¤Þ¤¹¡£
C¤Ç¤Ï¡¢void* ¤ò T* ¤Ø°ÅÌÛ¤ËÊÑ´¹¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¤³¤ì¤Ï°ÂÁ´¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ¼¡¤ÎÎã¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
#include<stdio.h>
int main()
{
char i = 0;
char j = 0;
char* p = &i;
void* q = p;
int* pp = q; /* °ÂÁ´¤Ç¤Ï¤Ê¤¤¡¢C¤Ç¤Ï¹çË¡¡¢C++¤Ç¤ÏÈó¹çË¡ */
printf("%d %d\n",i,j);
*pp = -1; /* &i¤«¤é»Ï¤Þ¤ë¥á¥â¥ê¤ò¾å½ñ¤¤¹¤ë */
printf("%d %d\n",i,j);
}
T ¤ò»Ø¤·¤Æ¤¤¤Ê¤¤¤â¤Î¤ËÂФ·¤Æ T* ¤È¤·¤Æ¤·¤Þ¤¦¤È¡¢Ã×̿Ū¤Ê·ë²Ì¤ò¤â¤¿¤é¤¹¤ª ¤½¤ì¤¬¤¢¤ê¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢C++¤Ç¤Ï¡¢void* ¤«¤é T* ¤òÆÀ¤ë¤Ë¤ÏÌÀ¼¨Åª¤Ê¥¥ã¥¹ ¥È¤¬É¬Íפˤʤê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢Ë¾¤Þ¤·¤¯¤Ï¤Ê¤¤¤±¤ì¤É¤âƱÍͤηë²Ì¤ò¾åµ¤Î¥×¥í¥° ¥é¥à¤ÇÆÀ¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ë½ñ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£
int* pp = (int*)q;
¤¢¤ë¤¤¤Ï¡¢¸¡ºº¤Î¤Ê¤¤·¿ÊÑ´¹¤ò¤¹¤ë¤³¤È¤ò¤â¤Ã¤È¤Ï¤Ã¤¤ê¤È¼¨¤¹¤¿¤á¤Ë¡¢¼¡¤Î¤è ¤¦¤Ë¿·¤·¤¤¥¹¥¿¥¤¥ë¤Î¥¥ã¥¹¥È¤ò»È¤¤¤Þ¤¹¡£
int* pp = static_cast<int*>(q);¥¥ã¥¹¥È¤ÏÈò¤±¤¿Êý¤¬¤è¤¤¤â¤Î¤Ç¤¹¡£
C¤Ç¤³¤Î¤è¤¦¤Ê°ÂÁ´¤Ç¤Ê¤¤ÊÑ´¹¤¬¤â¤Ã¤È¤â¤è¤¯»È¤ï¤ì¤ë¤Î¤Ï¡¢¼¡¤Î¤è¤¦¤Êmalloc()¤Î ·ë²Ì¤òŬ¹ç¤¹¤ë¥Ý¥¤¥ó¥¿¤ËÂåÆþ¤¹¤ë¤È¤¤Ç¤¹¡£
int* p = malloc(sizeof(int));C++¤Ç¤Ï¡¢·¿°ÂÁ´¤Ênew±é»»»Ò¤ò»È¤¤¤Þ¤¹¡£
int* p = new int;¤Ä¤¤¤Ç¤Ë¸À¤¦¤È¡¢new±é»»»Ò¤Ë¤Ï¡¢malloc()¤ËÈæ¤Ù¤Æ¼¡¤Î¤è¤¦¤ÊÍøÅÀ¤¬¤¢¤ê¤Þ¤¹¡£
typedef std::complex<double> cmplx;
/* C¥¹¥¿¥¤¥ë: */
cmplx* p = (cmplx*)malloc(sizeof(int)); /* ¥¨¥é¡¼: ´Ö°ã¤Ã¤¿¥µ¥¤¥º */
/* p==0¤Î¥Æ¥¹¥È¤ò˺¤ì¤Æ¤¤¤ë */
if (*p == 7) { /* ... */ } /* ¤ª¤Ã¤È! *p ¤Î½é´ü²½¤ò˺¤ì¤¿ */
// C++¥¹¥¿¥¤¥ë:
cmplx* q = new cmplx(1,2); // ¥á¥â¥ê¤¬ÉÔ¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢bad_alloc¤¬¥¹¥í¡¼¤µ¤ì¤ë
if (*q == 7) { /* ... */ }
¤¢¤ê¤Þ¤»¤ó¤¬¡¢É¬Íפʤ鼫ʬ¤Ç½ñ¤¯¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤¢¤ëÎΰè¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤òÇÛÃÖ¤¹¤ëplacement new¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
class Arena {
public:
void* allocate(size_t);
void deallocate(void*);
// ...
};
void* operator new(size_t sz, Arena& a)
{
return a.allocate(sz);
}
Arena a1(some arguments);
Arena a2(some arguments);
¤³¤ì¤Ë¤è¤ê¡¢¼¡¤Î¤è¤¦¤Ë½ñ¤¯¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
X* p1 = new(a1) X;
Y* p2 = new(a1) Y;
Z* p3 = new(a2) Z;
// ...
¤·¤«¤·¡¢¤³¤ì¤é¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¸å¤ÇÀµ¤·¤¯²òÊü¤¹¤ë¤Ë¤Ï¤É¤¦¤¹¤ì¤Ð¤è¤¤¤Ç¤·¤ç¤¦¤«¡£
placement new¤ËÂбþ¤¹¤ëÁȤ߹þ¤ß¤Î"placement delete"¤¬¤Ê¤¤Íýͳ¤Ï¡¢¤½¤ì¤¬Àµ¤·¤¯
»ÈÍѤµ¤ì¤ë¤³¤È¤òÊݾڤ¹¤ë°ìÈÌŪ¤ÊÊýË¡¤¬¤Ê¤¤¤«¤é¤Ç¤¹¡£C++¤Î·¿¥·¥¹¥Æ¥à¤Ï¡¢p1 ¤¬
Arena a1¾å¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ò»Ø¤·¤Æ¤¤¤ë¤â¤Î¤À¤È¿äÄê¤Ç¤¤Þ¤»¤ó¡£
¤É¤³¤«Â¾¤Î¤È¤³¤í¤Ç³ä¤êÅö¤Æ¤é¤ì¤¿Ç¤°Õ¤Î X ¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤ò p1 ¤ËÂåÆþ¤¹¤ë¤³¤È¤¬
¤Ç¤¤Æ¤·¤Þ¤¤¤Þ¤¹¡£
¤·¤«¤·¡¢¥×¥í¥°¥é¥Þ¤¬¤É¤³¤Ç³ä¤êÅö¤Æ¤é¤ì¤¿¤«¤òÃΤäƤ¤¤ì¤Ð¡¢ÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£
template<class T> void destroy(T* p, Arena& a)
{
if (p) {
p->~T(); // ÌÀ¼¨Åª¤Ê¥Ç¥¹¥È¥é¥¯¥¿¤Î¸Æ¤Ó½Ð¤·
a.deallocate(p);
}
}
¤³¤ì¤Ç¡¢¼¡¤Î¤è¤¦¤Ë½ñ¤¯¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
destroy(p1,a1);
destroy(p2,a2);
destroy(p3,a3);
Arena¤¬¤É¤Î¤è¤¦¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤òÊÝ»ý¤·¤Æ¤¤¤ë¤«¤òÇİ®¤·¤Æ¤¤¤ì¤Ð¡¢´Ö°ã¤¤¤òËɤ°
¤è¤¦¤Ëdestroy()¤ò½ñ¤¯¤³¤È¤â¤Ç¤¤Þ¤¹¡£
¥×¥í¥°¥é¥ß¥ó¥° ¸À¸ìC++(Special Edition)¤Î15.6¤Ç½Ò¤Ù¤é¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¹³¬ÁؤËÂФ·¤Æ ±é»»»Ònew()¤Èdelete()¤ÎÁȤòÄêµÁ¤¹¤ë¤³¤È¤â¤Ç¤¤Þ¤¹¡£ C++¤ÎÀ߷פȿʲ½¤Î10.4¤È ¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++(Special Edition)¤Î19.4.5¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¼¡¤ÎÎã¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
delete p; // ... delete p;¤â¤· ... ¤ÎÉôʬ¤Ç p ¤Ë¿¨¤ì¤Ê¤±¤ì¤Ð¡¢2²óÌܤÎ"delete p;"¤Ï¡¢C++¤Î¼ÂÁõ¤¬(ÆÃÊÌ ¤ÊͽËɺö¤Ê¤·¤Ë)¸ú²ÌŪ¤ËËɤ°¤³¤È¤Î¤Ç¤¤Ê¤¤¿¼¹ï¤Ê¥¨¥é¡¼¤ò°ú¤µ¯¤³¤·¤Þ¤¹¡£¥¼¥í ¥Ý¥¤¥ó¥¿¤òdelete¤¹¤ë¤³¤È¤ÏÄêµÁ¾å̵³²¤Ç¤¢¤ë¤Î¤Ç¡¢"delete p;"¤¬É¬Íפʤ³¤È¤ò¤· ½ª¤¨¤¿¸å¤Ç"p=0;"¤È¤¹¤ë¤Î¤¬´Êñ¤Ê²ò·èÊýË¡¤Ç¤·¤ç¤¦¡£¤·¤«¤·¡¢C++¤Ï¤½¤¦¤¹¤ë¤³¤È ¤òÊݾڤ·¤Æ¤¤¤Þ¤»¤ó¡£
¤½¤ÎÍýͳ¤Î¤Ò¤È¤Ä¤Ï¡¢delete¤Î¥ª¥Ú¥é¥ó¥É¤Ïº¸ÊÕÃÍ(lvalue)¤Ç¤¢¤ëɬÍפ¬¤Ê¤¤¤È ¤¤¤¦¤³¤È¤Ç¤¹¡£¼¡¤ÎÎã¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
delete p+1; delete f(x);¤³¤ÎÎã¤Ç¤Ï¡¢delete¤Î¼ÂÁõ¤¬¥¼¥í¤òÂåÆþ¤Ç¤¤ë¥Ý¥¤¥ó¥¿¤¬¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¤è¤¦¤Ê Îã¤Ï¤Û¤È¤ó¤É¤Ê¤¤¤«¤â¤·¤ì¤Þ¤»¤ó¤¬¡¢¡Ödelete¤µ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ï 0 ¤Ç¤¢¤ë¡×¤ÈÊݾڤǤ¤Ê¤¤¤³¤È¤ò°Å¼¨¤·¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢¤Ò¤È¤Ä¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò»Ø ¤¹¥Ý¥¤¥ó¥¿¤¬¤Õ¤¿¤Ä¤¢¤ë¤È¡¢¤³¤Î¡Öµ¬Â§¡×¤ò´Êñ¤Ë»¤¤êÈ´¤±¤ë¤³¤È¤¬¤Ç¤¤Æ¤·¤Þ¤¤ ¤Þ¤¹¡£
T* p = new T; T* q = p; delete p; delete q; // ¤·¤Þ¤Ã¤¿!C++¤Ï¡¢delete¤Î¼ÂÁõ¤¬º¸ÊÕÃͤΥª¥Ú¥é¥ó¥É¤ò¥¯¥ê¥¢¤¹¤ë¤³¤È¤ò¤Ï¤Ã¤¤ê¤Èǧ¤á¤Æ¤¤ ¤Æ¡¢»ä¤Ï¤½¤¦¼ÂÁõ¤µ¤ì¤ë¤À¤í¤¦¤È´üÂÔ¤·¤Æ¤¤¤Þ¤·¤¿¤¬¡¢¤³¤Î¥¢¥¤¥Ç¥¢¤Ï¡¢¼ÂÁõ¼Ô¤Ë ¤ÏɾȽ¤¬¤è¤¯¤Ê¤«¤Ã¤¿¤è¤¦¤Ç¤¹¡£
¤â¤·¥Ý¥¤¥ó¥¿¤ò¥¯¥ê¥¢¤¹¤ë¤³¤È¤¬½ÅÍפǤ¢¤ë¤È»×¤¦¤Ê¤é¡¢¼¡¤Î¤è¤¦¤Êdestroy´Ø ¿ô¤Î»ÈÍѤò¸¡Æ¤¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
template<class T> inline void destroy(T*& p) { delete p; p = 0; }
¤³¤ì¤¬¡¢É¸½à¥é¥¤¥Ö¥é¥ê¥³¥ó¥Æ¥Ê¤ä¥Ï¥ó¥É¥ë¤Ê¤É¤ò»È¤Ã¤Æ¡¢new¤Èdelete¤ÎÌÀ¼¨Åª ¤Ê»ÈÍѤòºÇ¾®¸Â¤ËÍÞ¤¨¤ë¤â¤¦¤Ò¤È¤Ä¤ÎÍýͳ¤Ç¤¹¡£
¤µ¤é¤Ë¡¢¥Ý¥¤¥ó¥¿¤ò(¥¯¥ê¥¢¤Ç¤¤ë¤è¤¦¤Ë)»²¾ÈÅϤ·¤Ë¤¹¤ë¤³¤È¤Ç¡¢destroy()¤¬ ±¦ÊÕÃÍ(rvalue)¤ËÂФ·¤Æ¸Æ¤Ó½Ð¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤È¤¤¤¦ÍøÅÀ¤¬¤¢¤ë¤³¤È¤ËÃíÌܤ· ¤Æ¤¯¤À¤µ¤¤¡£
int* f(); int* p; // ... destroy(f()); // ¥¨¥é¡¼: ±¦ÊÕÃͤòÈóconst»²¾È¤ÇÅϤ½¤¦¤È¤·¤Æ¤¤¤ë destroy(p+1); // ¥¨¥é¡¼: ±¦ÊÕÃͤòÈóconst»²¾È¤ÇÅϤ½¤¦¤È¤·¤Æ¤¤¤ë
»þ´Ö¤È¶õ´Ö¤ÎÅÀ¤«¤é¸«¤ë¤È¡¢ÇÛÎó¤Ï¥á¥â¥ê¾å¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ÎʤӤ˥¢¥¯¥»¥¹¤¹ ¤ë¤Ë¤Ï¤Û¤ÜºÇŬ¤Ë¶á¤¤¥Ç¡¼¥¿¹½Â¤¤Ç¤¹¡£¤·¤«¤·¡¢ÇÛÎó¤Ï¸íÍѤȥ¨¥é¡¼¤Î²ÄǽÀ¤¬ÂçÊÑ ¹â¤¤¡¢Èó¾ï¤ËÄã¥ì¥Ù¥ë¤Ê¥Ç¡¼¥¿¹½Â¤¤Ç¤â¤¢¤ê¡¢¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤Î¾ì¹ç¤Ë¤ª¤¤¤Æ¡¢ÇÛÎó ¤ËÂå¤ï¤ëÍ¥¤ì¤¿ÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£¡ÖÍ¥¤ì¤¿¡×¤È¤¤¤¦¤Î¤Ï¡¢ÆÉ¤ß½ñ¤¤·¤ä¤¹¤¯¡¢¥¨¥é¡¼ ¤¬µ¯¤³¤ê¤Ë¤¯¤¯¡¢ÇÛÎó¤ÈƱ¤¸¤¯¤é¤¤Â®¤¤¡¢¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£
ÇÛÎó¤Ë¤Ï¼¡¤Î¤Õ¤¿¤Ä¤Î´ðËÜŪ¤ÊÌäÂ꤬¤¢¤ê¤Þ¤¹¡£
void f(int a[], int s)
{
// a ¤ËÂФ·¤Æ²¿¤«½èÍý¤¹¤ë¡£a ¤Î¥µ¥¤¥º¤Ï s ¤Ç¤¢¤ë
for (int i = 0; i<s; ++i) a[i] = i;
}
int arr1[20];
int arr2[10];
void g()
{
f(arr1,20);
f(arr2,20);
}
2ÈÖÌܤδؿô¸Æ¤Ó½Ð¤·¤Ï¡¢arr2¤Ë°¤µ¤Ê¤¤¥á¥â¥ê¾å¤ò½ñ¤»¶¤é¤«¤·¤Æ¤·¤Þ¤¦¤Ç¤·¤ç¤¦¡£
¤â¤Á¤í¤ó¡¢¥×¥í¥°¥é¥Þ¤ÏÉáÄ̤ϥµ¥¤¥º¤òÀµ¤·¤¯°·¤¤¤Þ¤¹¤¬¡¢¤½¤ì¤Ï;·×¤Ê»Å»ö¤Ç¡¢
²¿Å٤Ǥâ´Ö°ã¤¤¤òÈȤ·¤Þ¤¹¡£»ä¤Ïɸ½à¥é¥¤¥Ö¥é¥êvector¤ò»ÈÍѤ·¤¿¡¢¤â¤Ã¤È´Êñ¤Ç
¤Ï¤Ã¤¤ê¤·¤¿ÊýË¡¤ò¹¥¤ó¤Ç¤¤¤Þ¤¹¡£
void f(vector<int>& v)
{
// v ¤ËÂФ·¤Æ²¿¤«¤¹¤ë
for (int i = 0; i<v.size(); ++i) v[i] = i;
}
vector<int> v1(20);
vector<int> v2(10);
void g()
{
f(v1);
f(v2);
}
ÇÛÎó¤Ï¼«¿È¤Î¥µ¥¤¥º¤òÃΤé¤Ê¤¤¤Î¤Ç¡¢ÇÛÎó¤ÎÂåÆþ¤Ï¤¢¤ê¤Þ¤»¤ó¡£
void f(int a[], int b[], int size)
{
a = b; // ÇÛÎó¤ÎÂåÆþ¤Ç¤Ï¤Ê¤¤
memcpy(a,b,size); // a = b
// ...
}
¤â¤¦°ìÅÙ¸À¤¤¤Þ¤¹¤¬¡¢»ä¤Ïvector¤ò¹¥¤ó¤Ç¤¤¤Þ¤¹¡£
void g(vector<int>& a, vector<int>& b, int size)
{
a = b;
// ...
}
vector¤Î¤â¤¦¤Ò¤È¤Ä¤ÎÍøÅÀ¤Ï¡¢memcpy()¤Ïstring¤Î¤è¤¦¤Ê¥³¥Ô¡¼¥³¥ó¥¹¥È¥é¥¯¥¿¤ò
»ý¤ÄÍ×ÁǤËÂФ·¤Æ¤Ï¡¢Àµ¤·¤¯Æ°ºî¤·¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
void f(string a[], string b[], int size)
{
a = b; // ÇÛÎó¤ÎÂåÆþ¤Ç¤Ï¤Ê¤¤
memcpy(a,b,size); // Âç»´»ö
// ...
}
void g(vector<string>& a, vector<string>& b, int size)
{
a = b;
// ...
}
ÇÛÎó¤Ï¸ÇÄêĹ¤Ç¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥µ¥¤¥º¤¬·èÄꤵ¤ì¤Þ¤¹¡£
const int S = 10;
void f(int s)
{
int a1[s]; // ¥¨¥é¡¼
int a2[S]; // OK
// a2 ¤ò³ÈÄ¥¤·¤¿¤¤¾ì¹ç¡¢malloc()¤ò»ÈÍѤ·¤Æ¼«Í³µ²±Îΰè¾å¤Ë
// ³ä¤êÅö¤Æ¤¿ÇÛÎó¤ËÊѹ¹¤·¡¢realloc()¤ò»ÈÍѤ¹¤ë
// ...
}
¼¡¤ÎÎã¤ÈÈæ¤Ù¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
const int S = 10;
void g(int s)
{
vector<int> v1(s); // OK
vector<int> v2(S); // OK
v2.resize(v2.size()*2);
// ...
}
C99¤Ï¥í¡¼¥«¥ë¤ÊÇÛÎ󤬲ÄÊÑĹÇÛÎó¤Ë¤Ê¤ë¤³¤È¤òǧ¤á¤Æ¤¤¤Þ¤¹¤¬¡¢VLA(ÌõÃí: Variable
Length Array)¤Ë¤ÏÆÈ¼«¤ÎÌäÂ꤬¤¢¤ê¤Þ¤¹¡£
ÇÛÎó̾¤¬¥Ý¥¤¥ó¥¿¤Ë¡Ö³Ê²¼¤²(dacay)¡×¤µ¤ì¤ë¤³¤È¤Ï¡¢C¤ÈC++¤Ë¤È¤Ã¤Æ·ç¤«¤»¤Ê¤¤ ¤â¤Î¤Ç¤¹¡£¤·¤«¤·¡¢ÇÛÎó¤Î³Ê²¼¤²¤Ï·Ñ¾µ¤ÈÈó¾ï¤ËÁêÀ¤¬°¤¤¤Ç¤¹¡£¼¡¤ÎÎã¤ò¹Í¤¨¤Æ ¤ß¤Æ¤¯¤À¤µ¤¤¡£
class Base { void fct(); /* ... */ };
class Derived { /* ... */ };
void f(Base* p, int sz)
{
for (int i=0; i<sz; ++i) p[i].fct();
}
Base ab[20];
Derived ad[20];
void g()
{
f(ab,20);
f(ad,20); // Âç»´»ö!
}
ºÇ¸å¤Î´Ø¿ô¸Æ¤Ó½Ð¤·¤Ç¡¢Derived[]¤ÏBase[]¤È¤·¤Æ°·¤ï¤ì¡¢sizeof(Derived)!=sizeof(Base)¤Î
¾ì¹ç(ÂçÄñ¤½¤¦¤Ê¤ë¤Ç¤·¤ç¤¦)¡¢Åº»ú»ØÄê¤Ï¤â¤¦Àµ¤·¤¯Æ¯¤¤Þ¤»¤ó¡£
Âå¤ê¤Ëvector¤ò»ÈÍѤ·¤¿¤Ê¤é¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥¨¥é¡¼¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£
void f(vector<Base>& v)
{
for (int i=0; i<v.size(); ++i) v[i].fct();
}
vector<Base> ab(20);
vector<Derived> ad(20);
void g()
{
f(ab);
f(ad); // ¥¨¥é¡¼: vector<Derived>¤òvector<Base>¤ËÊÑ´¹¤Ç¤¤Ê¤¤
}
C¤ÈC++¤Ë¤ª¤¤¤Æ¡¢½é¿´¼Ô¤¬ÈȤ¹¶Ã¤¯¤Û¤É¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¥¨¥é¡¼¤Ï¡¢ÇÛÎó¤Î
»ÈÍÑ(¸íÍÑ)¤Ë´ØÏ¢¤·¤¿¤â¤Î¤À¤È¡¢»ä¤Ï»×¤¤¤Þ¤¹¡£
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++¤Î 8.3Àá¡¢14¾Ï¡¢ÉÕÏ¿E¤ò »²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ÉÕÏ¿¤Ç¤Ï¡¢Í×µá¤Î¸·¤·¤¤¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÃæ¤ÇÎã³°°ÂÁ´(exception-safe)¤Ê ¥³¡¼¥É¤ò½ñ¤¯¥Æ¥¯¥Ë¥Ã¥¯¤ò½ÅÅÀŪ¤Ë°·¤Ã¤Æ¤¤¤Þ¤¹¡£½é¿´¼Ô¸þ¤±¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
C++¤Ç¤Ï¡¢Îã³°¤Ï¥í¡¼¥«¥ë¤ÇÂнè¤Ç¤¤Ê¤¤¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤³¤È¤òÃΤ餻¤ë¤¿¤á¤Ë »ÈÍѤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤ÎÃæ¤Ç¥ê¥½¡¼¥¹¼èÆÀ¤Ë¼ºÇÔ¤·¤¿¤È¤¤¤¦¤è¤¦ ¤Ê¾õ¶·¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
class Vector {
int sz;
int* elem;
class Range_error { };
public:
Vector(int s) : sz(s) { if (sz<0) throw Range_error(); /* ... */ }
// ...
};
Îã³°¤òñ¤Ë´Ø¿ô¤«¤éÃͤòÊÖ¤¹Âå¤ï¤ê¤ÎÊýË¡¤È¤·¤Æ»È¤ï¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤Û¤È¤ó¤É¤Î
¥æ¡¼¥¶¤Ï(¸À¸ì¤ÎÄêµÁ¤¬¤½¤¦¤¹¤ë¤è¤¦´«¤á¤Æ¤¤¤ë¤Î¤Ç)¡¢Îã³°½èÍý¥³¡¼¥É¤Ï¥¨¥é¡¼½èÍý
¥³¡¼¥É¤Ç¤¢¤ë¤È¤ß¤Ê¤·¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢¼ÂÁõ¤Ï¤½¤Î¤è¤¦¤ÊÁÛÄê¤òÈ¿±Ç¤·¤ÆºÇŬ²½¤µ¤ì
¤Þ¤¹¡£
¥ê¥½¡¼¥¹¼èÆÀ¤Ï½é´ü²½¤Ç¤¢¤ë(Resource Acquisiton Is Initialization: RAII¤È¾Êά¤µ¤ì¤ë¤³¤È¤â¤¢¤ë)¤È¸Æ¤Ð¤ì¤ë½ÅÍפʥƥ¯¥Ë¥Ã¥¯¤¬¤¢¤ê ¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥Ç¥¹¥È¥é¥¯¥¿¤ò»ý¤Ä¥¯¥é¥¹¤Ë¥ê¥½¡¼¥¹´ÉÍý¤ò¤µ¤»¤ë¤È¤¤¤¦¤â¤Î¤Ç¤¹¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
void fct(string s)
{
File_handle f(s,"r"); // File_handle¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¥Õ¥¡¥¤¥ë "s" ¤ò¥ª¡¼¥×¥ó¤¹¤ë
// f ¤ò»ÈÍѤ¹¤ë
} // ¤³¤³¤ÇFile_handle¤Î¥Ç¥¹¥È¥é¥¯¥¿¤¬¥Õ¥¡¥¤¥ë¤ò¥¯¥í¡¼¥º¤¹¤ë
¤â¤·¡¢fct()¤Î¡Öf ¤ò»ÈÍѤ¹¤ë¡×¤ÎÉôʬ¤ÇÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤Æ¤â¡¢¥Ç¥¹¥È¥é¥¯¥¿¤¬µ¯Æ°
¤µ¤ì¡¢¥Õ¥¡¥¤¥ë¤Ï¤¤Á¤ó¤È¥¯¥í¡¼¥º¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¼¡¤Î¤è¤¦¤Ê¤è¤¯¤¢¤ë´í¸±¤Ê
»ÈÍÑË¡¤È¤ÏÂоÈŪ¤Ç¤¹¡£
void old_fct(const char* s)
{
FILE* f = fopen(s,"r"); // ¥Õ¥¡¥¤¥ë "s" ¤ò¥ª¡¼¥×¥ó¤¹¤ë
// f ¤ò»ÈÍѤ¹¤ë
fclose(f); // ¥Õ¥¡¥¤¥ë¤ò¥¯¥í¡¼¥º¤¹¤ë
}
old_fct()¤Î¡Öf ¤ò»ÈÍѤ¹¤ë¡×¤ÎÉôʬ¤ÇÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç(¤¢¤ë¤¤¤Ïñ¤Ë´Ø¿ô¤«
¤éÉüµ¢¤·¤Æ¤â)¡¢¥Õ¥¡¥¤¥ë¤Ï¥¯¥í¡¼¥º¤µ¤ì¤Þ¤»¤ó¡£¤µ¤é¤Ë¡¢C ¥×¥í¥°¥é¥à¤Ç¤Ïlongjmp()¤Î
»ÈÍѤâ´í¸±¤Ç¤¹¡£
¤³¤Î¼ÁÌä¤Ï¸À¤¤´¹¤¨¤ë¤È¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£Îã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì½ê¤ËÌá¤ê¡¢ ¤½¤³¤«¤é¼Â¹Ô¤ò³¤±¤ë¥×¥ê¥ß¥Æ¥£¥Ö¤¬C++¤Ë¤Ê¤¤¤Î¤Ï¤Ê¤¼¤Ç¤¹¤«¡£
´ðËÜŪ¤Ë¡¢Îã³°¥Ï¥ó¥É¥é¤«¤éÌá¤Ã¤Æ¼Â¹Ô¤òºÆ³«¤¹¤ë¤È¤¤Ë¡¢Îã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿ ¾ì½ê¤Î¸å¤Î¥³¡¼¥É¤¬¡¢²¿»ö¤â¤Ê¤«¤Ã¤¿¤«¤Î¤è¤¦¤Ë¼Â¹Ô¤ò·Ñ³¤¹¤ë¤è¤¦¤ËÂн褵¤ì¤Æ ¤¤¤ë¤È¤¤¤¦³Î¾Ú¤Ï¤¢¤ê¤Þ¤»¤ó¡£Îã³°¥Ï¥ó¥É¥é¤ÏºÆ³«¤¹¤ëÁ°¤Ë¡¢¥³¥ó¥Æ¥¥¹¥È¤¬¤É¤ì ¤À¤±¡ÖÀµ¤·¤¤¡×¤«¤òÃΤ뤳¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£ ¤½¤Î¤è¤¦¤Ê¥³¡¼¥É¤òÀµ¤·¤¯Æ°ºî¤µ¤»¤ë¤Ë¤Ï¡¢Îã³°¤ò¥¹¥í¡¼¤¹¤ë¦¤È¥¥ã¥Ã¥Á¤¹¤ë¦¤¬¡¢ ¤ª¸ß¤¤¤Î¥³¡¼¥É¤È¥³¥ó¥Æ¥¥¹¥È¤Î¾ÜºÙ¤òÃΤäƤ¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢ºÆ³«¤¬ ǧ¤á¤é¤ì¤Æ¤¤¤ë¤È¤³¤í¤Ê¤é¤É¤³¤Ç¤â¡¢¿¼¹ï¤Ê¥á¥¤¥ó¥Æ¥Ê¥ó¥¹¾å¤ÎÌäÂê¤È¤Ê¤ëÊ£»¨¤Ê Áê¸ß°Í¸À¤òÀ¸¤¸¤µ¤»¤Þ¤¹¡£
»ä¤ÏC++¤ÎÎã³°½èÍý¥á¥«¥Ë¥º¥à¤òÀ߷פ·¤¿¤È¤¤Ë¡¢½èÍý¤ÎºÆ³«¤òǧ¤á¤ë¤³¤È¤Î ¼Â¸½À¤Ë¤Ä¤¤¤Æ¤«¤Ê¤ê¸¡Æ¤¤·¤Þ¤·¤¿¡£¤½¤·¤Æ¤³¤ÎÌäÂê¤Ï¡¢É¸½à²½ºî¶È¤ÎÃæ¤Ç¤«¤Ê¤ê ¾ÜºÙ¤ËµÄÏÀ¤µ¤ì¤Þ¤·¤¿¡£C++¤Î À߷פȿʲ½¤ÎÎã³°½èÍý¤Î¾Ï¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
Îã³°¤ò¥¹¥í¡¼¤¹¤ëÁ°¤ËÌäÂê¤ò²ò·è¤Ç¤¤ë¤«¤É¤¦¤«³Î¤«¤á¤¿¤¤¾ì¹ç¤Ï¡¢Àè¤Ë¤½¤ì¤ò ³Îǧ¤¹¤ë´Ø¿ô¤ò¸Æ¤ó¤Ç¡¢¤½¤ÎÌäÂê¤ò¤½¤³¤Ç°·¤¦¤³¤È¤¬¤Ç¤¤Ê¤¤¤È¤¤À¤±Îã³°¤ò¥¹¥í¡¼ ¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£new_handler¤¬¤½¤Î°ìÎã¤Ç¤¹¡£
C++¤¬¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤«¤é¤Ç¡¢¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢"finally"¤è¤ê ¤âÍ¥¤ì¤Æ¤¤¤Þ¤¹¡£¤½¤ì¤Ï¡Ö¥ê¥½¡¼¥¹¼èÆÀ¤Ï½é´ü²½¤Ç¤¢¤ë¡×¤È¸Æ¤Ð¤ì¤ë¥Æ¥¯¥Ë¥Ã¥¯(¥×¥í ¥°¥é¥ß¥ó¥°¸À¸ìC++Âè3ÈÇ 14.4Àá)¤Ç¤¹¡£¤³¤Î¥Æ¥¯¥Ë¥Ã¥¯¤Ï¡¢¥ê¥½¡¼¥¹¤ò¥í¡¼¥«¥ë¥ª¥Ö ¥¸¥§¥¯¥È¤ò»È¤Ã¤ÆÉ½¸½¤¹¤ë¤³¤È¤Ç¡¢¤½¤Î¥Ç¥¹¥È¥é¥¯¥¿¤¬¥ê¥½¡¼¥¹¤ò²òÊü¤·¤Æ¤¯¤ì¤ë ¤È¤¤¤¦¥¢¥¤¥Ç¥¢¤Ë´ð¤¤¤Æ¤¤¤Þ¤¹¡£¤³¤¦¤¹¤ë¤³¤È¤Ç¡¢¥×¥í¥°¥é¥Þ¤Ï¥ê¥½¡¼¥¹¤Î²òÊü¤ò ˺¤ì¤º¤ËºÑ¤ß¤Þ¤¹¡£¼¡¤ÎÎã¤ò¸«¤Æ¤¯¤À¤µ¤¤¡£
class File_handle {
FILE* p;
public:
File_handle(const char* n, const char* a)
{ p = fopen(n,a); if (p==0) throw Open_error(errno); }
File_handle(FILE* pp)
{ p = pp; if (p==0) throw Open_error(errno); }
~File_handle() { fclose(p); }
operator FILE*() { return p; }
// ...
};
void f(const char* fn)
{
File_handle f(fn,"rw"); // fn ¤òÆÉ¤ß¹þ¤ß¤È½ñ¤¹þ¤ß¥â¡¼¥É¤Ç¥ª¡¼¥×¥ó¤¹¤ë
// f ¤òÄ̤·¤Æ¥Õ¥¡¥¤¥ë¤òÁàºî¤¹¤ë
}
¤¢¤ë¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¥ê¥½¡¼¥¹¤´¤È¤Ë¡Ö¥ê¥½¡¼¥¹¥Ï¥ó¥É¥ë¡×¥¯¥é¥¹¤¬É¬Íפˤʤê¤Þ¤¹¡£
¤·¤«¤·¡¢¸Ä¡¹¤Î¥ê¥½¡¼¥¹¼èÆÀ¤ËÂФ·¤Æ"finally"Àá¤òµ½Ò¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£
¸½¼Â¤Î¥·¥¹¥Æ¥à¤Ç¤Ï¡¢¥ê¥½¡¼¥¹¤Î¼ïÎà¤è¤ê¤â¥ê¥½¡¼¥¹¤ò¼èÆÀ¤¹¤ë¾ìÌ̤ÎÊý¤¬¤Ï¤ë¤«¤Ë
¿¤¤¤Î¤Ç¡¢¡Ö¥ê¥½¡¼¥¹¼èÆÀ¤Ï½é´ü²½¤Ç¤¢¤ë¡×¥Æ¥¯¥Ë¥Ã¥¯¤ò»ÈÍѤ¹¤ë¤È¡¢"finally"¹½Ê¸
¤ò»ÈÍѤ¹¤ë¤è¤ê¤â¥³¡¼¥ÉÎ̤¬¾¯¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++ ÉÕÏ¿E¤Î¥ê¥½¡¼¥¹ ´ÉÍý¤ÎÎã¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìC++¤ÎÉÕÏ¿E¤Ë ÍÑÎã¤È¾Ü¤·¤¤ÀâÌÀ¤¬¤¢¤ë¤Î¤Ç¡¢¤½¤Á¤é¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
Ãí°Õ: »þ´ÖÀ©Ìó¤Ë¸·¤·¤¤¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Îã³°¤ò»ÈÍѤǤ¤Ê¤¤¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ the JSF air vehicle C++ coding standards¤Ë¼ÂÎ㤬¤¢¤ë¤Î¤Ç¡¢¤½¤Á¤é¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¼¡¤ÎÄêµÁ¤Ï¡¢
void main() { /* ... */ }
¸½ºß¤Ç¤â¡¢¤³¤ì¤Þ¤Ç¤Ë¤ª¤¤¤Æ¤âC++¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£C ¤Ç¤µ¤¨¤â¤¢¤ê¤Þ¤»¤ó¡£ISO C++ɸ½à¤Î3.6.1[2]¡¢¤¢¤ë¤¤¤ÏISO Cɸ½à¤Î5.1.2.2.1¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ »ÅÍͤ˽àµò¤·¤¿¼ÂÁõ¤Ï¡¢
int main() { /* ... */ }
¤È
int main(int argc, char* argv[]) { /* ... */ }
¤ò¼õ¤±Æþ¤ì¤Þ¤¹¡£
»ÅÍͤ˽àµò¤·¤¿¼ÂÁõ¤Ï¡¢¤â¤Ã¤È¿¤¯¤Îmain()¤Î¥Ð¡¼¥¸¥ç¥ó¤òµ¬Äꤹ¤ë¤«¤â¤·¤ì¤Þ ¤»¤¬¡¢Ìá¤êÃͤη¿¤Ïint¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£main()¤¬ÊÖ¤¹int¤Ï¡¢main()¤òµ¯Æ° ¤·¤¿¡Ö¥·¥¹¥Æ¥à¡×¤Ë¡¢¥×¥í¥°¥é¥à¤¬ÃͤòÊÖ¤¹¤¿¤á¤Î¤â¤Î¤Ç¤¹¡£¤½¤Î¤è¤¦¤Êµ¡Ç½¤òÄó ¶¡¤·¤Æ¤¤¤Ê¤¤¥·¥¹¥Æ¥à¤Ç¤ÏÌá¤êÃͤÏ̵»ë¤µ¤ì¤Þ¤¹¤¬¡¢"void main()"¤ò¹çË¡¤ÊC++¡¢ ¹çË¡¤Ê C ¤Ë¤¹¤ë¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤¢¤Ê¤¿¤Î¥³¥ó¥Ñ¥¤¥é¤¬"void main()"¤ò¼õ¤± Æþ¤ì¤¿¤È¤·¤Æ¤â¡¢»ÈÍѤ·¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤«¡¢C ¥×¥í¥°¥é¥Þ¤ÈC++¥×¥í¥°¥é¥Þ¤«¤é̵ÃÎ ¤È»×¤ï¤ì¤ë¤³¤È¤ò³Ð¸ç¤Î¾å¤Ç»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£
C++¤Ç¤Ï¡¢main()¤Ïreturnʸ¤òÌÀ¼¨Åª¤Ë´Þ¤àɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤½¤Î¤è¤¦¤Ê¾ì¹ç¡¢ ÃÍ 0 ¤òÊÖ¤·¡¢¼Â¹Ô¤¬À®¸ù¤·¤¿¤³¤È¤òɽ¤·¤Þ¤¹¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
#include<iostream>
int main()
{
std::cout << "This program returns the integer value 0\n";
}
ISO C++¤ÈC99¤Î¤É¤Á¤é¤â¡¢Àë¸À¤Ë·¿¤ò»ØÄꤷ¤Ê¤¤¤³¤È¤Ïǧ¤á¤Æ¤¤¤Þ¤»¤ó¡£¤Ä¤Þ¤ê¡¢ C89¤ÈARM C++¤È¤ÏÂоÈŪ¤Ë¡¢Àë¸À¤Ë·¿¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï"int"¤È¤ß¤Ê¤µ¤ì¤Þ ¤»¤ó¡£¤·¤¿¤¬¤Ã¤Æ¡¢¼¡¤Î¥³¡¼¥É¤Ï¡¢
#include<iostream>
main() { /* ... */ }
main()¤ËÌá¤êÃͤη¿¤Î»ØÄ꤬¤Ê¤¤¤Î¤Ç¥¨¥é¡¼¤Ë¤Ê¤ê¤Þ¤¹¡£
¤Û¤È¤ó¤É¤Î±é»»»Ò¤Ï¥×¥í¥°¥é¥Þ¤¬¥ª¡¼¥Ð¡¼¥í¡¼¥É¤Ç¤¤Þ¤¹¡£Îã³°¤Ï°Ê²¼¤Î±é»»»Ò ¤Ç¤¹¡£
. (¥É¥Ã¥È) :: ?: sizeof?: ¤Î¥ª¡¼¥Ð¡¼¥í¡¼¥É¤òǧ¤á¤Ê¤¤º¬ËÜŪ¤ÊÍýͳ¤Ï¤¢¤ê¤Þ¤»¤ó¡£3¹à±é»»»Ò¤ò¥ª¡¼¥Ð¡¼ ¥í¡¼¥É¤¹¤ëÆÃÊ̤ʥ±¡¼¥¹¤òƳÆþ¤¹¤ëɬÍ×À¤Ï»×¤¤Åö¤¿¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£ expr1?expr2:expr3¤ò¥ª¡¼¥Ð¡¼¥í¡¼¥É¤¹¤ë´Ø¿ô¤¬¡¢expr2¤Èexpr3¤Î ¤É¤Á¤é¤«¤Ò¤È¤Ä¤À¤±¼Â¹Ô¤¹¤ë¤³¤È¤òÊݾڤǤ¤Ê¤«¤Ã¤¿¤È¤¤¤¦¤³¤È¤ËÃíÌܤ·¤Æ¤¯¤À ¤µ¤¤¡£
sizeof¤ÏÁȤ߹þ¤ß¤Î±é»»»Ò¤Ç¤¢¤ë¤¿¤á¡¢¥ª¡¼¥Ð¡¼¥í¡¼¥É¤Ç¤¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢ ÇÛÎó¤Ø¤Î¥Ý¥¤¥ó¥¿¤Î¥¤¥ó¥¯¥ê¥á¥ó¥È¤Ï¡¢°ÅÌۤΤ¦¤Á¤Ë¤³¤ì¤Ë°Í¸¤·¤Æ¤¤¤Þ¤¹¡£ ¼¡¤ÎÎã¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
X a[10]; X* p = &a;[3]; X* q = &a;[3]; p++; // p ¤Ïa[4]¤ò»Ø¤¹ // ¤½¤Î·ë²Ì¡¢p ¤ÎÀ°¿ôÃÍ¤Ï // q ¤ÎÀ°¿ôÃͤè¤ê¤âsizeof(X)¤À¤±Â礤¤¤Ï¤º¤·¤¿¤¬¤Ã¤Æ¡¢´ðËÜŪ¤Ê¸À¸ì¤Îµ¬Â§¤ËÈ¿¤·¤Ê¤¤¤Ç¡¢¥×¥í¥°¥é¥Þ¤¬sizeof(X)¤Ë¿·¤·¤¤ °Û¤Ê¤ë°ÕÌ£¤òÍ¿¤¨¤ë¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£
N::m¤Ï¡¢N ¤È m ¤Î¤É¤Á¤é¤âÃͤò»ý¤Ä¼°¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£N ¤È m ¤Ï¥³¥ó¥Ñ¥¤¥é¤¬ ¼±Ê̤¹¤ë̾Á°¤Ç¤¢¤ê¡¢:: ¤Ï¼°¤Îɾ²Á¤Ç¤Ï¤Ê¤¯¡¢(¥³¥ó¥Ñ¥¤¥ë»þ¤Î)¥¹¥³¡¼¥×²ò·è¤ò ¹Ô¤¤¤Þ¤¹¡£x::y¤Î x ¤¬Ì¾Á°¶õ´Ö¤ä¥¯¥é¥¹¤Ç¤Ï¤Ê¤¯¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¤è¤¦¤Ê :: ±é»»»Ò¤Î¥ª¡¼¥Ð¡¼¥í¡¼¥É¤òǧ¤á¤ë¤³¤È¤¬¹Í¤¨¤é¤ì¤ë¤Ç¤·¤ç¤¦¤¬¡¢- ¸«¤¿ÌܤËÈ¿¤·¤Æ - (expr::expr¤òǧ¤á¤ë¤¿¤á¤Ë)¿·¤·¤¤¹½Ê¸¤òƳÆþ¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£ ¤½¤Î¤è¤¦¤ÊÊ£»¨¤µ¤¬¤É¤Î¤è¤¦¤ÊÍø±×¤ò¤â¤¿¤é¤¹¤«¤Ï¤Ã¤¤ê¤·¤Þ¤»¤ó¡£
±é»»»Ò . (¥É¥Ã¥È)¤Ï¡¢¸¶ÍýŪ¤Ë¤Ï -> ±é»»»Ò¤ÈƱ¤¸¥Æ¥¯¥Ë¥Ã¥¯¤ò»È¤Ã¤Æ¥ª¡¼¥Ð¡¼ ¥í¡¼¥É¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¤Ç¤·¤ç¤¦¡£¤·¤«¤·¡¢¤½¤¦¤¹¤ë¤È¡¢¤½¤Î¥ª¥Ú¥ì¡¼¥·¥ç¥ó¤¬ . ¤ò ¥ª¡¼¥Ð¡¼¥í¡¼¥É¤·¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ¹¤ë¤â¤Î¤Ê¤Î¤«¡¢. ¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤ë ¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ¹¤ë¤â¤Î¤Ê¤Î¤«¡¢¤È¤¤¤¦ÌäÂ꤬µ¯¤³¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
class Y {
public:
void f();
// ...
};
class X { // . ¤ò¥ª¡¼¥Ð¡¼¥í¡¼¥É¤Ç¤¤ë¤È²¾Äꤹ¤ë
Y* p;
Y& operator.() { return *p; }
void f();
// ...
};
void g(X& x)
{
x.f(); // X::f ¤Ê¤Î¤« Y::f ¤Ê¤Î¤«¡¢¤½¤ì¤È¤â¥¨¥é¡¼¡©
}
¤³¤ÎÌäÂê¤Ï¤¤¤¯¤Ä¤«¤ÎÊýË¡¤Ç²ò·è¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£É¸½à²½¤Î»þÅÀ¤Ç¤Ï¡¢¤É¤Î
ÊýË¡¤¬ºÇÁ±¤Ç¤¢¤ë¤«¤Ï¤Ã¤¤ê¤·¤Þ¤»¤ó¤Ç¤·¤¿¡£¾ÜºÙ¤Ï¡¢C++¤ÎÀ߷פȿʲ½¤ò»²¾È¤·¤Æ
¤¯¤À¤µ¤¤¡£
»Äǰ¤Ç¤¹¤¬¡¢¤Ç¤¤Þ¤»¤ó¡£¤½¤ì¤¬¼Â¸½¤Ç¤¤ë¤«²¿ÅÙ¤«¸¡Æ¤¤·¤Æ¤¤Þ¤·¤¿¤¬¡¢ ¤½¤ÎÅÔÅÙ¡¢»ä¤¿¤Á¤ÏÆÀ¤é¤ì¤½¤¦¤ÊÍø±×¤è¤ê¤âÌäÂê¤ÎÊý¤¬Â¿¤½¤¦¤À¤ÈȽÃǤ·¤Þ¤·¤¿¡£
¤³¤ì¤Ï¸À¸ì¾å¤Îµ»½ÑŪ¤ÊÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£»ä¤¬1983ǯ¤Ë¤Ï¤¸¤á¤Æ¸¡Æ¤¤·¤¿ ¤È¤¤Ç¤µ¤¨¡¢¤É¤Î¤è¤¦¤Ë¼ÂÁõ¤¹¤ì¤Ð¤è¤¤¤«¤Ï¤ï¤«¤Ã¤Æ¤¤¤Þ¤·¤¿¡£¤·¤«¤·¡¢»ä¤Î·Ð¸³ ¤Ç¤Ï¡¢ºÇ¤â´Êñ¤ÊÎã¤ò±Û¤¨¤ë¤È¿Í¡¹¤Ï±é»»»Ò¤Î»ÈÍѾå¤Î¡ÖÌÀÇò¤Ê¡×°ÕÌ£¤Ë¤Ä¤¤¤Æ Èù̯¤Ë°ã¤Ã¤¿°Õ¸«¤ò»ý¤Ä¤è¤¦¤À¤È¤ï¤«¤ê¤Þ¤·¤¿¡£ÀΤ«¤é¤è¤¯¤¢¤ëÎã¤Ï a**b**c ¤È ¤¤¤¦¤â¤Î¤Ç¤¹¡£** ¤¬¶Ò¾è¤ò°ÕÌ£¤¹¤ë¤È²¾Äꤷ¤Þ¤¹¡£¤³¤³¤Ç¡¢a**b**c ¤Ï (a**b)**c ¤È a**(b**c) ¤Î¤É¤Á¤é¤Î°ÕÌ£¤ò»ý¤Ä¤Ù¤¤Ç¤·¤ç¤¦¤«¡£»ä¤ÏÅú¤¨¤Ï¤Ï¤Ã¤¤ê¤·¤Æ¤¤¤Æ¡¢ »ä¤Îͧ¿Í¤¿¤Á¤â°Õ¸«¤¬°ìÃפ·¤Æ¤¤¤ë¤È»×¤¤¤Þ¤·¤¿ ¡Á ¤½¤Î¸å¡¢¤É¤Á¤é¤Î²ò·è¤¬ÌÀÇò¤« °Õ¸«¤¬°ìÃפ·¤Æ¤¤¤Ê¤¤¤³¤È¤¬¤ï¤«¤ê¤Þ¤·¤¿¡£¤³¤Î¤è¤¦¤ÊÌäÂê¤ÏÊᤨ¤Ë¤¯¤¤¥Ð¥°¤Ë ¤Ä¤Ê¤¬¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤È»×¤¤¤Þ¤¹¡£
(C++¥³¡¼¥É¤ÎÃæ¤Ç)C¤Î´Ø¿ô¤ò``extern "C"''¤ÈÀë¸À¤·¡¢(C¤Þ¤¿¤ÏC++¤Î¥³¡¼¥É ¤«¤é)¤½¤ì¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
// C++¥³¡¼¥É
extern "C" void f(int); // ¤Ò¤È¤Ä¤ÎÊýË¡
extern "C" { // ¤â¤¦¤Ò¤È¤Ä¤ÎÊýË¡
int g(double);
double h();
};
void code(int i, double d)
{
f(i);
int ii = g(d);
double dd = h();
// ...
}
´Ø¿ô¤ÎÄêµÁ¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£
/* C¥³¡¼¥É: */
void f(int i)
{
/* ... */
}
int g(double d)
{
/* ... */
}
double h()
{
/* ... */
}
C¤Î·¿µ¬Â§¤Ç¤Ï¤Ê¤¯¡¢C++¤Î·¿µ¬Â§¤¬»ÈÍѤµ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£``extern
"C"''¤ÈÀë¸À¤µ¤ì¤¿´Ø¿ô¤òÉÔÀµ¤Ê¿ô¤Î°ú¿ô¤òȼ¤Ã¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£°Ê²¼
¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
// C++¥³¡¼¥É
void more_code(int i, double d)
{
double dd = h(i,d); // ¥¨¥é¡¼: ͽ´ü¤·¤Ê¤¤°ú¿ô
// ...
}
(C++¥³¡¼¥É¤ÎÃæ¤Ç)C++¤Î´Ø¿ô¤ò``extern "C"''¤ÈÀë¸À¤·¡¢(C¤Þ¤¿¤ÏC++¤Î¥³¡¼¥É ¤«¤é)¤½¤ì¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
// C++¥³¡¼¥É:
extern "C" void f(int);
void f(int i)
{
// ...
}
¤³¤ì¤Ç¡¢f()¤Ï¼¡¤Î¤è¤¦¤Ë»ÈÍѤǤ¤Þ¤¹¡£
/* C¥³¡¼¥É: */
void f(int);
void cc(int i)
{
f(i);
/* ... */
}
¤â¤Á¤í¤ó¡¢¤³¤ÎÊýË¡¤ÏÈó¥á¥ó¥Ð´Ø¿ô¤À¤±¤Ë»ÈÍѤǤ¤Þ¤¹¡£¥á¥ó¥Ð´Ø¿ô(²¾ÁÛ´Ø¿ô¤ò´Þ
¤à)¤ò C ¤«¤é¸Æ¤Ó½Ð¤·¤¿¤¤¾ì¹ç¤Ï¡¢´Êñ¤Ê¥é¥Ã¥Ñ¡¼¤òÍѰդ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
// C++¥³¡¼¥É:
class C {
// ...
virtual double f(int);
};
extern "C" double call_C_f(C* p, int i) // ¥é¥Ã¥Ñ¡¼´Ø¿ô
{
return p->f(i);
}
¤³¤ì¤Ç¡¢C::f()¤Ï¼¡¤Î¤è¤¦¤Ë»ÈÍѤǤ¤Þ¤¹¡£
/* C¥³¡¼¥É: */
double call_C_f(struct C* p, int i);
void ccc(struct C* p, int i)
{
double d = call_C_f(p,i);
/* ... */
}
¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤¿´Ø¿ô¤ò C ¤«¤é¸Æ¤Ó½Ð¤·¤¿¤¤¾ì¹ç¤Ï¡¢C ¥³¡¼¥É¤¬¸Æ¤Ó½Ð¤»¤ë
¤è¤¦¤Ë¡¢°Û¤Ê¤ë̾Á°¤ò»ý¤Ä¥é¥Ã¥Ñ¡¼¤òÍѰդ·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
// C++¥³¡¼¥É:
void f(int);
void f(double);
extern "C" void f_i(int i) { f(i); }
extern "C" void f_d(double d) { f(d); }
¤³¤ì¤Ç¡¢f()¤ò¼¡¤Î¤è¤¦¤Ë»ÈÍѤǤ¤Þ¤¹¡£
/* C¥³¡¼¥É: */
void f_i(int);
void f_d(double);
void cccc(int i,double d)
{
f_i(i);
f_d(d);
/* ... */
}
¤³¤ì¤é¤Î¥Æ¥¯¥Ë¥Ã¥¯¤Ï¡¢C++¤Î¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤òÊѹ¹¤Ç¤¤Ê¤¤(¤¢¤ë¤¤¤ÏÊѹ¹¤·¤¿¤¯
¤Ê¤¤)¾ì¹ç¤Ç¤â¡¢C ¥³¡¼¥É¤«¤éC++¥é¥¤¥Ö¥é¥ê¤ò¸Æ¤Ó½Ð¤¹¤Î¤Ë»ÈÍѤǤ¤Þ¤¹¡£
C++¤Ï C ¤«¤é¥Ý¥¤¥ó¥¿¤ò¼õ¤±·Ñ¤®¤Þ¤·¤¿¡£¤·¤¿¤¬¤Ã¤Æ¡¢½ÅÂç¤Ê¸ß´¹À¤ÎÌäÂê¤ò µ¯¤³¤µ¤º¤Ë¥Ý¥¤¥ó¥¿¤ò¼è¤ê½ü¤¯¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£¥ê¥Õ¥¡¥ì¥ó¥¹¤Ï¤¤¤¯¤Ä¤« ¤Î»öÊÁ¤ËÌò¤ËΩ¤Á¤Þ¤¹¤¬¡¢¥ê¥Õ¥¡¥ì¥ó¥¹¤òC++¤ËƳÆþ¤·¤¿Ä¾ÀܤÎÍýͳ¤Ï¡¢±é»»»Ò¤Î ¥ª¡¼¥Ð¡¼¥í¡¼¥É¤ò¥µ¥Ý¡¼¥È¤¹¤ë¤¿¤á¤Ç¤·¤¿¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
void f1(const complex* x, const complex* y) // ¥ê¥Õ¥¡¥ì¥ó¥¹¤Ê¤·
{
complex z = *x+*y; // ÉԳʹ¥
// ...
}
void f2(const complex& x, const complex& y) // ¥ê¥Õ¥¡¥ì¥ó¥¹¤¢¤ê
{
complex z = x+y; // ¤è¤êÎɤ¤
// ...
}
°ìÈÌŪ¤Ë¡¢¥Ý¥¤¥ó¥¿¤Îµ¡Ç½¤È¥ê¥Õ¥¡¥ì¥ó¥¹¤Îµ¡Ç½¤ÎξÊý¤ò»ý¤Á¤¿¤¤¾ì¹ç¤Ï¡¢(C++¤Î
¤è¤¦¤Ë)¤Õ¤¿¤Ä¤Î°Û¤Ê¤ë·¿¤«¡¢¤Ò¤È¤Ä¤Î·¿¤ËÂФ¹¤ë¤Õ¤¿¤Ä¤Î°Û¤Ê¤ë±é»»¥»¥Ã¥È¤¬É¬Í×
¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¤Ò¤È¤Ä¤Î·¿¤Î¾ì¹ç¡¢»²¾È¤µ¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ØÂåÆþ¤¹¤ë¥ª¥Ú¥ì¡¼
¥·¥ç¥ó¤È¥ê¥Õ¥¡¥ì¥ó¥¹/¥Ý¥¤¥ó¥¿¤ØÂåÆþ¤¹¤ë¥ª¥Ú¥ì¡¼¥·¥ç¥ó¤ÎξÊý¤¬É¬Íפˤʤê¤Þ¤¹¡£
¤³¤ì¤Ï¡¢(Simula¤Î¤è¤¦¤Ë)Ê̸ĤΥª¥Ú¥ì¡¼¥¿¤ò»È¤Ã¤Æ¹Ô¤¦¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
Ref<My_type> r :- new My_type; r := 7; // ¥ª¥Ö¥¸¥§¥¯¥È¤ØÂåÆþ r :- new My_type; // ¥ê¥Õ¥¡¥ì¥ó¥¹¤ØÂåÆþ¤¢¤ë¤¤¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¡¢·¿¸¡ºº(¥ª¡¼¥Ð¡¼¥í¡¼¥Ç¥£¥ó¥°)¤ËÍê¤ë¤³¤È¤â¤Ç¤¤ë¤Ç¤·¤ç¤¦¡£
Ref<My_type> r = new My_type; r = 7; // ¥ª¥Ö¥¸¥§¥¯¥È¤ØÂåÆþ r = new My_type; // ¥ê¥Õ¥¡¥ì¥ó¥¹¤ØÂåÆþ
C++¤Ç¤Ï¡¢NULL¤ÎÄêµÁ¤Ï 0 ¤Ç¤¢¤ë¤Î¤Ç¡¢Ã±¤ËÈþŪ¤Ê°ã¤¤¤Ç¤·¤«¤¢¤ê¤Þ¤»¤ó¡£»ä¤Ï ¥Þ¥¯¥í¤Î»ÈÍѤòÈò¤±¤¿¤¤¤Î¤Ç¡¢0 ¤ò»ÈÍѤ·¤Þ¤¹¡£NULL¤ò»ÈÍѤ¹¤ë¤È¡¢NULL¤¬ 0 ¤È¤Ï °Û¤Ê¤ë¡¢¤¢¤ë¤¤¤ÏÀ°¿ô¤Ç¤Ï¤Ê¤¤¤È¸í²ò¤·¤Æ¤·¤Þ¤¦¤È¤¤¤¦ÌäÂê¤â¤¢¤ê¤Þ¤¹¡£É¸½à²½°ÊÁ° ¤Î¥³¡¼¥É¤Ç¤Ï¡¢NULL¤ÏÉÔŬÀÚ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë(¤¤¤¿)¤Î¤Ç¡¢»ÈÍѤòÈò¤±¤Ê¤±¤ì¤Ð¤Ê¤ê ¤Þ¤»¤ó(¤Ç¤·¤¿)¡£ºÇ¶á¤Ï¤½¤Î¤è¤¦¤Ê¤³¤È¤Ï¤¢¤Þ¤ê¤¢¤ê¤Þ¤»¤ó¡£
¥Ì¥ë¥Ý¥¤¥ó¥¿¤Ë̾Á°¤òÉÕ¤±¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¾ì¹ç¤Ï¡¢nullptr¤È¤·¤Æ¤¯¤À¤µ¤¤¡£ C++0x¤Ç¤Ï¥Ì¥ë¥Ý¥¤¥ó¥¿¤ònullptr¤È¤¹¤ëͽÄê¤Ç¤¹¡£¤½¤·¤Æ¡¢"nullptr"¤Ï¥¡¼¥ï¡¼¥É ¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£
̤ÄêµÁ¤Ç¤¹¡£C ¤ÈC++¤Ç¤Ï´ðËÜŪ¤Ë¡¢ÊÑ¿ô¤Ø¤Î½ñ¤¹þ¤ß¤â¤·¤Æ¤¤¤ë¤Ò¤È¤Ä¤Î¼°¤Î Ãæ¤ÇÊÑ¿ô¤ò 2 ²óÆÉ¤ó¤À·ë²Ì¤Ï̤ÄêµÁ¤Ç¤¹¡£¤½¤Î¤è¤¦¤Ê¤³¤È¤Ï¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ¾¤Ë¼¡¤Î¤è¤¦¤ÊÎã¤â¤¢¤ê¤Þ¤¹¡£
v[i] = i++;¤³¤ì¤Ë´ØÏ¢¤·¤¿Îã¤È¤·¤Æ¡¢¼¡¤Î¤è¤¦¤Ê¤â¤Î¤â¤¢¤ê¤Þ¤¹¡£
f(v[i],i++);´Ø¿ô¤Î°ú¿ô¤¬É¾²Á¤µ¤ì¤ë½çÈÖ¤Ï̤ÄêµÁ¤Ç¤¢¤ë¤Î¤Ç¡¢·ë²Ì¤Ï̤ÄêµÁ¤Ç¤¹¡£
¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Î¤è¤¤¥³¡¼¥É¤òÀ¸À®¤¹¤ë¤¿¤á¤Ë¡¢É¾²Á¤µ¤ì¤ë½çÈÖ¤ò̤ÄêµÁ¤Ë¤·¤Æ ¤ª¤¯¤³¤È¤¬µá¤á¤é¤ì¤Æ¤¤¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥é¤Ï¾åµ¤Î¤è¤¦¤Ê¥³¡¼¥É¤ËÂФ·¤Æ·Ù¹ð¤¹¤ë¤³ ¤È¤¬¤Ç¤¤ë¤Ç¤·¤ç¤¦¡£¤³¤Î¤è¤¦¤Ê¥³¡¼¥É¤Ï¡¢Åµ·¿Åª(¤¢¤ë¤¤¤ÏÀøºßŪ)¤ÊÊᤨ¤¬¤¿¤¤ ¥Ð¥°¤È¤Ê¤ê¤Þ¤¹¡£¿ô½½Ç¯¤¿¤Ã¤Æ¤â¡¢¤Û¤È¤ó¤É¤Î¥³¥ó¥Ñ¥¤¥é¤¬Ì¤¤À¤Ë¤½¤Î¤è¤¦¤Ê¥³¡¼¥É ¤ËÂФ·¤Æ·Ù¹ð¤·¤Ê¤¤¤Ç¡¢¤½¤¦¤¤¤Ã¤¿»Å»ö¤òÆÃ¼ì¤Ç¡¢ÆÈΩ¤·¤¿¡¢½½Ê¬»È¤ï¤ì¤Æ¤¤¤Ê¤¤ ¥Ä¡¼¥ë¤Ë»Ä¤·¤Æ¤¤¤ë¤³¤È¤Ë¡¢»ä¤Ï¤¬¤Ã¤«¤ê¤·¤Æ¤¤¤Þ¤¹¡£
¥Þ¥·¥ó¤Ë¤Ïº¹°Û¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤È¡¢C ¤Î¿¤¯¤Î»ö¹à¤¬Ì¤ÄêµÁ¤Î¤Þ¤Þ¤Ç¤¢¤ë ¤È¤¤¤¦Íýͳ¤Ç¤½¤¦¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ÍѸì¡Ö̤ÄêµÁ(undefined)¡×¡Ö̤µ¬Äê(unspecified)¡× ¡Ö½èÍý·ÏÄêµÁ(implementation defined)¡×¡ÖŬ³Ê(well-formed)¡×¤ÎÄêµÁ¤â´Þ¤á¡¢¾ÜºÙ ¤ÏISO C++ɸ½à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÎÍѸì¤Î°ÕÌ£¤Ï¡¢ISO Cɸ½à¤Ë¤ª¤±¤ëÄêµÁ¤ä °ìÈÌŪ¤ÊÍÑË¡¤È¤Ï°Û¤Ê¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤¹¤Ù¤Æ¤Î¿Í¤¬ÄêµÁ¤ò¶¦Í¤·¤Æ¤¤¤ë ¤È¤Ï¸Â¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤òÍý²ò¤·¤Æ¤¤¤Ê¤¤¤È¡¢µÄÏÀ¤¬Èó¾ï¤Ëº®Í𤹤뤳¤È¤¬¤¢¤ê¤Þ¤¹¡£
Ëþ¤Τ椫¤Ê¤¤¤â¤Î¤Ç¤¢¤ì¡¢¤³¤ì¤ÏÀµ¤·¤¤Åú¤¨¤Ç¤¹¡£ C ¤ÈƱÍͤˡ¢C++¤Ï¥Ï¡¼¥É¥¦¥§¥¢¤òľÀÜ¡¢¸úΨŪ¤ËÍøÍѤ¹¤ë¤³¤È¤òÌܻؤ·¤Æ¤¤¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢C++¤¬ÆÃÄê¤Î¥Þ¥·¥ó¾å¤Ë¤ª¤±¤ë¥Ó¥Ã¥È¡¢¥Ð¥¤¥È¡¢¥ï¡¼¥É¡¢¥¢¥É¥ì¥¹¡¢À°¿ô±é»»¡¢ ÉâÆ°¾®¿ôÅÀ¿ô±é»»¤Î¤è¤¦¤Ê¥Ï¡¼¥É¥¦¥§¥¢¤ÎÍ×ÁǤò°·¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤ò °Å¤Ë°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£ ¡Ö̤ÄêµÁ¡×¤È¸À¤ï¤ì¤Æ¤¤¤ë¡Ö»ö¹à¡×¤Î¿¤¯¤¬¡¢¼ÂºÝ¤Ë¤Ï¡Ö½èÍý·ÏÄêµÁ¡×¤Ç¤¢¤ë¤³¤È¤Ë Ãí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤É¤Î¥Þ¥·¥ó¾å¤Ç¼Â¹Ô¤¹¤ë¤«Ê¬¤«¤Ã¤Æ¤¤¤ë¸Â¤ê¡¢´°Á´¤Ëµ¬Äꤵ¤ì¤¿ ¥³¡¼¥É¤ò½ñ¤¯¤³¤È¤¬¤Ç¤¤Þ¤¹¡£À°¿ô¤Î¥µ¥¤¥º¤äÉâÆ°¾®¿ôÅÀ¿ô±é»»¤Î´Ý¤á¤¬¤³¤ì¤ËʬÎà ¤µ¤ì¤Þ¤¹¡£
¤ª¤½¤é¤¯ºÇ¤â¤è¤¯ÃΤé¤ì¤¿É¾È½¤Î°¤¤Ì¤ÄêµÁưºî¤ÎÎã¤Ç¤¢¤ë¡¢°Ê²¼¤Î¥³¡¼¥É¤ò¹Í¤¨¤Æ ¤ß¤Æ¤¯¤À¤µ¤¤¡£
int a[10]; a[100] = 0; // Èϰϥ¨¥é¡¼ int* p = a; // ... p[100] = 0; // Èϰϥ¨¥é¡¼ (ÂåÆþ¤ÎÁ°¤Ë p ¤ËŬÀÚ¤ÊÃͤòÀßÄꤷ¤Ê¤¤¾ì¹ç)C++(¤È C)¤Ë¤ª¤±¤ëÇÛÎó¤È¥Ý¥¤¥ó¥¿¤Î³µÇ°¤Ï¡¢¥Þ¥·¥ó¾å¤Î¥á¥â¥ê¤È¥¢¥É¥ì¥¹¤Î³µÇ°¤ò ¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤Ê¤·¤ËľÀÜɽ¸½¤·¤¿¤â¤Î¤Ç¤¹¡£¥Ý¥¤¥ó¥¿¤ËÂФ¹¤ë¥×¥ê¥ß¥Æ¥£¥Ö±é»»¤Ï¡¢ µ¡³£¸ìÌ¿Îá¤ËľÀܥޥåפµ¤ì¤Þ¤¹¡£ÆÃ¤ËÈϰϸ¡ºº¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£Èϰϸ¡ºº¤ò¹Ô¤¦¤È¡¢ ¼Â¹Ô»þ´Ö¤È¥³¡¼¥É¥µ¥¤¥º¤ÎÌ̤ǥ³¥¹¥È¤¬¤«¤«¤ë¤Ç¤·¤ç¤¦¡£C ¤Ï¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¥·¥¹ ¥Æ¥à¥¿¥¹¥¯¤Ç¥¢¥»¥ó¥Ö¥ê¥³¡¼¥É¤òÂǤÁÉ餫¤¹¤¿¤á¤ËÀ߷פµ¤ì¤¿¤Î¤Ç¡¢¤½¤¦¤¹¤ëɬÍפ¬ ¤¢¤ê¤Þ¤·¤¿¡£¤µ¤é¤Ë¡¢C ¤Ë¤Ï(C++¤È°Û¤Ê¤ê)¡¢¥³¥ó¥Ñ¥¤¥é¤¬°ãÈ¿¹Ô°Ù¤ò¸«¤Ä¤±¤ë¥³¡¼¥É ¤òÀ¸À®¤·¤Æ¡¢¤½¤ì¤òÊó¹ð¤¹¤ëŬÀÚ¤ÊÊýË¡¤¬¤¢¤ê¤Þ¤»¤ó¡£¤Ä¤Þ¤ê¡¢C ¤Ë¤ÏÎã³°½èÍý¤¬ ¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£ C++¤Ï¸ß´¹À¤È¡¢(OS¡¢ÁȤ߹þ¤ß¥·¥¹¥Æ¥à¡¢¤½¤·¤Æ¤¤¤¯¤Ä¤«¤Î¿ôÃÍ·×»»Ê¬Ìî¤Ç)¥¢¥»¥ó ¥Ö¥é¤ÈÄ¥¤ê¹ç¤¦¤¿¤á¤Ë C ¤ò·Ñ¾µ¤·¤Þ¤·¤¿¡£Èϰϸ¡ºº¤ò¤·¤¿¤±¤ì¤Ð¡¢Å¬Àڤʸ¡ºº¤ò¹Ô ¤¦¥¯¥é¥¹(vector¡¢¥¹¥Þ¡¼¥È¥Ý¥¤¥ó¥¿¡¢string¤Ê¤É)¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£Í¥¤ì¤¿¥³¥ó ¥Ñ¥¤¥é¤Ç¤¢¤ì¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ëa[100]¤ËÂФ¹¤ëÈϰϥ¨¥é¡¼¤ò¸«¤Ä¤±¤ë¤³¤È¤¬¤Ç¤¤ë ¤Ç¤·¤ç¤¦¡£p[100]¤ËÂФ¹¤ëÈϰϥ¨¥é¡¼¤ò¸«¤Ä¤±¤ë¤Î¤ÏÈó¾ï¤Ëº¤Æñ¤Ç¡¢°ìÈÌŪ¤Ë¤¹¤Ù¤Æ ¤ÎÈϰϥ¨¥é¡¼¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¸«¤Ä¤±¤ë¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£
̤ÄêµÁưºî¤Î¾¤ÎÎã¤Ï¥³¥ó¥Ñ¥¤¥ë¥â¥Ç¥ë¤Ëµ¯°ø¤·¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥é¤Ïʬ³ä¥³¥ó¥Ñ ¥¤¥ë¤µ¤ì¤¿ËÝÌõñ°Ì¤ÎÃæ¤Ç¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥È¤È´Ø¿ô¤Î°ì´ÓÀ¤Î¤Ê¤¤ÄêµÁ¤ò¸«¤Ä¤±¤ë ¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
// file1.c:
struct S { int x,y; };
int f(struct S* p) { return p->x; }
// file2.c:
struct S { int y,x; }
int main()
{
struct S s;
s.x = 1;
int x = f(&s;); // x!=s.x !!
return 2;
}
file1.c¤Èfile2.c¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¡¢Æ±¤¸¥×¥í¥°¥é¥à¤Ë¥ê¥ó¥¯¤¹¤ë¤³¤È¤Ï¡¢C ¤ÈC++¤Î
ξÊý¤ÇÈó¹çË¡¤Ç¤¹¡£¥ê¥ó¥«¤Ï S ¤Î°ì´ÓÀ¤Î¤Ê¤¤ÄêµÁ¤ò¸«¤Ä¤±¤ë¤³¤È¤¬¤Ç¤¤ë¤Ç¤·¤ç¤¦
¤¬¡¢¤½¤¦¤¹¤ë¤è¤¦¤Ë¶¯À©¤µ¤ì¤Þ¤»¤ó(¤½¤¦¤·¤Ê¤¤¤â¤Î¤¬¤Û¤È¤ó¤É¤Ç¤¹)¡£
¿¤¯¤Î¥±¡¼¥¹¤Ç¡¢Ê¬³ä¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿ËÝÌõñ°Ì´Ö¤Ç°ì´ÓÀ¤ò¸«¤Ä¤±¤ë¤Î¤Ï¤«¤Ê¤ê
Æñ¤·¤¤¤Ç¤·¤ç¤¦¡£¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤ò°ì´ÓÀ¤ò»ý¤Ã¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢¤½¤Î¤è¤¦¤ÊÌäÂê
¤òºÇ¾®¸Â¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤¡¢¥ê¥ó¥¯¤¬²þÁ±¤·¤Æ¤¤¤ëÃû¤·¤¬¸«¤¨¤Þ¤¹¡£C++¤Î¥ê¥ó¥«¤Ï¡¢
°ì´ÓÀ¤¬¤Ê¤¯Àë¸À¤µ¤ì¤¿´Ø¿ô¤Ë´Ø¤¹¤ë¤Û¤È¤ó¤É¤Î¥¨¥é¡¼¤ò¸«¤Ä¤±¤ë¤³¤È¤ËÃí°Õ¤·¤Æ
¤¯¤À¤µ¤¤¡£
ºÇ¸å¤Ë¾Ò²ð¤¹¤ë¤Î¤Ï¡¢ÌÀ¤é¤«¤ËÉÔɬÍפǡ¢¤«¤Ê¤êÌñ²ð¤Ê¡¢Ã±°ì¤Î¼°¤Î̤ÄêµÁưºî ¤Ç¤¹¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
void out1() { cout << 1; }
void out2() { cout << 2; }
int main()
{
int i = 10;
int j = ++i + i++; // j ¤ÎÃͤÏ̤µ¬Äê
f(out1(),out2()); // 12¤Þ¤¿¤Ï21¤Èɽ¼¨¤¹¤ë
}
j ¤ÎÃͤϥ³¥ó¥Ñ¥¤¥é¤¬ºÇŬ¤Ê¥³¡¼¥É¤òÀ¸À®¤Ç¤¤ë¤è¤¦¤Ëµ¬Äꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£
¤³¤Î¼«Í³¤òÍ¿¤¨¤é¤ì¤¿¥³¥ó¥Ñ¥¤¥é¤¬À¸À®¤¹¤ë¤â¤Î¤È¡¢¡ÖÄ̾ï¤Îº¸¤«¤é±¦¤Ø¤Îɾ²Á¡×
¤òÍ׵᤹¤ë¥³¥ó¥Ñ¥¤¥é¤¬À¸À®¤¹¤ë¤â¤Î¤È¤Î°ã¤¤¤¬Â礤ʰÕÌ£¤ò»ý¤Ä¤³¤È¤¬¤¢¤ë¤È
¸À¤ï¤ì¤Æ¤¤¤Þ¤¹¡£»ä¤ÏǼÆÀ¤·¤Æ¤¤¤Þ¤»¤ó¤¬¡¢¤³¤Î¼«Í³¤òÍøÍѤ·¤Æ¤¤¤ë¡Ö¸½Â¸¤¹¤ë¡×
̵¿ô¤Î¥³¥ó¥Ñ¥¤¥é¤È¡¢¤³¤Î¼«Í³¤òÇ®Îõ¤Ë»Ù»ý¤¹¤ë¿Í㤬¤¤¤ëÃæ¤Ç¡¢¤½¤ì¤òÊѹ¹¤¹¤ë
¤³¤È¤ÏÆñ¤·¤¤¤Ç¤·¤ç¤¦¤·¡¢Êѹ¹¤¬ C ¤ÈC++¤ÎÀ¤³¦¤Ë¿»Æ©¤¹¤ë¤Þ¤Ç¤Ë¤ÏŤ¤»þ´Ö¤¬
¤«¤«¤ë¤Ç¤·¤ç¤¦¡£
¤¹¤Ù¤Æ¤Î¥³¥ó¥Ñ¥¤¥é¤¬++i+i++¤Î¤è¤¦¤Ê¥³¡¼¥É¤Ë·Ù¹ð¤ò½Ð¤µ¤Ê¤¤¤³¤È¤Ë¡¢»ä¤Ï¤¬¤Ã¤«
¤ê¤·¤Æ¤¤¤Þ¤¹¡£Æ±Íͤˡ¢°ú¿ô¤Îɾ²Á½ç¤âµ¬Äꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£
»ä¤Î¹Í¤¨¤Ç¤Ï¡¢Ì¤ÄêµÁ¡¢Ì¤µ¬Äê¡¢½èÍý·ÏÄêµÁ¤Î¤Þ¤Þ¤Ë¤Ê¤Ã¤Æ¤¤¤ë»ö¹à¤¬Â¿¤¹¤®¤ë ¤È»×¤¤¤Þ¤¹¡£¤·¤«¤·¡¢¤½¤ì¤ò»ØÅ¦¤·¤¿¤ê¡¢Îã¤ò¤¢¤²¤ë¤³¤È¤Ï´Êñ¤Ç¤¹¤¬¡¢ÌÀ³Î¤Ë·è¤á ¤ë¤³¤È¤ÏÆñ¤·¤¤¤³¤È¤Ç¤¹¡£ÌäÂê¤Î¿¤¯¤òÈò¤±¤¿¤ê¡¢¥Ý¡¼¥¿¥Ö¥ë¤Ê¥³¡¼¥É¤òÀ¸À®¤¹¤ë ¤³¤È¤Ï¡¢¤½¤ì¤Û¤ÉÆñ¤·¤¤¤³¤È¤Ç¤Ï¤Ê¤¤¤³¤È¤â¿´¤Ëα¤á¤Æ¤ª¤¤¤Æ¤¯¤À¤µ¤¤¡£
¥¥ã¥¹¥È¤Ï°ìÈÌŪ¤ËÈò¤±¤¿Êý¤¬¤è¤¤¤â¤Î¤Ç¤¹¡£dynamic_cast¤ò½ü¤¤¤Æ¡¢¥¥ã¥¹¥È¤Î »ÈÍѤϡ¢·¿¥¨¥é¡¼¤ä¿ôÃͤÎÀÚ¤êµÍ¤á¤Î²ÄǽÀ¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤ò°Å¤Ë°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£ ¥¥ã¥¹¥È¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë·¿¤¬³«È¯Ã椫¥á¥¤¥ó¥Æ¥Ê¥ó¥¹Ãæ¤ËÊѹ¹¤µ¤ì¤¿¾ì¹ç¡¢³²¤¬¤Ê¤¤ ¤è¤¦¤Ë¸«¤¨¤ë¥¥ã¥¹¥È¤Ç¤µ¤¨¤â¡¢¿¼¹ï¤ÊÌäÂê¤ò°ú¤µ¯¤³¤¹²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¡¼¥É¤Ï¤É¤Î¤è¤¦¤Ê°ÕÌ£¤ò»ý¤Ä¤Ç¤·¤ç¤¦¤«¡£
x = (T)y;¤ï¤«¤ê¤Þ¤»¤ó¡£·¿ T ¤È¡¢x ¤È y ¤Î·¿¤¬²¿¤«¤Ë¤è¤ê¤Þ¤¹¡£T ¤Ï¥¯¥é¥¹Ì¾¤ätypedef¤µ ¤ì¤¿·¿¤«¤â¤·¤ì¤Þ¤»¤ó¤·¡¢¤â¤·¤«¤·¤¿¤é¡¢¥Æ¥ó¥×¥ì¡¼¥È¥Ñ¥é¥á¡¼¥¿¤«¤â¤·¤ì¤Þ¤»¤ó¡£ x ¤È y ¤Ï¥¹¥«¥é¡¼ÊÑ¿ô¤Ç¡¢(T)¤ÏÃͤÎÊÑ´¹¤òɽ¤·¤Æ¤¤¤ë¤Î¤«¤â¤·¤ì¤Þ¤»¤ó¡£ ¤¢¤ë¤¤¤Ï¡¢x ¤Î·¿¤Ï y ¤Î¥¯¥é¥¹¤«¤éƳ½Ð¤µ¤ì¤¿¥¯¥é¥¹¤Ç¡¢(T)¤Ï¥À¥¦¥ó¥¥ã¥¹¥È¤Ê¤Î ¤«¤â¤·¤ì¤Þ¤»¤ó¡£x ¤È y ¤Ï´ØÏ¢¤Î¤Ê¤¤¥Ý¥¤¥ó¥¿·¿¤Ê¤Î¤«¤â¤·¤ì¤Þ¤»¤ó¡£C ¥¹¥¿¥¤¥ë¤Î ¥¥ã¥¹¥È(T)¤Ï¡¢Â¿¤¯¤ÎÏÀÍýŪ¤Ë°Û¤Ê¤ë±é»»¤òɽ¸½¤¹¤ë¤¿¤á¤Ë»ÈÍѤǤ¤ë¤Î¤Ç¡¢¥³¥ó ¥Ñ¥¤¥é¤Ï¸íÍѤò¸«¤Ä¤±¤ë¤¿¤á¤ÎºÇ¾®¸Â¤Îµ¡²ñ¤·¤«»ý¤Á¤Þ¤»¤ó¡£ Ʊ¤¸Íýͳ¤Ç¡¢¥×¥í¥°¥é¥Þ¤Ï¥¥ã¥¹¥È¤¬Àµ³Î¤Ë²¿¤ò¤¹¤ë¤Î¤«Ê¬¤é¤Ê¤¤¤«¤â¤·¤ì¤Þ¤»¤ó¡£ ½é¿´¼Ô¥×¥í¥°¥é¥Þ¤Ï¤³¤ì¤òÍøÅÀ¤È¹Í¤¨¤ë¤³¤È¤¬¤¢¤ê¡¢½é¿´¼Ô¤¬´Ö°ã¤Ã¤ÆÍý²ò¤¹¤ë¤È¡¢ Êᤨ¤¬¤¿¤¤¥¨¥é¡¼¤Î¤â¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
¡Ö¿·¤·¤¤¥¹¥¿¥¤¥ë¤Î¥¥ã¥¹¥È¡×¤Ï¡¢¥×¥í¥°¥é¥Þ¤Î°Õ¿Þ¤ò¤â¤Ã¤È¤Ï¤Ã¤¤ê¼¨¤¹µ¡²ñ¤ò ¥×¥í¥°¥é¥Þ¤ËÍ¿¤¨¡¢¥³¥ó¥Ñ¥¤¥é¤¬¤è¤ê¿¤¯¤Î¥¨¥é¡¼¤ò¸«¤Ä¤±¤ë¤¿¤á¤ËƳÆþ¤µ¤ì¤Þ¤·¤¿¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
int a = 7; double* p1 = (double*) &a; // OK (¤·¤«¤· a ¤Ïdouble¤Ç¤Ï¤Ê¤¤) double* p2 = static_cast<double*>(&a;); // ¥¨¥é¡¼ double* p2 = reinterpret_cast<double*>(&a;); // OK: I really mean it const int c = 7; int* q1 = &c; // ¥¨¥é¡¼ int* q2 = (int*)&c; // OK (¤·¤«¤· *q2=2; ¤Ï°ÍÁ³¤È¤·¤ÆÉÔÅö¤Ê¥³¡¼¥É¤Ç·çÍ¤ë¾ì¹ç¤¬¤¢¤ë) int* q3 = static_cast<int*>(&c;); // ¥¨¥é¡¼: static_cast¤Ïconst¤ò¼è¤ê½ü¤«¤Ê¤¤ int* q4 = const_cast<int*>(&c;); // I really mean it¤³¤Î¥¢¥¤¥Ç¥¢¤Ï¡¢static_cast¤¬µö¤¹ÊÑ´¹¤Ï¡¢reinterpret_cast¤òÍ׵᤹¤ëÊÑ´¹¤è¤ê¤â¡¢ ¿¾¯¥¨¥é¡¼¤Ë¤Ê¤ê¤Ë¤¯¤¤¤È¤¤¤¦¹Í¤¨¤Ë¤â¤È¤Å¤¤¤Æ¤¤¤Þ¤¹¡£¸¶ÍýŪ¤Ë¤Ï¡¢static_cast¤Î ·ë²Ì¤Ï¡¢¥¥ã¥¹¥È¤Ç¸µ¤Î·¿¤ËÌᤵ¤º¤Ë»ÈÍѤǤ¤Þ¤¹¤¬¡¢reinterpret_cast¤Î·ë²Ì¤Ï¡¢ ¸ß´¹À¤òÊݾڤ¹¤ë¤¿¤á¤Ë¡¢»ÈÍѤ¹¤ëÁ°¤Ë¸µ¤Î·¿¤ËÌ᤹¤Ù¤¤Ç¤¹¡£
¿·¤·¤¤¥¹¥¿¥¤¥ë¤Î¥¥ã¥¹¥È¤òƳÆþ¤·¤¿¤Õ¤¿¤ÄÌܤÎÍýͳ¤Ï¡¢C ¥¹¥¿¥¤¥ë¤Î¥¥ã¥¹¥È¤Ï ¥×¥í¥°¥é¥àÃæ¤Ç¸«¤Ä¤±¤Å¤é¤¤¤«¤é¤È¤¤¤¦¤â¤Î¤Ç¤·¤¿¡£¤¿¤È¤¨¤Ð¡¢ÉáÄ̤Υ¨¥Ç¥£¥¿¤ä ¥ï¡¼¥É¥×¥í¥»¥Ã¥µ¤ò»È¤Ã¤Æ¡¢¥¥ã¥¹¥È¤ò¤¦¤Þ¤¯Ãµ¤¹¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£¤³¤Î C ¥¹¥¿¥¤¥ë ¥¥ã¥¹¥È¤Î¸«¤¨¤Ë¤¯¤µ¤Ï»³²¤ò¤â¤¿¤é¤¹²ÄǽÀ¤¬¤¢¤ë¤Î¤Ç¡¢¤È¤ê¤ï¤±»Äǰ¤Ê¤³¤È¤Ç¤¹¡£ Ìñ²ð¤Ê±é»»¤Ï¡¢½¹¤¤¹½Ê¸·Á¼°¤ò»ý¤Ä¤Ù¤¤Ç¤¹¡£¿·¤·¤¤¥¹¥¿¥¤¥ë¤Î¥¥ã¥¹¥È¤Î¹½Ê¸¤ò·èÄê ¤·¤¿Íýͳ¤Î°ìü¤Ë¤Ï¡¢¤³¤Î¤è¤¦¤Ê°Õ¸«¤¬¤¢¤ê¤Þ¤·¤¿¡£¤µ¤é¤Ë¡¢¥Æ¥ó¥×¥ì¡¼¥È¤Îɽµ¤Ë ¹ç¤ï¤»¤ë¤¿¤á¤È¤¤¤¦Íýͳ¤â¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥×¥í¥°¥é¥Þ¤ÏÆÈ¼«¤Î¥¥ã¥¹¥È¡¢ÆÃ¤Ë ¼Â¹Ô»þ¸¡ºº¤òȼ¤¦¥¥ã¥¹¥È¤ò½ñ¤¯¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤ª¤½¤é¤¯¡¢static_cast¤ÏÉԳʹ¥¤ÇÈæ³ÓŪ¥¿¥¤¥×¤·¤Å¤é¤¤¤Î¤Ç¡¢»ÈÍѤò¤¿¤á¤é¤¦¤Î ¤Ç¤Ï¤Ê¤¤¤Ç¤·¤ç¤¦¤«¡£¤½¤ì¤ÏÎɤ¤¤³¤È¤À¤È»×¤¤¤Þ¤¹¡£¤Ê¤¼¤Ê¤é¡¢ºÇ¶á¤ÎC++¤Ç¤Ï¤Û¤È ¤ó¤É¤Î¾ì¹ç¤Ë¤ª¤¤¤Æ¡¢¥¥ã¥¹¥È¤ò²óÈò¤Ç¤¤ë¤«¤é¤Ç¤¹¡£
¥Þ¥¯¥í¤ÏC++¤Î¥¹¥³¡¼¥×µ¬Â§¤È·¿µ¬Â§¤Ë½¾¤¤¤Þ¤»¤ó¡£¤³¤Î¤³¤È¤ÏÅÙ¡¹¡¢Æñ²ò¤Ê ÌäÂê¤È¤½¤ì¤Û¤ÉÆñ²ò¤Ç¤â¤Ê¤¤ÌäÂê¤ò°ú¤µ¯¤³¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢C++¤Ç¤Ï¥Þ¥¯¥í¤Î Âå¤ï¤ê¤Ë»ÈÍѤǤ¤ë¤â¤Î¤È¤·¤Æ¡¢¥¤¥ó¥é¥¤¥ó´Ø¿ô¡¢¥Æ¥ó¥×¥ì¡¼¥È¡¢Ì¾Á°¶õ´Ö¤È¤¤¤Ã ¤¿¡¢C++¤Î¾¤ÎÉôʬ¤Ë¤è¤¯ÆëÀ÷¤à¤â¤Î¤òÍѰդ·¤Æ¤¤¤Þ¤¹¡£
¼¡¤Î¤è¤¦¤Ê¥³¡¼¥É¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
#include "someheader.h"
struct S {
int alpha;
int beta;
};
¤â¤·¡¢Ã¯¤«¤¬(¶ò¤«¤Ë¤â)"alpha"¤ä"beta"¤È¤¤¤Ã¤¿Ì¾Á°¤Î¥Þ¥¯¥í¤òÄêµÁ¤·¤Æ¤¤¤¿ ¾ì¹ç¡¢¤³¤Î¥³¡¼¥É¤Ï¥³¥ó¥Ñ¥¤¥ë¤Ç¤¤Ê¤¤¤«¡¢(¤â¤Ã¤È¤Ò¤É¤¤¤³¤È¤Ë)¥³¥ó¥Ñ¥¤¥ë¤Ç¤ ¤¿¤È¤·¤Æ¤â¡¢¤½¤ì¤Ï°Õ¿Þ¤·¤Ê¤¤¤â¤Î¤Ç¤¢¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢"someheader.h"¤Ë¤Ï¼¡¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£
#define alpha 'a' #define beta b[2]
¥Þ¥¯¥í̾(¤À¤±)¤ò¤¹¤Ù¤ÆÂçʸ»ú¤Ë¤¹¤ë¤È¤¤¤¦´·½¬¤Ë½¾¤¨¤Ð¡¢¤³¤ÎÌäÂê¤òÈò¤±¤ë ¤³¤È¤Ï¤Ç¤¤Þ¤¹¤¬¡¢¸À¸ì¥ì¥Ù¥ë¤Ç¥Þ¥¯¥í¤ÎŸ³«¤òËɤ°ÊýË¡¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ¤¿¤È¤¨¤Ð¡¢¥á¥ó¥Ð̾¤Ï¹½Â¤ÂΤΥ¹¥³¡¼¥×¤ÎÃæ¤Ë¤¢¤ë¤È¤¤¤¦¤³¤È¤Ç¡¢¤³¤ÎÌäÂê¤òÈò¤±¤ë ¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£¥Þ¥¯¥í¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤¬½èÍý¤¹¤ëÁ°¤Ë¡¢¥×¥í¥°¥é¥à¤òʸ»úÎó¤Î ʤӤȤ·¤Æ½èÍý¤·¤Þ¤¹¡£¤Ä¤¤¤Ç¤Ë¸À¤¨¤Ð¡¢¤³¤Î¤³¤È¤¬ C ¤ÈC++¤Î¥×¥í¥°¥é¥à³«È¯´Ä¶ ¤È¥Ä¡¼¥ë¤¬ÀöÎý¤µ¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤Î¼ç¤ÊÍýͳ¤Ç¤¹¡£¿Í´Ö¤È¥³¥ó¥Ñ¥¤¥é¤Ï°ã¤¦¥×¥í¥°¥é¥à ¤ò¸«¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
»Äǰ¤Ê¤³¤È¤Ë¡¢¤¢¤Ê¤¿¤¬¡ÖËÜÅö¤Ë¶ò¤«¤Ê¤³¤È¡×¤È¹Í¤¨¤ë¤³¤È¤ò¾¤Î¥×¥í¥°¥é¥Þ¤¬ ÀäÂФˤ·¤Ê¤¤¤ÈÁÛÄꤹ¤ë¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢ºÇ¶á¤¢¤ë¿Í¤«¤éʹ¤¤¤¿¤Î¤Ç¤¹¤¬¡¢ Èà¤é¤Ïgoto¤ò´Þ¤ó¤À¥Þ¥¯¥í¤Ë½Ð¤¯¤ï¤·¤¿¤½¤¦¤Ç¤¹¡£»ä¤â¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò¸«¤¿¤³¤È¤¬ ¤¢¤ê¤Þ¤¹¤·¡¢»×¤ï¤ºÇ¼ÆÀ¤·¤Æ¤·¤Þ¤¤¤½¤¦¤Ë¤Ê¤ëµÄÏÀ¤òʹ¤¤¤¿¤³¤È¤â¤¢¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ê¥³¡¼¥É¤Ç¤¹¡£
#define prefix get_ready(); int ret__
#define Return(i) ret__=i; do_something(); goto exit
#define suffix exit: cleanup(); return ret__
void f()
{
prefix;
// ...
Return(10);
// ...
Return(x++);
//...
suffix;
}
¤¢¤Ê¤¿¤¬Êݼé¥×¥í¥°¥é¥Þ¤Ë¤Ê¤Ã¤Æ¡¢¤³¤Î¥³¡¼¥É¤òÅϤµ¤ì¤ë¤³¤È¤òÁÛÁü¤·¤Æ¤ß¤Æ ¤¯¤À¤µ¤¤¡£¤³¤Î¥Þ¥¯¥í¤¬¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Ë¡Ö±£¤µ¤ì¤Æ¤¤¤ë¡×¤È - ¤½¤¦¤¹¤ë¤Î¤Ï ÄÁ¤·¤¯¤Ê¤¤¤¬ - ¤³¤Î¤è¤¦¤Ê¡Ö¥Þ¥¸¥Ã¥¯¡×¤ò¸«¤Ä¤±¤À¤¹¤Î¤Ïº¤Æñ¤Ç¤¹¡£
¤È¤Æ¤â¤¢¤ê¤Õ¤ì¤¿Ê¬¤ê¤Ë¤¯¤¤ÌäÂê¤Î¤Ò¤È¤Ä¤¬¡¢´Ø¿ô°ú¿ô¤Î¼õ¤±ÅϤ·µ¬Â§¤Ë½¾ ¤ï¤Ê¤¤´Ø¿ô¥¹¥¿¥¤¥ë¤Î¥Þ¥¯¥í¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ê¥³¡¼¥É¤Ç¤¹¡£
#define square(x) (x*x)
void f(double d, int i)
{
square(d); // ¤è¤·
square(i++); // ¤À¤á: (i++*i++)¤È¤Ê¤ë
square(d+1); // ¤À¤á: (d+1*d+1)¡¢¤Ä¤Þ¤ê¡¢(d+d+1)¤È¤Ê¤ë
// ...
}
"d+1"¤ÎÊý¤ÎÌäÂê¤Ï¡¢¸Æ¤Ó½Ð¤·Â¦¤Î°ú¿ô¤ò³ç¸Ì¤Ç°Ï¤à¤«¡¢¼¡¤Î¤è¤¦¤Ë¥Þ¥¯¥íÄêµÁÃæ ¤Î¥Ñ¥é¥á¡¼¥¿¤ò³ç¸Ì¤Ç°Ï¤à¤³¤È¤Ç²ò·è¤·¤Þ¤¹¡£
#define square(x) ((x)*(x)) /* ¤è¤êÎɤ¤ */
¤·¤«¤·¡¢(¤ª¤½¤é¤¯°Õ¿Þ¤·¤Æ¤¤¤Ê¤¤)i++¤¬ 2 ÅÙɾ²Á¤µ¤ì¤ë¤È¤¤¤¦ÌäÂê¤Ï°ÍÁ³¤È¤· ¤Æ»Ä¤ê¤Þ¤¹¡£
¤â¤Á¤í¤ó¡¢C/C++¥×¥ê¥×¥í¥»¥Ã¥µ¥Þ¥¯¥í¤ÎÌäÂ꤬µ¯¤é¤Ê¤¤¥Þ¥¯¥í¤¬¤¢¤ë¤³¤È¤Ï ÃΤäƤ¤¤Þ¤¹¡£¤·¤«¤·¡¢C++¤Î¥Þ¥¯¥í¤ò²þÁ±¤¹¤ë¤Ä¤â¤ê¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤½¤ÎÂå¤ê¤Ë¡¢ ¥¤¥ó¥é¥¤¥ó´Ø¿ô¡¢¥Æ¥ó¥×¥ì¡¼¥È¡¢¥³¥ó¥¹¥È¥é¥¯¥¿(½é´ü²½)¡¢¥Ç¥¹¥È¥é¥¯¥¿(¸å½èÍý)¡¢ Îã³°(¥³¥ó¥Æ¥¥¹¥Èæ½Ð)¤È¤¤¤Ã¤¿¡¢C++¸À¸ì¸Çͤε¡Ç½¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ª¤¹¤¹¤á ¤·¤Þ¤¹¡£
"cout"¤Ï¡Ö¥·¡¼¥¢¥¦¥È(¸¶Ê¸ "see-out")¡×¤Èȯ²»¤·¤Þ¤¹¡£"c"¤Ï"character"¤Îά ¤Ç¤¹¡£¤³¤ì¤Ï¡¢iostreams¤¬ÃͤȥХ¤¥È(ʸ»ú)ɽ¸½¤òÂбþ¤Å¤±¤ë¤â¤Î¤Ç¤¢¤ë¤È¤¤¤¦ Íýͳ¤«¤é¤Ç¤¹¡£
"char"¤ÏÉáÄ̡֥¥ã¡¼(¸¶Ê¸ "kar")¡×¤Ç¤Ï¤Ê¤¯¡¢¡Ö¥Á¥ã¡¼(¸¶Ê¸ "tchar")¡×¤È ȯ²»¤·¤Þ¤¹¡£"character"¤ò¡Ö¥¥ã¥é¥¯¥¿(¸¶Ê¸ "ka-rak-ter")¡×¤Èȯ²»¤¹¤ë¤Î¤Ç ÄÔêí¤¬¹ç¤ï¤Ê¤¤¤è¤¦¤Ë»×¤¨¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¤¬¡¢±Ñ¸ì¤Îȯ²»("pronounciation"¤Ç ¤Ï¤Ê¤¯¡¢"pronunciation"¤ÈÄÖ¤ë:-)¤ÈÄ֤꤬¤½¤¦¤¤¤Ã¤¿¤³¤È¤Ë̵ÆÜÃå¤À¤ÈÀÕ¤á¤ë ¿Í¤Ïï¤â¤¤¤Þ¤»¤ó¤Ç¤·¤¿¡£
¤É¤Á¤é¤âÀµÅö¤ÊC¤ÈC++¤Ç¤¢¤ê¡¢¤Þ¤Ã¤¿¤¯Æ±¤¸°ÕÌ£¤ò»ý¤Ä¤È¤¤¤¦°ÕÌ£¤Ç¡¢¤É¤Á¤é¤â ¡ÖÀµ¤·¤¤¡×¤Ç¤¹¡£¸À¸ì¤ÎÄêµÁ¤È¥³¥ó¥Ñ¥¤¥é¤Ë´Ø¤¹¤ë¸Â¤ê¡¢``int*p;''¤È¤¹¤ë¤³¤È¤â¡¢ ``int * p;''¤È¤¹¤ë¤³¤È¤â¤Ç¤¤ë¤Ç¤·¤ç¤¦¡£
``int* p;''¤È``int *p;''¤Î¤É¤Á¤é¤Ë¤¹¤ë¤«¤Ï¡¢¤É¤Á¤é¤¬Àµ¤·¤¤¤È¤«´Ö°ã¤Ã¤Æ¤¤ ¤ë¤È¤«¤È¤¤¤¦¤³¤È¤Ç¤Ï¤Ê¤¯¡¢¤É¤Á¤é¤Î¥¹¥¿¥¤¥ë¤Ë¤¹¤ë¤«¡¢²¿¤ò¶¯Ä´¤¹¤ë¤Î¤«¤È¤¤¤¦ ¤³¤È¤Ç¤¹¡£C ¤Ï¼°¤ò¶¯Ä´¤·¤Þ¤·¤¿¡£Àë¸À¤ÏɬÍ×°¤Ë¤¹¤®¤Ê¤¤¤È¹Í¤¨¤é¤ì¤ë¤³¤È¤¬¤è¤¯ ¤¢¤ê¤Þ¤·¤¿¡£°ìÊý¡¢C++¤Ï·¿¤ò¶¯Ä´¤·¤Þ¤¹¡£
¡Öŵ·¿Åª¤ÊC¥×¥í¥°¥é¥Þ¡×¤Ï``int *p;''¤È½ñ¤¡¢¡Ö*p¤Ïint¤½¤Î¤â¤Î¤Ç¤¢¤ë¡×¤È ¹½Ê¸¤ò¶¯Ä´¤¹¤ë¤è¤¦¤ËÀâÌÀ¤·¤Þ¤¹¡£¤½¤·¤Æ¡¢¤½¤Î¥¹¥¿¥¤¥ë¤ÎÀµ¤·¤µ¤ò¼çÄ¥¤¹¤ë¤¿¤á ¤Ë¡¢C(¤ÈC++)¤Ë¤ª¤±¤ëÀë¸À¤Îʸˡ¤ò¤¢¤²¤ë¤Ç¤·¤ç¤¦¡£¼ÂºÝ¡¢Ê¸Ë¡¾å¡¢* ¤Ï̾Á° p ¤Ë ·ë¹ç¤·¤Þ¤¹¡£
¡Öŵ·¿Åª¤ÊC++¥×¥í¥°¥é¥Þ¡×¤Ï``int* p;''¤È½ñ¤¡¢¡Öp ¤Ïint¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡× ¤È·¿¤ò¶¯Ä´¤¹¤ë¤è¤¦¤ËÀâÌÀ¤·¤Þ¤¹¡£¼ÂºÝ¡¢p ¤Î·¿¤Ï int* ¤Ç¤¹¡£»ä¤Î¹¥¤ß¤ÏÌÀ¤é¤«¤Ë ¤³¤Á¤é¤Î¶¯Ä´¤Î»ÅÊý¤Ç¤¢¤ê¡¢C++¤Î¤è¤ê¹âÅÙ¤ÊÉôʬ¤ò¤¦¤Þ¤¯»È¤¦¤¿¤á¤Ë½ÅÍפǤ¢¤ë¤È ¹Í¤¨¤Þ¤¹¡£
¤Ò¤È¤Ä¤ÎÀë¸À¤ÇÊ£¿ô¤Î¥Ý¥¤¥ó¥¿¤òÀë¸À¤·¤è¤¦¤È¤¹¤ë¤È¤(¤À¤±)¡¢Â礤ʺ®Íð¤¬À¸ ¤¸¤Þ¤¹¡£
int* p, p1; // ¤â¤·¤«¤·¤¿¤é¥¨¥é¡¼: p1¤Ïint*¤Ç¤Ï¤Ê¤¤* ¤ò̾Á°¤ÎÊý¤Ë¶á¤Å¤±¤Æ¤â¡¢¤³¤Î¼ï¤Î¥¨¥é¡¼¤¬µ¯¤³¤ê¤Ë¤¯¤¯¤Ê¤ë¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£
int *p, p1; // ¤â¤·¤«¤·¤¿¤é¥¨¥é¡¼¡©¤Ò¤È¤Ä¤ÎÀë¸À¤Ë¤Ä¤¤Ò¤È¤Ä¤Î̾Á°¤òÀë¸À¤¹¤ë¤³¤È¤Ç¡¢(¤È¤¯¤ËÊÑ¿ô¤ò½é´ü²½¤¹¤ë¤È¤ ¤Ï)¤³¤Î¤è¤¦¤ÊÌäÂê¤ÎȯÀ¸¤òºÇ¾®¸Â¤ËÍÞ¤¨¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¼¡¤Î¤è¤¦¤Ë½ñ¤¯¿Í¤Ï ¤Û¤È¤ó¤É¤¤¤Þ¤»¤ó¡£
int* p = &i; int p1 = p; // ¥¨¥é¡¼: int*¤Ç½é´ü²½¤µ¤ì¤ëint¤â¤·¾åµ¤Î¤è¤¦¤Ê¥³¡¼¥É¤ò½ñ¤±¤Ð¡¢¥³¥ó¥Ñ¥¤¥é¤¬Ê¸¶ç¤ò¸À¤¤¤Þ¤¹¡£
²¿¤«¤ò¤¹¤ë¤Î¤Ë¤Õ¤¿¤Ä¤ÎÊýË¡¤¬¤¢¤ë¤Èº®Íð¤¬À¸¤¸¤Þ¤¹¡£¹¥¤ß¤ÎÌäÂê¤Ç¤¢¤ë¤Ê¤é¡¢ µÄÏÀ¤Ï¤À¤é¤À¤é¤ÈÀ䤨¤ë¤³¤È¤Ê¤¯Â³¤¯¤Ç¤·¤ç¤¦¡£¤Ò¤È¤Ä¤ÎÀë¸À¤Ë¤Ï¤Ò¤È¤Ä¤Î¥Ý¥¤¥ó¥¿ ¤À¤±¤Ë¤·¤Æ¡¢¾ï¤ËÊÑ¿ô¤ò½é´ü²½¤¹¤ë¤è¤¦¤Ë¤¹¤ì¤Ð¡¢º®Íð¤Î¤â¤È¤Ï¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£ C++¤ÎÀ߷פȿʲ½¤Ë C ¤Î Àë¸À¤Î¹½Ê¸¤Ë´Ø¤¹¤ëÆÍ¤Ã¹þ¤ó¤ÀµÄÏÀ¤¬¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢¤½¤Á¤é¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¤½¤Î¤è¤¦¤Ê¥¹¥¿¥¤¥ë¤ÎÌäÂê¤Ï¡¢¸Ä¿Í¤Î¹¥¤ß¤ÎÌäÂê¤Ç¤¹¡£ÅÙ¡¹¡¢¥³¡¼¥É¥ì¥¤¥¢¥¦¥È¤Ë ´Ø¤¹¤ë°Õ¸«¤¬¶¯¤¯¤¢¤ê¤Þ¤¹¤¬¡¢¤É¤Î¤è¤¦¤Ê¥¹¥¿¥¤¥ë¤Ë¤¹¤ë¤«¤è¤ê¤â¡¢°ì´ÓÀ¤òÊÝ¤Ä ¤³¤È¤ÎÊý¤¬½ÅÍפǤ·¤ç¤¦¡£¤Û¤È¤ó¤É¤Î¿Íã¤ÈƱ¤¸¤è¤¦¤Ë¡¢»ä¤Ï¼«Ê¬¤Î¹¥¤ß¤Î¥¹¥¿¥¤¥ë ¤Ë¤Ä¤¤¤Æ¡¢º¬µò¤Î¤¢¤ë¶Ú¤ÎÄ̤俵ÄÏÀ¤òÁȤßΩ¤Æ¤ë¤³¤È¤¬¤Ê¤«¤Ê¤«¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£
»ä¼«¿È¤Ï"K&R;"¥¹¥¿¥¤¥ë¤È¸Æ¤Ð¤ì¤ë¥¹¥¿¥¤¥ë¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£¤½¤Î¥¹¥¿¥¤¥ë¤Ë C ¤Ë ¤Ê¤¤¹½Ê¸¤Îµ¬Ìó¤òÄɲ乤ë¤È¡¢"Stroustrup"¥¹¥¿¥¤¥ë¤È¸Æ¤Ð¤ì¤ë¤³¤È¤â¤¢¤ë¥¹¥¿¥¤¥ë ¤Ë¤Ê¤ê¤Þ¤¹¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
class C : public B {
public:
// ...
};
void f(int* p, int max)
{
if (p) {
// ...
}
for (int i = 0; i<max; ++i) {
// ...
}
}
¤³¤Î¥¹¥¿¥¤¥ë¤Ï¡¢Â¾¤Î¿¤¯¤Î¥ì¥¤¥¢¥¦¥È¥¹¥¿¥¤¥ë¤è¤ê¤â½ÄÊý¸þ¤Î¥¹¥Ú¡¼¥¹¤òÀáÌ󤷤ơ¢
¥³¡¼¥É¤¬¥¹¥¯¥ê¡¼¥ó¤Ë¤Û¤É¤è¤¯¼ý¤Þ¤ë¤È¤³¤í¤¬»ä¤Î¹¥¤ß¤Ç¤¹¡£¤Þ¤¿¡¢´Ø¿ô¤Î³«»Ï¤Î
³ç¸Ì¤ò¿·¤·¤¤¹Ô¤ËÃÖ¤¯¤È¡¢´Ø¿ôÄêµÁ¤È¥¯¥é¥¹ÄêµÁ¤ò¸«Ê¬¤±¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£
¥¤¥ó¥Ç¥ó¥È¤Ï¤È¤Æ¤â½ÅÍפǤ¹¡£
¥Ç¥¶¥¤¥ó¤ÎÌäÂê¡¢¤¿¤È¤¨¤Ð¡¢¼çÍפʥ¤¥ó¥¿¥Õ¥§¥¤¥¹¤È ¤·¤Æ¤ÎÃê¾Ý¥¯¥é¥¹¤Î»ÈÍѤ䡢½ÀÆðÀ¤Î¤¢¤ë·¿°ÂÁ´¤ÊÃê¾Ý²½¤ò¼Â¸½¤¹¤ë¥Æ¥ó¥×¥ì¡¼¥È ¤Î»ÈÍÑ¡¢¤½¤·¤Æ¥¨¥é¡¼¤òɽ¤¹Îã³°¤ÎŬÀڤʻÈÍѤȤ¤¤Ã¤¿ ¤â¤Î¤ÎÊý¤¬¡¢¥ì¥¤¥¢¥¦¥È¥¹¥¿¥¤¥ë¤ÎÁªÂò¤è¤ê¤â¤Ï¤ë¤«¤Ë½ÅÍפǤ¹¡£
¡Ö¥Ï¥ó¥¬¥ê¥¢¥óµË¡¡×¤Ï¤ª´«¤á¤·¤Þ¤»¤ó¡£¡Ö¥Ï¥ó¥¬¥ê¥¢¥óµË¡¡×(ÊÑ¿ô̾¤Ë·¿Ì¾¤ò û½Ì¤·¤¿¤â¤Î¤òËä¤á¹þ¤àµË¡)¤Ï¡¢·¿¤Î¤Ê¤¤¸À¸ì¤Ë¤È¤Ã¤Æ¤ÏÍÍѤʥƥ¯¥Ë¥Ã¥¯¤À¤È»× ¤¤¤Þ¤¹¤¬¡¢¥¸¥§¥Í¥ê¥Ã¥¯¥×¥í¥°¥é¥ß¥ó¥°¤È¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥° - ¤É¤Á¤é¤â(¸À¸ì¤¢¤ë¤¤¤Ï¥é¥ó¥¿¥¤¥à¤Î¥µ¥Ý¡¼¥È¤Ë¤è¤ë)·¿¤Ë´ð¤¤¤¿¥ª¥Ú¥ì¡¼¥·¥ç¥ó¤Î ÁªÂò¤ò½ÅÍѤ¹¤ë - ¤ò¥µ¥Ý¡¼¥È¤¹¤ë¸À¸ì¤Ë¤Ï¤Þ¤Ã¤¿¤¯Å¬¤·¤Æ¤¤¤Þ¤»¤ó¡£¤½¤Î¤è¤¦¤Ê ¸À¸ì¤Ç¤Ï¡¢¡Ö̾Á°¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤Î·¿¤òÉÕ¤±¤ë¡×¤È¤¤¤¦¤Î¤Ï¡¢Ê£»¨¤Ë¤Ê¤ë¤À¤±¤Ç¡¢ Ãê¾ÝÅÙ¤ò²¼¤²¤Æ¤·¤Þ¤¤¤Þ¤¹¡£¸À¸ì¤Îµ»½ÑŪ¾ÜºÙ(¤¿¤È¤¨¤Ð¡¢¥¹¥³¡¼¥×¡¢µ²±¥¯¥é¥¹¡¢ ¹½Ê¸¥«¥Æ¥´¥ê)¤Ë´Ø¤¹¤ë¾ðÊó¤ò̾Á°¤ËËä¤á¹þ¤à¤È¤¤¤¦¤Î¤â¡¢ÄøÅ٤κ¹¤Ï¤¢¤ê¤Þ¤¹¤¬¡¢ Ʊ¤¸ÌäÂê¤òÊú¤¨¤Æ¤¤¤Þ¤¹¡£ÊÑ¿ô̾¤Ë·¿¤ò°Å¼¨¤¹¤ë¤â¤Î¤òËä¤á¹þ¤à¤³¤È¤¬¡¢»þ¤È¤·¤Æ Ìò¤ËΩ¤Ä¤³¤È¤¬¤¢¤ë¤È¤¤¤¦¤Î¤Ïǧ¤á¤Þ¤¹¤¬¡¢°ìÈÌŪ¤Ë¡¢ÆÃ¤Ë¥½¥Õ¥È¥¦¥§¥¢¤¬¿Ê²½¤¹¤ë ¤Ë¤Ä¤ì¤Æ¡¢¥á¥¤¥ó¥Æ¥Ê¥ó¥¹¾åͳ²¤Ê¤â¤Î¤È¤Ê¤ê¡¢¿¼¹ï¤Ê»¼º¤ò¤â¤¿¤é¤·¤Þ¤¹¡£ ºÒ¤¤¤Î¼ï¤Ç¤¢¤ë¡Ö¥Ï¥ó¥¬¥ê¥¢¥óµË¡¡×¤Ï»È¤ï¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£
¤·¤¿¤¬¤Ã¤Æ¡¢»ä¤Ï·¿¤Ë¤Á¤Ê¤ó¤ÇÊÑ¿ô¤Ë̾Á°¤ò¤Ä¤±¤ë¤³¤È¤Ï¹¥¤ß¤Þ¤»¤ó¡£¤Ç¤Ï¡¢ »ä¤Ï¤É¤Î¤è¤¦¤Ê̾ÉÕ¤±Êý¤ò¹¥¤ß¡¢¤É¤Î¤è¤¦¤Ê̾ÉÕ¤±Êý¤ò´«¤á¤ë¤Î¤«¤È¤¤¤¦¤È¡¢ ¤½¤ì¤Ï¼¡¤Î¤è¤¦¤Ê¤â¤Î¤Ç¤¹¡£ÊÑ¿ô(´Ø¿ô¡¢·¿¡¢¤½¤Î¾¤É¤ó¤Ê¤â¤Î¤Ç¤â)¤Ï¡¢¤½¤ì¤¬ ²¿¤Ç¤¢¤ë¤«¤ä²¿¤ò¤¹¤ë¤«¤Ë´ð¤¤¤ÆÌ¾Á°¤òÉÕ¤±¤Æ¤¯¤À¤µ¤¤¡£°ÕÌ£¤Î¤¢¤ë̾Á°¤òÁª¤ó¤Ç ¤¯¤À¤µ¤¤¡£¤Ä¤Þ¤ê¡¢¤¢¤Ê¤¿¤Î¥×¥í¥°¥é¥à¤ÎÍý²ò¤ò½õ¤±¤ë¤è¤¦¤Ê̾Á°¤òÁª¤ó¤Ç¤¯¤À¤µ¤¤¡£ ¤â¤·¡¢¤¢¤Ê¤¿¤Î¥×¥í¥°¥é¥à¤ÎÃæ¤Ç¡¢x1, x2, s3, p7¤È¤¤¤¦¤è¤¦¤Ê´Êñ¤Ë¥¿¥¤¥×¤Ç¤¤ë ÊÑ¿ô̾¤ò»È¤Ã¤Æ¤½¤Î¤Þ¤ÞÊüÃÖ¤·¤Æ¤¤¤¿¾ì¹ç¡¢¤¢¤Ê¤¿¼«¿È¤Ç¤µ¤¨¤â¡¢¤¢¤Ê¤¿¤Î ¥×¥í¥°¥é¥à¤¬²¿¤ò¤¹¤ë¤â¤Î¤Ç¤¢¤Ã¤¿¤Î¤«Íý²ò¤¹¤ë¤Î¤¬Æñ¤·¤¯¤Ê¤ê¤Þ¤¹¡£ ά¸ì¤ÈƬ»ú¸ì¤Ïº®Íð¤Î¸µ¤Ê¤Î¤Ç¡¢¹µ¤¨¤á¤Ë»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£Æ¬»ú¸ì¤Ï¹µ¤¨¤á¤Ë »ÈÍѤ¹¤Ù¤¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢mtbf, TLA, myw, RTFM, NBV¤È¤¤¤Ã¤¿¤â¤Î¤ò¹Í¤¨¤Æ¤ß¤Æ ¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤Ï°ìÌÜÎÆÁ³¤Ç¤Ï¤¢¤ê¤Þ¤¹¤¬¡¢»ä¤Ç¤µ¤¨¤â¿ô¥ö·î¸å¤Ë¤Ï¾¯¤Ê¤¯¤È¤â ¤Ò¤È¤Ä¤Ï˺¤ì¤Æ¤·¤Þ¤Ã¤Æ¤¤¤ë¤Ç¤·¤ç¤¦¡£
û¤¤Ì¾Á°¡¢¤¿¤È¤¨¤Ð x ¤ä i ¤Î¤è¤¦¤Ê̾Á°¤ò´·ÎãŪ¤Ë»ÈÍѤ¹¤ë¤Î¤Ï¸ú²ÌŪ¤Ç¤¹¡£ ¤Ä¤Þ¤ê¡¢x ¤ò¥í¡¼¥«¥ëÊÑ¿ô¤Þ¤¿¤Ï¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æ»ÈÍѤ·¡¢i ¤ò¥ë¡¼¥×¥¤¥ó¥Ç¥Ã¥¯¥¹¤È ¤·¤Æ»ÈÍѤ¹¤ë¤Î¤Ï¤è¤¤¤Ç¤·¤ç¤¦¡£
Ť¹¤®¤ë̾Á°¤Ï»ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¥¿¥¤¥×¤¹¤ë¤Î¤¬ÌÌÅݤǤ¹¤·¡¢¹Ô¤¬¤È¤Æ¤â Ť¯¤Ê¤Ã¤Æ¤·¤Þ¤¤¡¢¥¹¥¯¥ê¡¼¥ó¤Ë¼ý¤Þ¤é¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¤½¤·¤Æ¡¢ÁÇÁ᤯ÆÉ¤ß¤Å¤é¤¯ ¤Ê¤ê¤Þ¤¹¡£°Ê²¼¤Î̾Á°¤ÏOK¤Ç¤·¤ç¤¦¡£
partial_sum element_count staple_partition°Ê²¼¤Î̾Á°¤Ï¤¿¤Ö¤óŤ¹¤®¤ë¤Ç¤·¤ç¤¦¡£
the_number_of_elements remaining_free_slots_in_symbol_table»ä¤Ï¼±Ê̻ҤÎÃæ¤Îñ¸ì¤ò¶èÀÚ¤ë¤Î¤ËelementCount¤äElementCount¤Î¤è¤¦¤Ë¤¹¤ë¤è¤ê¤â¡¢ ¥¢¥ó¥À¡¼¥¹¥³¥¢¤ò¹¥¤ó¤Ç»ÈÍѤ·¤Þ¤¹(Îã: element_count)¡£ ¤¹¤Ù¤Æ¤Îʸ»ú¤òÂçʸ»ú¤Ë¤·¤¿Ì¾Á°(Îã: BEGIN_TRANSACTION)¤Ï¡¢´·ÎãŪ¤Ë¥Þ¥¯¥í¤Ç¤Î »ÈÍѤËͽÌó¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢ÀäÂФ˻ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤¢¤Ê¤¿¤¬¥Þ¥¯¥í¤ò »ÈÍѤ·¤Ê¤¤¤È¤·¤Æ¤â¡¢Ã¯¤«¤¬¤¢¤Ê¤¿¤Î¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤ò¤½¤¦¤¤¤Ã¤¿Ì¾Á°¤Ç±ø¤¹¤«¤â ¤·¤ì¤Þ¤»¤ó¡£ ·¿Ì¾¤Ë¤ÏÀèÆ¬¤òÂçʸ»ú¤Ë¤·¤¿Ì¾Á°¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤(Îã: Square, Graph)¡£C++¸À¸ì ¤Èɸ½à¥é¥¤¥Ö¥é¥ê¤Ç¤ÏÂçʸ»ú¤ò»ÈÍѤ·¤Ê¤¤¤Î¤Ç¡¢Int¤Ç¤Ï¤Ê¤¯int¤È¤·¡¢String¤Ç¤Ï ¤Ê¤¯string¤È¤·¤Æ¤¤¤Þ¤¹¡£¤³¤¦¤¹¤ë¤³¤È¤Ç¡¢É¸½à¤Î·¿¤È¸«Ê¬¤±¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¥ß¥¹¥¿¥¤¥×¤·¤ä¤¹¤¤Ì¾Á°¡¢ÆÉ¤ß´Ö°ã¤¤¤·¤ä¤¹¤¤Ì¾Á°¡¢º®Í𤹤ë̾Á°¤ÏÈò¤±¤Æ¤¯¤À ¤µ¤¤¡£¤¿¤È¤¨¤Ð¼¡¤Î¤è¤¦¤Ê̾Á°¤Ç¤¹¡£
name names nameS foo f00 fl f1 fI fi0, o, O, 1, l, I¤È¤¤¤¦Ê¸»ú¤ÏÆÃ¤ËÌäÂê¤òµ¯¤·¤ä¤¹¤¤¤â¤Î¤Ç¤¹¡£
̿̾µ¬Ìó¤ÎÁªÂò¤Ï¡¢¥í¡¼¥«¥ë¥¹¥¿¥¤¥ëµ¬Â§¤Ë¤è¤Ã¤ÆÀ©¸Â¤µ¤ì¤ë¤³¤È¤¬Â¿¤¯¤¢¤ê¤Þ¤¹¡£ ¤¢¤Ê¤¿¤¬ºÇÁ±¤È¹Í¤¨¤ëÊýË¡¤Ë»öºÙ¤«¤Ë½¾¤¦¤è¤ê¤â¡¢°ì´ÓÀ¤Î¤¢¤ë¥¹¥¿¥¤¥ë¤òÊݤĤ³¤È ¤ÎÊý¤¬½ÅÍפʤ³¤È¤¬Â¿¤¤¤È¤¤¤¦¤³¤È¤ò˺¤ì¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£
²¿¤ò¼Â¸½¤·¤¿¤¤¤«¤Ë¤è¤ê¤Þ¤¹¡£
¡ÖÂ礤¤¡×¤È¤Ï¤É¤¦¤¤¤¦°ÕÌ£¤Ç¤·¤ç¤¦¤«¡£ 2,3¥ï¡¼¥É¤è¤ê¤âÂ礤¤¤â¤Î¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£
¤Ê¤¼°ú¿ô¤òÊѹ¹¤·¤¿¤¤¤Î¤Ç¤·¤ç¤¦¤«¡£ ¤½¤ì¤Ï¡¢¤½¤¦¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤¬Â¿¤¯¤¢¤ë¤«¤é¤Ç¤¹¤¬¡¢Â¾¤ÎÊýË¡¤â¤¢¤ê¤Þ¤¹¡£ ¤½¤ì¤Ï¡¢¿·¤·¤¤ÃͤòÀ¸À®¤¹¤ë¤È¤¤¤¦ÊýË¡¤Ç¤¹¡£¼¡¤Î¥³¡¼¥É¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
void incr1(int& x); // ¥¤¥ó¥¯¥ê¥á¥ó¥È int incr2(int x); // ¥¤¥ó¥¯¥ê¥á¥ó¥È int v = 2; incr1(v); // v¤Ï3¤Ë¤Ê¤ë v = incr2(v); // v¤Ï4¤Ë¤Ê¤ëÆÉ¤à¿Í¤Ë¤È¤Ã¤Æ¤Ï¡¢incr2()¤ÎÊý¤¬Íý²ò¤·¤ä¤¹¤¤¤Î¤Ç¤Ï¤Ê¤¤¤«¤È»×¤¤¤Þ¤¹¡£ incr1()¤ÎÊý¤¬¸í¤ê¤ä¥¨¥é¡¼¤òµ¯¤¹²ÄǽÀ¤¬¹â¤¤¤Ç¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¿·¤·¤¤ÃͤÎÀ¸À® ¤È¥³¥Ô¡¼¤¬¹â¤¯¤Ä¤«¤Ê¤¤¸Â¤ê¡¢»ä¤ÏÃͤòÊѹ¹¤¹¤ë¥¹¥¿¥¤¥ë¤è¤ê¤â¡¢¿·¤·¤¤ÃͤòÊÖ¤¹ ¥¹¥¿¥¤¥ë¤ÎÊý¤¬¤è¤¤¤È»×¤¤¤Þ¤¹¡£
¤½¤ì¤Ç¤â»ä¤Ï°ú¿ô¤òÊѹ¹¤·¤¿¤¤¤Î¤Ç¤¹¤¬¡¢¥Ý¥¤¥ó¥¿¤ò»È¤¦¤Ù¤¤Ç¤¹¤«¡£¤½¤ì¤È¤â ¥ê¥Õ¥¡¥ì¥ó¥¹¤ò»È¤¦¤Ù¤¤Ç¤¹¤«¡£ ÀâÆÀÎϤΤ¢¤ëÏÀÍýŪ¤Êº¬µò¤Ï»ä¤Ë¤Ï¤ï¤«¤ê¤Þ¤»¤ó¡£ ¤â¤·¡Ö¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤Ï¤Ê¤¤¤â¤Î¡×(Îã: ¥Ì¥ë¥Ý¥¤¥ó¥¿)¤ò¼õ¤±¼è¤ê²Äǽ¤Ë¤¹¤ë¤Ê¤é¡¢ ¥Ý¥¤¥ó¥¿¤ò»È¤¦¤Î¤¬¤è¤¤¤Ç¤·¤ç¤¦¡£»ä¼«¿È¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥È¤òÊѹ¹¤·¤¿¤¤¤È¤¤Ë ¥Ý¥¤¥ó¥¿¤ò»ÈÍѤ·¤Þ¤¹¡£¤Ê¤¼¤Ê¤é¡¢¥³¥ó¥Æ¥¥¹¥È¤Ë¤è¤Ã¤Æ¤Ï¡¢Êѹ¹²Äǽ¤Ç¤¢¤ë¤³¤È ¤¬¤ï¤«¤ê¤ä¤¹¤¯¤Ê¤ë¤«¤é¤Ç¤¹¡£
¥á¥ó¥Ð´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤Ï¡¢´ðËÜŪ¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ·¤Æ»²¾È¸Æ¤Ó½Ð¤·¤Ç¤¢¤ë¤³ ¤È¤Ë¤âÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤½¤Î¤¿¤á¡¢¥ª¥Ö¥¸¥§¥¯¥È¤ÎÃÍ/¾õÂÖ¤òÊѹ¹¤·¤¿¤¤¤È¤¤Ï¡¢ ¤·¤Ð¤·¤Ð¥á¥ó¥Ð´Ø¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£
»ä¤ÏÁ°¤ËÃÖ¤¤Þ¤¹¤¬¡¢¤³¤ì¤Ï¹¥¤ß¤ÎÌäÂê¤Ç¤¹¡£"const T"¤È"T const"¤Ï°ÊÁ°¤«¤é ¤º¤Ã¤È(¤É¤Á¤é¤â)ǧ¤á¤é¤ì¤Æ¤¤¤Æ¡¢Æ±¤¸°ÕÌ£¤ò»ý¤Á¤Þ¤¹¡£°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
const int a = 1; // OK int const b = 2; // ¤³¤Á¤é¤âOKºÇ½é¤ÎÎã¤ÎÊý¤¬º®Í𤹤ë¥×¥í¥°¥é¥Þ¤Ï¾¯¤Ê¤¤(¤½¤·¤Æ¡¢¤è¤ê´·ÍÑŪ¤Ç¤¢¤ë)¤Î¤Ç¤Ï¤Ê¤¤ ¤«¤È»×¤¤¤Þ¤¹¡£
»ä¤¬"const"(¤Ï¤¸¤á¤Ï"readonly"¤È¤¤¤¦Ì¾Á°¤Ç¡¢¤½¤ì¤ËÂбþ¤¹¤ë"writeonly"¤â ¤¢¤Ã¤¿)¤ò¹Í°Æ¤·¤¿¤È¤¡¢Û£Ë椵¤¬¤Ê¤«¤Ã¤¿¤Î¤Ç¡¢"const"¤ò·¿¤ÎÁ°¸å¤É¤Á¤é¤Ë¤Ç¤â ÃÖ¤±¤ë¤è¤¦¤Ë¤·¤Þ¤·¤¿¡£É¸½à²½¤µ¤ì¤ëÁ°¤Î C ¤ÈC++¤Ï¡¢¼±Ê̻ҤÎʤӽç¤Îµ¬Â§¤ò²¡¤· ÉÕ¤±¤ë¤³¤È¤Ï¡¢(¾¯¤·¤Ï¤¢¤Ã¤¿¤È¤·¤Æ¤â)¤Û¤È¤ó¤É¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£
ʤӽç¤Ë´Ø¤·¤ÆÅö»þ½Ï¹Í¤·¤¿¤³¤È¤ä¸ò¤·¤¿µÄÏÀ¤Ï³Ð¤¨¤Æ¤¤¤Þ¤»¤ó¡£½é´ü¤Î¾¯¿ô¤Î ¥æ¡¼¥¶(ÆÃ¤Ë»ä¼«¿È)¤ÏÅö»þ¡¢
const int c = 10;¤ÎÊý¤¬¡¢
int const c = 10;¤è¤ê¤âñ½ã¤Ë¸«¤¿Ìܤ¬µ¤¤ËÆþ¤Ã¤Æ¤¤¤Þ¤·¤¿¡£
»ä¤¬½é´ü¤Îº¢¤Ë½ñ¤¤¤¿¥×¥í¥°¥é¥à¤Ç¤Ï"readonly"¤ò»ÈÍѤ·¤Æ¤¤¤Æ¡¢
readonly int c = 10;¤ÎÊý¤¬¡¢
int readonly c = 10;¤è¤ê¤âÆÉ¤ß¤ä¤¹¤¤¤È¤¤¤¦¤³¤È¤Ë±Æ¶Á¤µ¤ì¤Æ¤¤¤¿¤Î¤«¤â¤·¤ì¤Þ¤»¤ó¡£"const"¤ò»ÈÍѤ· ¤Æ¤¤¤ëºÇ¤â½é´ü¤Îº¢¤Î(C¤Þ¤¿¤ÏC++)¥³¡¼¥É¤Ï¡¢(»ä¤¬)"readonly"¤ò"const"¤Ë¤¹¤Ù¤Æ ÃÖ¤´¹¤¨¤ÆºîÀ®¤·¤¿¤â¤Î¤Î¤è¤¦¤Ç¤¹¡£
»ä¤Ï²¿¿Í¤«¤Î¿Íã - Dennis Ritchie¤ò´Þ¤à - ¤ÈÊ̤ι½Ê¸¤Ë¤Ä¤¤¤ÆµÄÏÀ¤·¤¿¤³¤È ¤ò³Ð¤¨¤Æ¤¤¤Þ¤¹¤¬¡¢¤½¤Î¤È¤¤É¤Î¸À¸ì¤ËÃíÌܤ·¤Æ¤¤¤¿¤Î¤«¤Ï³Ð¤¨¤Æ¤¤¤Þ¤»¤ó¡£
¥Ý¥¤¥ó¥¿Äê¿ô¤Ç¤Ï¡¢"const"¤Ï¾ï¤Ë"*"¤Î¸å¤ËÃÖ¤¯¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
int *const p1 = q; // intÊÑ¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿Äê¿ô int const* p2 = q; // intÄê¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿ const int* p3 = q; // intÄê¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿
¤³¤Îʸ½ñ¤Ï¸¶Ãø¼Ô¤Îµö²Ä¤òÆÀ¤ÆËÝÌõ¡¢¸ø³«¤·¤Æ¤¤¤Þ¤¹¡£
Ãø¼Ô: Bjarne Stroustrup
¸¶Ê¸:
Bjarne Stroustrup's C++ Style and Technique FAQ (2008ǯ8·î29Æü¹¹¿·)
ÆüËܸìÌõ: ¿ÀµÜ¿®ÂÀϺ(jin@libjingu.jp)
ÆüËܸìÌõ¤Ë´Ø¤¹¤ë¥³¥á¥ó¥È¡¢¸í¤ê¤Î»ØÅ¦¤Ê¤É¤¢¤ê¤Þ¤·¤¿¤é¡¢Ìõ¼Ô¤Þ¤Ç¤ªÃΤ餻¤¯¤À¤µ¤¤¡£
ÆüËܸìÌõ¤Ë¤¢¤¿¤ê¡¢°Ê²¼¤Îʸ¸¥¤ò»²¹Í¤Ë¤µ¤»¤Æ¤¤¤¿¤À¤¤Þ¤·¤¿¡£