C++ Style and Technique FAQ ?嶄猟井?

Bjarne Stroustrup 广? 從堝哂 咎
[廣: 云恵霧村岻咎猟将Stroustrup鴬平娩幡。泌勣廬墮?萩才厘選狼? zmelody@sohu.com ]

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);	// read elements
		if (!cin.eof()) {		// check if input failed
			cerr << "format error\n";
			return 1;	// error return
		}
		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; // success return
	}
殻會載酒汽?頁杏。宸戦頁斤万議匯乂^鉱賀烏御 ??
ゞThe C++ Programming Language 〃及眉井嶄購噐炎彈垂議嫗准戦嗤厚謹厚峋聾箭徨?低辛參宥狛万断僥氏泌採聞喘炎彈垂栖^煤防吾協酒汽販暦 ?。

Q: 葎採厘園咎匯倖殻會勣雑椎担謹扮寂?

A: 匆俯頁低議園咎匂嗤泣音湊斤遊!!万頁音頁定射湊寄阻?賜宀短嗤芦廾屎鳩?匆辛嬬低議窮辻乎序鴬麗鋼阻 ? ?斤噐宸劔議諒籾厘辛寔頁握暢嬬廁阻。

音狛?匆嗤辛嬬圻咀壓噐低議殻會!!心心低議殻會譜柴珊嬬音嬬個序?園咎匂頁音頁葎阻乏旋恢竃屎鳩議屈序崙鷹遇音誼音郭序撹為倖遊猟周、叱嵐佩議坿旗鷹?圻夸貧?峪勣斤坿鷹癖輝單晒匯和?園咎産蛸議諒籾哘乎辛參盾畳。泌惚屏潤壓噐低議窃垂工哘斌?椎担低寄古茅阻^算匯社窃垂工哘斌 ?翌鳩糞短焚担辛恂議阻?徽泌惚諒籾壓噐低徭失議旗鷹?椎担頼畠辛參宥狛嶷更?refactoring?栖斑低議旗鷹厚葎潤更晒?貫遇聞坿鷹匯稀嗤厚個扮俶嶷園咎議旗鷹楚恷弌。宸劔議旗鷹吏吏頁厚挫議譜柴?咀葎万議添栽殻業熟詰?辛略擦來熟煮。

厘断栖心匯倖OOP議将灸箭徨?

	class Shape {
	public:		// interface to users of Shapes
		virtual void draw() const;
		virtual void rotate(int degrees);
		// ...
	protected:	// common data (for implementers of Shapes)
		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議巷慌順中栖侃尖^光嶽侘彜 ??遇Shape議隠擦撹埀戻工阻光写覚窃?曳泌Circle?Triangle?慌揖俶勣議孔嬬。匆祥頁傍?繍光嶽侘彜?shapes?議巷慌咀殆皿拷欺児窃Shape嶄肇。宸嶽尖廷心栖載栽尖?音狛厘勣戻萩低廣吭?

侭參?壓児窃嶄慧匯乂^斤噐写覚窃岻糞恬嗤逸廁 ?議孔嬬賜俯頁竃噐挫吭?徽糞夸頁醍軍議坿畑。喘薩議勣箔頁謹延議?侭參糞恬旗鷹匆頁謹延議。繍謹延議旗鷹慧壓俯謹写覚窃脅勣喘欺議児窃岻嶄?椎担延晒辛祥音頁蕉何議阻?宸氏夛撹畠蕉唹峒議?醤悶遇冱祥頁?児窃侭厥正議匯倖遊猟周延強阻?椎担侭嗤写覚窃侭壓議猟周脅俶嶷仟園咎。

宸劔蛍裂狛朔?盾畳岻祇祥?垓瘈彈藋烹砂欞?兒禎獏致焞ş蚣鶺長?化臙罍ii璐?斡埃務仞獏佯叩欝鎚久濹δ榧導??

	class Shape {
	public:		// interface to users of Shapes
		virtual void draw() const = 0;
		virtual void rotate(int degrees) = 0;
		virtual Point center() const = 0;
		// ...
		// no data
	};
	class Circle : public Shape {
	public:	
		void draw() const;
		void rotate(int) { }
		Point center() const { return center; }
		// ...
	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:		// interface to users of Shapes
		virtual void draw() const = 0;
		virtual void rotate(int degrees) = 0;
		virtual Point center() const = 0;
		// ...
		// no data
	};
	struct Common {
		Color col;
		// ...
	};
		
	class Circle : public Shape, protected Common {
	public:	
		void draw() const;
		void rotate(int) { }
		Point center() const { return center; }
		// ...
	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;
	};	
[咎廣?宸戦恬宀議房揃祥頁溝羨延晒?受富骼栽。貫宸倖箭徨嶄響宀辛參僥欺匯泣Refactoring議秘壇岑紛 :O) ]

Q: 葎採腎窃議寄弌音頁巣?

A: 葎阻鳩隠曾倖音揖斤嵆議仇峽音揖?駅倬泌緩。匆屎咀葎泌緩?new卦指議峺寞悳頁峺?音揖議汽倖斤嵆。厘断珊頁栖心旗鷹杏?
	class Empty { };
	void f()
	{
		Empty a, b;
		if (&a == &b) cout << "impossible: report error to compiler supplier";
		Empty* p1 = new Empty;
		Empty* p2 = new Empty;
		if (p1 == p2) cout << "impossible: report error to compiler supplier";
	}	
総翌?C++嶄嗤匯訳嗤箸議号夸!!腎児窃旺音俶勣総翌匯倖忖准栖燕幣?
	struct X : Empty {
		int a;
		// ...
	};
	void f(X* p)
	{
		void* p1 = p;
		void* p2 = &p->a;
		if (p1 == p2) cout << "nice: good optimizer";
	}
泌惚貧峰旗鷹嶄p1才p2屢吉?椎担傍苧園咎匂恬阻單晒。宸劔議單晒頁芦畠議?遇拝掲械嗤喘。万塋俯殻會埀喘腎窃栖燕幣掲械酒汽議古廷?遇音俶葎緩原竃駆翌議?腎寂?旗勺。匯乂孖旗園咎匂戻工阻宸嶽^倡児窃單晒 ?孔嬬。

Q: 葎焚担厘駅倬委方象慧欺窃議蕗苧岻嶄?

A: 短繁膿独低宸担恂。泌惚低音錬李順中嶄嗤方象?椎担祥音勣委万慧壓協吶順中議窃嶄?慧欺写覚窃嶄挫阻。歌心^葎採厘園咎匯倖殻會勣雑椎担謹扮寂 ?訳朕。[咎廣?云FAQ嶄群圻猟葎declare/declaration議譲咎葎蕗苧?define/definition譲咎葎協吶。曾宀梱吶岻児云餓艶歌需朔中^`int* p; ?才`int *p; ?欺久陳倖屎鳩 ?訳朕嶄議咎廣。宥械遇冱?厘断珊頁繍和中議幣箭旗鷹各葎complex窃議協吶?遇繍汽汽匯佩^class complex; ?各恬蕗苧。]
徽匆嗤議扮昨低鳩糞俶勣委方象慧欺窃蕗苧戦中?曳泌和中議鹸方窃議箭徨?
	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;
	};
宸倖complex?鹸方?窃頁瓜譜柴撹崧C++坪崔窃侏椎劔聞喘議?侭參方象燕幣駅倬竃孖壓蕗苧岻嶄?參宴辛參秀羨寔屎議云仇斤嵆?軸壓均媚貧蛍塘議斤嵆?遇掲壓均嶄蛍塘??宸揖扮匆鳩隠阻酒汽荷恬嬬瓜屎鳩坪選晒。^云仇斤嵆 ?才^坪選 ?宸曾泣載嶷勣?咀葎宸劔嘉辛參聞厘断議鹸方窃器欺才坪崔鹸方窃侏議囂冱屢輝議丼楕。
[咎廣?厘状誼Bjarne議宸粁指基嗤泣^毛閲諒籾 ?岻腕。厘??戻諒宀議寔糞吭夕賜俯頁?岑祇泌採喘C++繍^順中 ?嚥^糞恬 ?頼畠蛍宣。音侑議頁?C++囂冱才窃字崙云附音戻工宸嶽圭塀。厘断脅岑祇?窃議^順中 ?何蛍吏吏瓜協吶葎巷嗤?匯違頁匯乂倡痕方??^糞恬 ?何蛍夸吏吏協吶葎隠擦賜暴嗤?淫凄痕方才方象??徽涙胎頁^public ?粁珊頁^protected ?、^private ?粁脅駅倬竃孖壓窃議蕗苧嶄?昧窃蕗苧侭壓議遊猟周匯軟戻工。?栖宸祥頁^葎採方象駅倬慧欺窃蕗苧嶄 ?諒籾議喇栖杏。葎阻盾畳宸倖諒籾?厘断嗤倖延宥議一隈?聞喘Proxy庁塀?歌需ゞDesign Patterns : Elements of Reusable Object-Oriented Software〃匯慕??厘断辛參繍糞恬何蛍壓proxy窃嶄蕗苧?各葎^斤嵆怏栽 ???遇音繍proxy窃議蕗苧羽其公喘薩。箭泌?
	class Implementer; // forward declaration
	class Interface {
	public:
		// interface
	private:
		Implementer impl;
	};
壓宸倖箭徨嶄?Implementer窃祥頁proxy。壓Interface嶄羽其公喘薩議峪頁匯倖impl斤嵆議^贋功 ??遇涙糞恬坪否。Implementer窃辛參泌和蕗苧?
	class Implementer {
public:
// implementation details, including data members
};

貧峰旗鷹嶄議廣瞥侃辛參贋慧戻諒宀侭傍議^方象 ??遇Implementer議蕗苧旗鷹音俶羽其公喘薩。音狛?Proxy庁塀匆音頁噴畠噴胆議!!Interface宥狛impl峺寞寂俊距喘糞恬旗鷹揮栖阻駆翌議蝕?。賜俯響宀氏傍?C++音頁嗤坪選字崙宅?宸倖蝕?嬬宥狛坪選協吶遇置温杏。徽艶梨阻?緩侃塰喘Proxy庁塀議朕議祥頁委^糞恬 ?何蛍咨茄軟栖?宸^咨茄 ?吏吏祥吭龍彭^糞恬旗鷹 ?參全俊垂嶄議屈序崙旗鷹侘塀贋壓。朕念議C++園咎匂才全俊匂嬬恂欺屡^旗鷹坪選 ?嗽^屈序崙咨茄 ?宅?賜俯辛參。椎担Proxy庁塀嗽嬬倦才C++議庁医字崙^栽恬噪酔 ?椿??算鞘三傍?泌惚念中旗鷹嶄Interface才Implementer議蕗苧譲音頁class?遇頁template?嗽泌採椿??購囚壓噐?園咎匂斤坪選才庁医議屶隔岻糞恬頁倦俶勣序佩坿鷹申唄?珊頁辛參序佩屈序崙鷹申唄。朕念遇冱?C#議刑侏屶隔岻糞恬頁壓Intermediate Language蚊中貧議?遇C++夸頁坿鷹蚊中貧議。Bjarne公竃議鹸方窃蕗苧旗鷹各^方象駅倬竃孖壓窃蕗苧嶄 ?匆頁何蛍竃噐宸嶽深打。最最?涯垓阻 ? ?穎捷?宸粁猟忖峪頁FAQ議^咎廣 ?遇厮?緩侃音恬厚謹冥網?嗤佶箸議響宀辛參徭失肇儖孀基宛 :O) ]

Q: 葎採撹埀痕方音頁潮範葎倡?

A: 咀葎俯謹窃音頁瓜喘栖恂児窃議。[咎廣?喘栖恂児窃議窃械窃貌噐凪万囂冱嶄議interface古廷!!万断議恬喘頁葎匯怏窃協吶匯倖巷慌初中。徽C++嶄議窃?堡算荒佩躑狷篷虵値勝Ąˇ犯膠輅紹燦欬潴綉沈ß浩猥諭?] 箭泌?鹸方窃祥頁泌緩。

総翌?嗤倡痕方議窃嗤倡字崙議蝕?[咎廣?峺贋慧vtable揮栖議腎寂蝕?才宥狛vtable嶄議峺寞寂俊距喘揮栖議扮寂蝕?]?宥械遇冱耽倖斤嵆奐紗議腎寂蝕?頁匯倖忖海。宸倖蝕?辛音弌?遇拝氏夛撹才凪麿囂冱?曳泌C?Fortran?議音惹否來!!嗤倡痕方議窃議坪贋方象下蕉才噸宥議窃頁載音匯劔議。[咎廣?宸嶽坪贋方象下蕉議惹否來諒籾氏公謹囂冱詞栽園殻揮栖醍軍。]

ゞThe Design and Evolution of C++〃 嶄嗤厚謹購噐譜柴尖廷議聾准。


Q: 葎採裂更痕方音頁潮範葎倡?

A: 込?低寄古岑祇厘勣傍焚担阻 :O) 挽隼頁咀葎!!俯謹窃音頁瓜喘栖恂児窃議。峪嗤壓窃瓜恬葎interface聞喘扮倡痕方嘉嗤吭吶。?宸劔議窃械械壓坪贋均貧糞箭晒斤嵆旺宥狛峺寞賜哈喘恵諒。?

椎担?採扮厘乎斑裂更痕方葎倡椿?填?基宛頁!!輝窃嗤凪万倡痕方議扮昨?低祥哘乎斑裂更痕方葎倡。嗤凪万倡痕方?祥吭龍彭宸倖窃勣瓜写覚?祥吭龍彭万嗤泣^interface ?議龍祇阻。宸劔匯栖?殻會埀祥辛嬬氏參児窃峺寞栖峺?喇万議写覚窃侭糞箭晒遇栖議斤嵆?遇嬬倦宥狛児窃峺寞栖屎械瞥慧宸劔議斤嵆祥勣心裂更痕方頁倦葎倡阻。 箭泌?

	class Base {
		// ...
		virtual ~Base();
	};
	class Derived : public Base {
		// ...
		~Derived();
	};
	void f()
	{
		Base* p = new Derived;
		delete p;	// virtual destructor used to ensure that ~Derived is called
	}
泌惚Base議裂更痕方音頁倡議?椎担Derived議裂更痕方祥音氏瓜距喘!!宸械械氏揮栖具惚?曳泌?Derived嶄蛍塘議彿坿短嗤瓜瞥慧。

Q: C++嶄葎採短嗤倡亭更夛痕方?

A: 倡亭字崙議譜柴朕議頁聞殻會埀壓音頼畠阻盾聾准?曳泌峪岑乎窃糞孖阻蝶倖順中?遇音岑乎窃鳩俳頁焚担叫叫?議秤趨和匆嬬聞喘斤嵆。徽頁?勣秀羨匯倖斤嵆?辛音嬬峪岑祇^宸寄悶貧頁焚担 ?祥頼並!!低駅倬頼畠阻盾畠何聾准?賠萱仇岑祇低勣秀羨議斤嵆頁梢捷焚担。侭參?更夛痕方輝隼音嬬頁倡議阻。
音狛嗤扮壓秀羨斤嵆扮匆俶勣匯協議寂俊來?宸祥俶勣喘泣室派栖糞孖阻。?峋需ゞThe C++ Programming Language〃?及眉井?15.6.2?宸劔議室派嗤扮匆瓜各恬^倡亭更夛痕方 ?。厘宸戦訟倖聞喘渇嵆窃栖^倡亭更夛斤嵆 ?議箭徨?
	struct F {	// interface to object creation functions
		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();	// make an A of the appropriate type
		B* q = fac.make_a_B();	// make a B of the appropriate type
		// ...
	}
	struct FX : F {
		A* make_an_A() const { return new AX();	} // AX is derived from A
		B* make_a_B() const { return new BX();	} // BX is derived from B
	
	};
	struct FY : F {
		A* make_an_A() const { return new AY();	} // AY is derived from A
		B* make_a_B() const { return new BY();	} // BY is derived from B
	};
	int main()
	{
		user(FX());	// this user makes AXs and BXs
		user(FY());	// this user makes AYs and BYs
		// ...
	}
心苧易阻短嗤?貧峰旗鷹凪糞塰喘阻Factory庁塀議匯倖延悶。購囚岻侃頁?user()瓜頼畠溝羨蝕阻!!万斤AX?AY宸乂窃匯涙侭岑。?細細?嗤扮涙岑嗤涙岑議挫侃 ^_^?

Q: 葎採涙隈壓塗伏窃嶄嶷墮?

A: 宸倖諒籾械械頁喇宸劔議箭徨嶄恢伏議?
	#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岻寂短嗤嶷墮窟伏。低距喘阻pd->f()?園咎匂祥壓D議兆忖囃戦孀亜孀?孀欺double f(double)朔祥距喘万阻。園咎匂請誼壅欺B議兆忖囃戦肇心心嗤短嗤陳倖痕方厚憲栽勣箔。芝廖?壓C++嶄?短嗤睡囃嶷墮!!写覚窃才児窃埋隼購狼載牌畜?徽匆音嬬撒阻宸訳号裳。峋需ゞThe Design and Evolution of C++〃賜宀ゞThe C++ Programming Language〃及眉井。

音狛?泌惚低掲誼勣睡囃嶷墮?匆音頁短嗤延宥議圭隈!!低祥委椎乂痕方的欺揖匯倖囃戦栖挫阻。聞喘匯倖using蕗苧祥辛參吾協。

	class D : public B {
	public:
		using B::f;	// make every f from B available
		double f(double d) { cout << "f(double): "; return d+1.3; }
		// ...
	};
宸劔匯栖?潤惚祥頁
	f(int): 3
	f(double): 3.6
嶷墮窟伏阻!!咀葎D嶄議椎鞘 using B::f 苧鳩御盆園咎匂?勣委B囃嶄議f哈秘輝念囃?萩園咎匂^匯篇揖畔 ?。

Q: 厘嬬貫更夛痕方距喘倡痕方宅?

A: 辛參。音狛低誼啼彭泣。輝低宸劔恂扮?匆俯低徭失脅音岑祇徭失壓孤焚担?壓更夛痕方嶄?倡亭字崙賓隆窟伏恬喘?咀葎緩扮overriding賓隆窟伏。嵐嬋互促峠仇軟?悳誼枠嬉仇児杏?斤嵆議秀羨匆頁宸劔!!枠委児窃更夛頼穎?隼朔壓緩児粥貧更夛塗伏窃。
心心宸倖箭徨?
	#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 constructor
廣吭?補竃音頁D::f 。 梢捷窟伏阻焚担?f()頁壓B::B()嶄距喘議。泌惚更夛痕方嶄距喘倡痕方議号夸音頁泌念猟侭峰椎劔?遇頁泌匯乂繁錬李議椎劔肇距喘D::f()。椎担咀葎更夛痕方D::D()賓隆塰佩?忖憲堪s珊隆兜兵晒?侭參輝D::f()編夕繍歌方験公s扮?潤惚謹磯頁!!羨瀧輝字。

裂更夸屎屢郡?恆儉貫写覚窃欺児窃議乏會?介型徨悳誼貫貧吏和介杏???侭參凪距喘倡痕方議佩葎才壓更夛痕方嶄匯劔?倡痕方緩扮緩震瓜鰯協欺陳戦?輝隼哘乎頁児窃晴!!咀葎写覚窃厮将瓜^介 ?阻!!裂更阻???距喘議祥頁陳倖痕方。

厚謹聾准萩需ゞThe Design and Evolution of C++〃?13.2.4.2 賜宀ゞThe C++ Programming Language〃及眉井?15.4.3 。

嗤扮?宸訳号夸瓜盾瞥葎頁喇噐園咎匂議糞恬夛撹議。[咎廣?貫糞恬叔業辛參宸劔盾瞥?壓俯謹園咎匂嶄?岷欺更夛痕方距喘頼穎?vtable嘉瓜秀羨?緩扮倡痕方嘉瓜強蓑鰯協崛写覚窃議揖兆痕方。] 徽並糞貧音頁宸担匯指並!!斑園咎匂糞恬撹^更夛痕方嶄距喘倡痕方匆才貫凪麿痕方嶄距喘匯劔 ?頁載酒汽議[咎廣?峪勣委vtable議秀羨卞崛更夛痕方距喘岻念軸辛]。購囚珊壓噐囂冱譜柴扮議深楚!!斑倡痕方辛參箔廁噐児窃戻工議宥喘旗鷹。[咎廣?枠嗤痔珊頁枠嗤軌?Bjarne糞縞貧頁壓御盆低?音頁^枠嗤糞恬壅嗤号夸 ??遇頁^泌緩糞恬?咀葎号夸泌緩 ?。]


Q: 嗤"placement delete"宅?

A: 短嗤。音狛泌惚低寔議?勣?低祥傍啄!!填音?厘議吭房頁!!低辛參徭失亟匯倖。
厘断栖心心繍斤嵆慧崛蝶倖峺協魁侭議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 delete ?議尖喇頁?短一隈戻工匯倖宥喘議placement delete。C++議窃侏狼由短一隈斑厘断容僅竃p1頁峺?瓜慧崔壓a1嶄議斤嵆。軸聞厘断嬬校掲械爺嘉仇容岑宸泣?匯倖酒汽議峺寞験峙荷恬匆氏斑厘断嶷尣達隼。音狛?殻會埀云繁哘乎岑祇壓麿徭失議殻會嶄焚担峺?焚担?侭參辛參嗤盾畳圭宛?
	template<class T> void destroy(T* p, Arena& a)
	{
		if (p) {
			p->~T();		// explicit destructor call
			a.deallocate(p);
		}
	}
宸劔厘断祥辛參亟?
destroy(p1,a1);
destroy(p2,a2);
destroy(p3,a3);
泌惚Arena徭附効忸慧崔凪嶄議斤嵆?椎担低辛參芦畠仇亟竃destroy()痕方 ?委^隠屬涙危 ?議酌陣販暦住公Arena?遇音頁徭失覚毅。

泌採壓窃写覚悶狼嶄協吶塘斤議operator new() 才 operator delete() 辛參歌心 ゞThe C++ Programming Language〃?Special Edition?15.6准 ?ゞThe Design and Evolution of C++〃?10.4准?參式ゞThe C++ Programming Language〃?Special Edition?19.4.5准。[咎廣?緩侃梓圻猟孚咎。念中嗤戻欺^歌需ゞThe C++ Programming Language〃及眉井 ?議?糞縞貧蒙艶井?Special Edition?才熟除嶷咫議及眉井短焚担曝艶。]


Q: 厘嬬契峭艶繁貫厘議窃写覚宅?

A: 辛參議?徽採駅椿?挫杏?匆俯嗤曾倖尖喇?

功象厘議将刮?^丼楕深打 ?械械歓奉謹噫。壓C++嶄?倡痕方距喘泌緩岻酔?才噸宥痕方距喘旺短嗤湊謹議曝艶。萩廣吭?峪嗤宥狛峺寞賜宀哈喘距喘扮嘉氏尼喘倡亭字崙?泌惚低峺兆祇侖仇距喘匯倖斤嵆?C++園咎匂氏徭強單晒?肇茅販採議駆翌蝕?。

泌惚葎阻才^倡痕方距喘 ?傍byebye?椎担鳩糞嗤公窃写覚悶狼^撃競 ?議俶勣。壓譜柴念?音恵枠諒諒徭失?宸乂痕方葎採勣瓜譜柴撹倡議。厘鳩糞需狛宸劔議箭徨?來嬬勣箔秦震議痕方瓜譜柴撹倡議?叙叙咀葎^厘断楼降宸劔恂 ??

挫阻?涙胎泌採?傍阻椎担謹?穎捷低峪頁?岑祇?葎阻蝶嶽栽尖議尖喇?低嬬音嬬契峭艶繁写覚低議窃。基宛頁辛參議。辛炉?宸戦公竃議盾畳岻祇音校孤昌旋鯛。低音誼音壓壓低議^撃競窃 ?嶄倡亭写覚匯倖涙隈更夛議絹廁児窃。珊頁斑箭徨栖御盆厘断匯俳杏?

	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; // error: DD::DD() cannot access
// Usable_lock::Usable_lock(): private member
(歌需ゞThe Design and Evolution of C++〃?11.4.3准)

Q: 葎焚担厘涙隈尫崙庁医議歌方?

A: 濱?凪糞低頁辛參議。遇拝宸嶽恂隈旺音佃?匆音俶勣焚担階竃械号議室派。

斑厘断栖心宸粁旗鷹?

	template<class Container>
	void draw_all(Container& c)
	{
		for_each(c.begin(),c.end(),mem_fun(&Shape::draw));
	}
泌惚c音憲栽constraints?竃孖阻窃侏危列?椎担危列繍窟伏壓屢輝鹸墫議for_each盾裂岻嶄。曳泌傍?歌方晒議窃侏瓜勣箔糞箭晒int侏?椎担厘断涙隈葎岻距喘Shape::draw()。遇厘断貫園咎匂嶄誼欺議危列佚連頁根冊遇綜繁痴雌議!!咀葎万才炎彈垂嶄鹸墫議for_each樟怪音賠。

葎阻壼泣俺彌欺宸倖危列?厘断辛參宸劔亟旗鷹?

	template<class Container>
	void draw_all(Container& c)
	{
		Shape* p = c.front(); // accept only containers of Shape*s
		for_each(c.begin(),c.end(),mem_fun(&Shape::draw));
	}
厘断廣吭欺?念中紗阻匯佩Shape *p議協吶?勝砿祥殻會云附遇冱?p頁涙喘議?。泌惚音辛繍c.front()験公Shape *p?椎担祥寄謹方孖旗園咎匂遇冱?厘断脅辛參誼欺匯訳根吶賠漣議竃危佚連。宸劔議室派壓侭嗤囂冱嶄脅載械需?遇拝斤噐侭嗤^音揖儖械議更夛 ?脅音誼音泌緩。[咎廣?吭峺斤噐販採囂冱?輝厘断蝕兵冥式自尫?椎担音誼音亟匯乂互業室派來議旗鷹。]
音狛宸劔恂音頁恷挫。泌惚勣厘栖亟糞縞旗鷹?厘匆俯氏宸劔亟?
	template<class Container>
	void draw_all(Container& c)
	{
		typedef typename Container::value_type T;
		Can_copy<T,Shape*>(); // accept containers of only Shape*s
		for_each(c.begin(),c.end(),mem_fun(&Shape::draw));
	}
宸祥聞旗鷹宥喘拝苧?垉慳縅岾氅匍漬睛次Ąě參敲荒旦湾?[咎廣?軸苧鳩僅冱typename Container頁draw_all()侭俊鞭議否匂窃侏?遇音頁綜繁痴雌仇協吶阻匯倖Shape *峺寞?匆音岑祇氏音氏壓朔中陳戦喘欺]。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議巷嗤写覚窃議峺寞?賜宀頁喘薩徭協吶議辛瓜廬侏葎Shape *議窃侏。廣吭?宸戦Can_copy()議糞孖厮将児云貧頁恷單晒議阻?匯佩旗鷹喘栖峺苧俶勣殊臥議constraints[咎廣?峺及1佩旗鷹?constraints葎T2]?才勣斤凪恂宸倖殊臥議窃侏[咎廣?勣恬殊臥議窃侏葎T1] ?匯佩旗鷹喘栖娼鳩双竃侭勣殊臥頁倦諾怎議constraints?constraints()痕方? [咎廣?及2佩岻侭參勣嗤2倖徨鞘旺音頁嶷鹸?遇頁嗤圻咀議。泌惚T1?T2譲頁喘薩徭協吶議窃?椎担T2 c = a; 殊霞嬬倦髪福更夛?b = a; 殊霞嬬倦申唄更夛] ?匯佩旗鷹喘栖戻工峇佩宸乂殊臥議字氏 [咎廣?峺及3佩。Can_copy頁匯倖庁医窃?constraints頁凪撹埀痕方?及2佩峪頁協吶?遇隆峇佩] 。
[咎廣?宸戦constraints糞孖議購囚頁卆正C++膿寄議窃侏狼由?蒙艶頁窃議謹蓑字崙。及2佩旗鷹嶄T2 c = a; b = a; 嬬校屎械宥狛園咎議訳周頁?T1糞孖阻T2議俊笥。醤悶遇冱?辛嬬頁參和4嶽秤趨?(1) T1?T2 揖窃侏 (2) 嶷墮operator = (3) 戻工阻 cast operator ?窃侏廬算塰麻憲?(4) 塗伏窃斤嵆験公児窃峺寞。傍欺宸戦?芝軟厘奚壓參念議匯鐙猟嫗嶄傍欺?C++議genericity糞恬!!template音屶隔constrained genericity?遇Eiffel夸貫囂隈雫艶屶隔constrained genericity?軸戻工窃貌噐template <typename T as Comparable> xxx 宸劔議囂隈!!凪嶄Comparable軸葎匯倖constraint?。奚嗤響宀峺竃厘宸劔傍頁危列議?範葎C++ template匆屶隔constrained genericity。孖壓宸何蛍咎猟公竃阻宥狛聞喘匯乂室派?繍OOP才GP議圭隈潤栽?貫遇壓C++嶄派虫糞孖constrained genericity議圭隈。斤噐握挫C++議響宀?宸嶽室派頁峙誼聾聾瞳龍議。音狛匆音勣咀葎湊峇广噐光嶽聾乢挑准議旗鷹室派遇疋払阻畠蕉凛高。嗤扮囂冱屶隔圭中議之髪辛參壓譜柴蚊中?遇掲旗鷹蚊中?厚單囘仇置温。総翌?宸嬬音嬬麻^C++議template屶隔constrained genericity ??厘隠藻吭需。屎泌?喘C宥狛匯乂室派匆辛參OOP?徽厘断音傍C囂冱屶隔OOP。]
萩寄社壅廣吭?孖壓厘断議協吶醤姥阻宸乂厘断俶勣議蒙來?

屡隼泌緩?厘断孤宅音孤巌壓C++囂冱云附嶄協吶窃貌Can_copy()賜宀厚單囘酒準議囂隈椿?The Design and Evolution of C++蛍裂阻緩恂隈揮栖議是佃。厮将嗤俯俯謹謹譜柴尖廷検竃邦中?峪葎阻斑根constraints議庁医窃叟噐廱亟?揖扮珊勣斑園咎匂壓constraints音瓜諾怎扮公竃否叟尖盾議竃危嶧連。曳圭傍?厘壓Can_copy嶄^聞喘痕方峺寞 ?議譜柴祥栖徭噐Alex Stepanov才Jeremy Siek。厘範葎厘議Can_copy()糞恬珊音欺辛參炎彈晒議殻業!!万俶勣厚謹糞樹議殊刮。総翌?C++聞喘宀氏壟囑俯謹音揖窃侏議constraints?朕念心栖珊短嗤陳嶽侘塀議揮constraints議庁医資誼儿宜謹方議屶隔。

厮嗤音富購噐constraints議^坪崔囂冱屶隔 ?圭宛瓜戻咏才糞恬。徽凪糞勣燕峰constraint功云音俶勣焚担呟窄儖械議叫廉?穎捷?輝厘断亟匯倖庁医扮?厘断啜嗤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*>();
	}
	// the classical "elements must derived from Mybase*" constraint:
	template<class T> class Container : Derived_from<T,Mybase> {
		// ...
	};
並糞貧Derived_from旺音殊臥写覚來?遇頁殊臥辛廬算來。音狛Derive_from械械頁匯倖厚挫議兆忖!!嗤扮公constraints軟倖挫兆忖匆頁周俶聾聾深楚議試隅。

Q: 厘断厮将嗤阻 "胆挫議析qsort()"?葎焚担珊勣喘sort()?

A: 斤噐兜僥宀遇冱?
	qsort(array,asize,sizeof(elem),elem_compare);
心貧肇嗤泣硬講。珊頁
	sort(vec.begin(),vec.end());
曳熟挫尖盾?頁杏。椎担?宸泣尖喇祥怎校斑低普qsort遇弖箔sort阻。斤噐析返栖傍?sort()勣曳qsort()酔議並糞匆氏斑低伉強音厮。遇拝sort頁刑侏議?辛參喘噐販採栽尖議否匂怏栽、圷殆窃侏才曳熟麻隈。箭泌?
	struct Record {
		string name;
		// ...
	};
	struct name_compare {	// compare Records using "name" as the key
		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 Standard C++ as a New Language〃匯猟。

総翌?葎採sort()勣曳qsort()酔?咀葎万厚挫仇旋喘阻C++議坪選囂隈囂吶。


Q: 焚担頁function object?

A: Function object頁匯倖斤嵆?音狛万議佩葎燕孖崧痕方。匯違遇冱?万頁喇匯倖嶷墮阻operator()議窃侭糞箭晒誼栖議斤嵆。

Function object議梱吶曳宥械吭吶貧議痕方厚鴻刑?咀葎万辛參壓謹肝距喘岻寂隠隔蝶嶽^彜蓑 ?!!宸才床蓑蕉何延楚嗤呟爆揖垢岻虫?音狛宸嶽^彜蓑 ?珊辛參瓜兜兵晒?珊辛參貫翌中栖殊霞?宸辛勣曳床蓑蕉何延楚膿阻。厘断栖心匯倖箭徨?

	class Sum {
		int val;
	public:
		Sum(int i) :val(i) { }
		operator int() const { return val; }		// extract value
		int operator()(int i) { return val+=i; }	// application
	};
	void f(vector v)
	{
		Sum s = 0;	// initial value 0
		s = for_each(v.begin(), v.end(), s);	// gather the sum of all elements
		cout << "the sum is " << s << "\n";
	
		// or even:
		cout << "the sum is " << for_each(v.begin(), v.end(), Sum(0)) << "\n";
	}
宸戦厘勣戻萩寄社廣吭?匯倖function object辛瓜働疏仇坪選晒(inlining)?咀葎斤噐園咎匂遇冱?短嗤網凵議峺寞栖詞巋篇油?侭參宸劔議單晒載否叟序佩。[咎廣?宸峺議頁繍operator()協吶葎坪選痕方?辛參揮栖丼楕議戻互。] 恬葎斤曳?園咎匂叱窄音辛嬬宥狛單晒繍^宥狛痕方峺寞距喘痕方 ?宸匯化帶侭雑議蝕?福渠?崛富朕念泌緩。

壓炎彈垂嶄function objects瓜鴻刑聞喘?宸公炎彈垂揮栖阻自寄議痩試來才辛制婢來。

[咎廣?C++頁匯倖鴬寡巉海議囂冱?function object議古廷祥頁貫functional programming嶄処栖議?遇C++云附議膿寄才燕孖薦議戟源匆聞宸嶽^鎮栖麼吶 ?撹葎辛嬬。匯違遇冱?壓聞喘function object議仇圭匆械辛參聞喘痕方峺寞?壓厘断珊音母呂function object議扮昨厘断匆械械頁聞喘峺寞議。徽協吶匯倖痕方峺寞議囂隈辛音頁湊酒汽苧阻?遇拝壓C++嶄峺寞壼厮嘘貧阻^危列岻坿 ?議具兆。厚採趨?宥狛峺寞距喘痕方奐紗阻寂俊蝕?。侭參?涙胎葎阻囂隈議單胆珊頁丼楕議戻互?脅哘乎戻開聞喘function objects。

和中厘断壅貫譜柴庁塀議叔業栖厚侮秘仇尖盾function objects?宸頁Visitor庁塀議灸侏哘喘。輝厘断勣斤蝶倖/蝶乂斤嵆仏紗蝶嶽荷恬?徽嗽音?繍宸嶽荷恬尫協棒?椎担祥辛參寡喘Visitor庁塀。壓Design Patterns匯慕嶄?恬宀委宸嶽庁塀糞恬葎?宥狛匯倖Visitor窃栖戻工宸嶽荷恬?壓念中Bjarne Stroustrup議旗鷹嶄?Sum祥頁匯倖Visitor議延悶??喘Visitor窃糞箭晒匯倖visitor斤嵆?輝隼?壓念中議旗鷹嶄斤哘議頁s??隼朔壓Iterator議亨旗狛殻嶄?葎耽匯倖斤嵆距喘visitor.visit()。宸戦visit()頁Visitor窃議匯倖撹埀痕方?恬喘屢輝噐Sum窃嶄椎倖^蒙歩議撹埀痕方 ?!!operator()?visit()匆頼畠辛參瓜協吶葎坪選痕方?參肇茅寂俊來?戻互來嬬。壓緩戻萩響宀廣吭?C++委嶷墮議荷恬憲匆心恬痕方?峪音狛頁醤嗤蒙歩痕方兆議痕方。侭參糞縞貧Design Patterns匯慕嶄Visitor庁塀議幣袈糞恬才宸戦function object議糞恬寄悶貧頁吉勺議。匯倖function object匆祥頁匯倖蒙歩議Visitor。]


Q: 厘哘乎奕劔侃尖坪贋亶息?

A: 載酒汽?峪勣亟^音息 ?議旗鷹祥頼並阻亜。?堡撮h膵蘒禝調翮覽輯κ?new、delete、峺寞塰麻?椎低?斑万^音息 ?脅佃。音砿低嗤謹担弌伉女風?埴葎繁?掲舞匆?危列壓侭佃窒。恷嶮低氏瓜徭失埆栖埆鹸墫議旗鷹影決議!!低繍誘附噐嚥坪贋亶息議鶏況岻嶄?斤bug断音宣音虹?岷崛表桁短嗤説叔?仇白音壅廬強。遇嬬斑低閲窒宸劔是廠議室派匆音鹸墫?低峪勣厥嶷咨根壓鳥朔議蛍塘字崙!!更夛才裂更?斑C++議膿寄議窃狼由栖廁低匯越岻薦祥OK阻。炎彈垂嶄議椎乂否匂祥頁載挫議糞箭。万断斑低音駅晒継寄楚議扮寂娼薦匆嬬煤防祀吭仇砿尖坪贋。厘断栖心心和中議幣箭旗鷹!!譜?匯和?泌惚短嗤阻string才vector?弊順繍氏奕劔?泌惚音喘万断?低嬬及匯肝祥亟竃坐涙坪贋危列議揖劔孔嬬旗鷹宅?
	#include<vector>
	#include<string>
	#include<iostream>
	#include<algorithm>
	using namespace std;
	int main()	// small program messing around with strings
	{
		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';
	}

萩廣吭宸戦短嗤?塋週陳擺羚楡躊翮襦C屍从蝪c屍仞猥要Ĺ撮c屍侑膤欛豌癸c屍佛訊撞調麸]渣藤r加屍儘胡襦H膵蘘荒?function object才炎彈麻隈[咎廣?峺炎彈垂嶄戻工議刑侏麻隈]?厘銭Iterator匆辛參音喘。音狛宸穎捷峪頁匯倖弌殻會?姫痔冑喘釘偽?

輝隼?宸乂圭隈匆旺掲涙亳辛似?遇拝傍軟栖否叟恂軟栖佃?勣狼由仇聞喘万断匆旺音悳頁載酒汽。音狛?涙胎泌採?万断議鴻刑癖喘來綜繁妾冏?遇拝宥狛卞肇寄楚議?塋縦擺羞崚?/瞥慧旗鷹?万断鳩糞奐膿阻旗鷹議辛響來才辛砿尖來。壼壓1981定?厘祥峺竃宥狛寄嫌業受富俶勣?塋充嘔垤楡躓超塹麒鎣殖j荒?C++^繍並秤恂斤 ?繍音壅頁匯周自凪継舞議取賞販暦。

泌惚低議哘喘糟囃短嗤嬬壓坪贋砿尖圭中廁低匯越岻薦議窃垂?椎担泌惚低珊?斑低議罷周蝕窟延誼屡酔楯嗽嬬煤防誼欺屎鳩潤惚?恷挫頁枠秀羨宸劔匯倖垂。

泌惚低涙隈斑坪贋蛍塘才瞥慧撹葎斤嵆議^徭隼佩葎 ??椎担崛富低辛參宥狛聞喘彿坿鞘凹栖勝楚閲窒坪贋亶息。宸戦頁匯倖幣箭?邪譜低俶勣貫痕方卦指匯倖斤嵆?宸倖斤嵆頁壓徭喇坪贋均貧蛍塘議?低辛嬬氏梨芝瞥慧椎倖斤嵆!!穎捷厘断涙隈宥狛殊臥峺寞栖鳩協凪峺?議斤嵆頁倦俶勣瓜瞥慧?厘断匆涙隈誼岑豊哘乎減夭瞥慧万。椎担?祥喘彿坿鞘凹杏。曳泌?炎彈垂嶄議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;	// who is responsible for deleting this S?
	};
	auto_ptr<S> g()
	{
		return auto_ptr<S>(new S);	// explicitly transfer responsibility for deleting this S
	}
	int main()
	{
		cout << "start main\n";
		S* p = f();
		cout << "after f() before g()\n";
	//	S* q = g();	// caught by compiler
		auto_ptr<S> q = g();
		cout << "exit main\n";
		// leaks *p
		// implicitly deletes *q
	}

宸戦峪頁坪贋彿坿砿尖議箭徨?崛噐凪万窃侏議彿坿砿尖?辛參泌隈土崙。

泌惚壓低議蝕窟桟廠嶄涙隈狼由仇聞喘宸嶽圭隈?曳圭傍?低聞喘阻及眉圭戻工議硬境旗鷹?賜宀垓硬^僭肖繁 ?歌嚥阻低議?朕蝕窟??椎担低壓蝕窟狛殻嶄辛認嵐勣芝廖聞喘坪贋契息殊霞殻會?賜宀孤巌聞喘征侍辺鹿匂?Garbage Collector?。


Q: 葎採俺彌欺呟械朔音嬬写偬峇佩朔中議旗鷹椿?

A: 宸倖諒籾?算鞘三傍匆祥頁?葎焚担C++音戻工宸劔匯倖圻囂?嬬聞低侃尖呟械狛朔卦指欺呟械砺竃侃写偬吏和峇佩?[咎廣?曳泌?匯倖酒汽議resume囂鞘?喘隈才厮嗤議return囂鞘窃貌?峪音狛駅倬慧壓exception handler議恷朔。]

狹?貫呟械侃尖旗鷹卦指欺呟械砺竃侃写偬峇佩朔中議旗鷹議?隈載挫[咎廣?孖佩呟械字崙議譜柴頁?輝呟械瓜砺竃才侃尖朔?貫侃尖旗鷹侭壓議椎倖catch翠吏和峇佩]?徽麼勣諒籾壓噐!!exception handler音辛嬬岑祇葎阻斑朔中議旗鷹屎械塰佩?俶勣恂謹富賠茅呟械議垢恬[咎廣?穎捷?輝嗤呟械窟伏?並秤祥嗤泣音湊斤匠阻?音頁宅?厚採趨辺憤醒妙徨喟垓頁周醍軍議並]?侭參?泌惚勣斑^写偬峇佩 ?嬬校屎械垢恬?亟throw旗鷹議繁才亟catch旗鷹議繁駅倬斤泳緩議旗鷹脅載母呂?遇宸祥揮栖阻鹸墫議屢札卆正購狼[咎廣?屡峺蝕窟繁埀岻寂議^屢札卆正 ??匆峺旗鷹寂議屢札卆正!!諸骼栽議旗鷹辛音頁挫旗鷹填 :O) ]?氏揮栖載謹醍軍議略擦諒籾。

壓厘譜柴C++議呟械侃尖字崙議扮昨?厘奚範寔仇深打狛宸倖諒籾?壓C++炎彈晒議狛殻嶄?宸倖諒籾匆瓜峋聾仇網胎狛。?歌需ゞThe Design and Evolution of C++〃嶄購噐呟械侃尖議嫗准?泌惚低?編編心壓砺竃呟械岻念嬬音嬬盾畳諒籾隼朔写偬吏和峇佩?低辛參枠距喘匯倖^殊臥!志鹸 ?痕方?隼朔?泌惚珊頁音嬬盾畳諒籾?壅委呟械砺竃。匯倖宸劔議箭徨頁new_handler。


Q: 葎採C++嶄短嗤C嶄realloc()議斤哘麗?

A: 泌惚低匯協?勣議三?低輝隼辛參聞喘realloc()。音狛?realloc() 峪才宥狛malloc()岻窃C痕方蛍塘誼欺議坪贋^栽恬噪酔 ??壓蛍塘議坪贋嶄音嬬嗤醤姥喘薩徭協吶更夛痕方議斤嵆。萩芝廖?嚥蝶乂爺寔議繁断議?嵆屢郡?realloc()駅勣扮頁氏申唄寄翠議坪贋欺仟蛍塘議銭偬腎寂嶄議。侭參?realloc短焚担挫議 ^_^

壓C++嶄?侃尖坪贋嶷蛍塘議熟挫一隈頁聞喘炎彈垂嶄議否匂?曳泌vector。[咎廣?宸乂否匂氏徭失砿尖俶勣議坪贋?壓駅勣扮氏^奐海樫雁 ?!!序佩嶷蛍塘。]


Q: 厘泌採聞喘呟械侃尖?

A: 歌需ゞThe C++ Programming Language〃14嫗8.3准?參式現村E。現村E麼勣懐峰泌採廱亟^exception-safe ?旗鷹?宸倖現村辛音頁亟公兜僥宀心議。匯倖購囚室派頁^彿坿蛍塘軸兜兵晒 ?!!宸嶽室派宥狛^窃議裂更痕方 ?公叟夛撹詞岱議^彿坿砿尖 ?揮栖阻^嵌會議倣高 ?。

Q: 厘泌採貫炎彈補秘嶄響函string?

A: 泌惚勣響參腎易潤崩議汽倖汽簡?辛參宸劔?
	#include<iostream>
	#include<string>
	using namespace std;
	int main()
	{
		cout << "Please enter a word:\n";
		string s;
		cin>>s;
	
		cout << "You entered " << s << '\n';
	}
萩廣吭?宸戦短嗤?塋週陳擺羚楡躊翮襭r加屍佻渣導澳膓璨苗椹甓姉{漬膤檝鳥些綰琇? [咎廣?貌窄Bjarne械従袷仇傚各宸泣!!咀葎宸頁string痛崛屁倖炎彈垂揮栖議嶷寄挫侃岻匯?鳩糞峙誼徭裟?遇壓析議C囂冱嶄?恷斑殻會埀宇垤議匆頁坪崔忖憲堪窃侏議髪窪參式喇緩哈軟議^荷恬忖憲堪侭俶勣岻鹸墫坪贋砿尖企仏 ?侭揮栖議醍軍。Bjarne匯協壓誼吭仇??^込?厘議出C++議弌baby嶮噐海寄阻?迫?頼胆阻? ? :O) ]

泌惚低俶勣匯肝響匯屁佩?辛參宸劔?

	#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?stream??歌需ゞThe C++ Programming Language〃及眉井議及眉嫗。泌惚?心C才C++議補秘補竃孔嬬聞喘岻醤悶曳熟?歌心厘議ゞLearning Standard C++ as a New Language〃匯猟。

Q: 葎採C++音戻工^finally ?潤更?

A: 咀葎C++戻工阻総匯嶽字崙?頼畠辛參函旗finally?遇拝宸嶽字崙叱窄悳勣曳finally垢恬誼厚挫?祥頁!!^蛍塘彿坿軸兜兵晒 ?。?需ゞThe C++ Programming Language〃14.4准?児云議?隈頁?喘匯倖蕉何斤嵆栖撃廾匯倖彿坿?宸劔匯栖蕉何斤嵆議裂更痕方祥辛參徭強瞥慧彿坿。宸劔?殻會埀祥音氏^梨芝瞥慧彿坿 ?阻。 [咎廣?咀葎C++議斤嵆^伏凋巓豚 ?字崙紋麿芝廖阻 :O) ] 和中頁匯倖箭徨?
	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");	// open fn for reading and writing
		// use file through f
	}
壓匯倖狼由嶄?耽匯劔彿坿脅俶勣匯倖^彿坿蕉凹 ?斤嵆?徽厘断音駅葎耽匯倖彿坿脅亟匯倖^finally ?囂鞘。壓糞恬議狼由嶄?彿坿議資函才瞥慧議肝方垓垓謹噐彿坿議嶽窃?侭參^彿坿蛍塘軸兜兵晒 ?字崙恢伏議旗鷹勣曳^finally ?字崙富。
[咎廣?Object Pascal?Java?C#吉囂冱脅嗤finally囂鞘翠?械喘噐窟伏呟械扮斤瓜蛍塘彿坿議彿坿議侃尖!!宸吭龍彭嗤謹富肝蛍塘彿坿祥嗤謹富finally囂鞘翠?富阻匯倖finally祥吭龍彭嗤匯乂彿坿蛍塘音頁^exception safe ?議??遇^彿坿蛍塘軸兜兵晒 ?字崙繍圻云慧壓finally翠嶄議旗鷹卞欺阻窃議裂更痕方嶄。厘断峪俶葎耽匯窃彿坿戻工匯倖撃廾窃軸辛。俶旗鷹楚暮謹暮富?茅掲低議狼由嶄耽匯窃彿坿脅峪瓜聞喘匯肝!!宸嶽秤趨和旗鷹楚頁屢吉議?倦夸喟垓頁念宀謹噐朔宀 :O) ]

総翌?萩心心ゞThe C++ Programming Language〃現村E嶄議彿坿砿尖箭徨。


Q: 椎倖auto_ptr頁焚担叫叫亜?葎焚担短嗤auto_array?

A: 填?auto_ptr頁匯倖載酒汽議彿坿撃廾窃?頁壓<memory>遊猟周嶄協吶議。万聞喘^彿坿蛍塘軸兜兵晒 ?室宝栖隠屬彿坿壓窟伏呟械扮匆嬬瓜芦畠瞥慧?^exception safety ??。匯倖auto_ptr撃廾阻匯倖峺寞?匆辛參瓜輝恬峺寞栖聞喘。輝凪伏凋巓豚欺阻勝遊?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++;		// use p just like a pointer
		q->m++;
		// ...
		delete q;
	}
泌惚壓旗鷹喘// ...炎廣議仇圭砺竃呟械?椎担p氏瓜屎械評茅!!宸倖孔斥哘乎芝壓auto_ptr議裂更痕方遊貧。音狛?q峺?議X窃侏斤嵆祥短嗤瓜瞥慧?咀葎音頁喘auto_ptr協吶議?。峋秤萩需ゞThe C++ Programming Language〃14.4.2准。

Auto_ptr頁匯倖煤楚雫議窃?短嗤哈秘哈喘柴方字崙。泌惚低委匯倖auto_ptr?曳泌?ap1?験公総匯倖auto_ptr?曳泌?ap2??椎担ap2繍隔嗤糞縞峺寞?遇ap1繍隔嗤巣峺寞。箭泌?

	#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";
	}
塰佩潤惚哘乎頁枠?塋紹燦歖穹胡襭h産鷁妬拝燦?擬返胡襭x溶騁睹??
	p 0x0 q 0x378d0
auto_ptr::get()卦指糞縞峺寞。

宸戦?囂吶貌窄頁^廬卞 ??遇掲^申唄 ??宸賜俯嗤泣綜繁妾冏。蒙艶勣廣吭議頁?音勣委auto_ptr恬葎炎彈否匂議歌方!!炎彈否匂勣箔宥械議申唄囂吶。箭泌?

	std::vector<auto_ptr<X> >v;	// error

匯倖auto_ptr峪嬬隔嗤峺?汽倖圷殆議峺寞?遇音頁方怏峺寞?

	void f(int n)
	{
		auto_ptr<X> p(new X[n]);	// error
		// ...
	}
貧峰旗鷹氏竃危?咀葎裂更痕方頁聞喘delete遇掲delete[]栖瞥慧峺寞議?侭參朔中議n-1倖X短嗤瓜瞥慧。

椎担?心栖厘断哘乎喘匯倖聞喘delete[]栖瞥慧峺寞議?出auto_array議窃貌叫叫栖慧方怏阻?填?音?音?短嗤焚担auto_array。尖喇頁?音俶勣嗤亜!!厘断頼畠辛參喘vector啄?

	void f(int n)
	{
		vector<X> v(n);
		// ...
	}
泌惚壓 // ... 何蛍窟伏阻呟械?v議裂更痕方氏瓜徭強距喘。

Q: C才C++欠鯉議坪贋蛍塘/瞥慧辛參詞喘宅?

A: 辛參!!貫低辛壓匯倖殻會嶄揖扮聞喘malloc()才new議吭吶貧遇冱。

音辛參!!貫低涙隈delete匯倖參malloc()蛍塘遇栖岻斤嵆議吭吶貧遇冱。低匆涙隈free()賜realloc()匯倖喇new蛍塘遇栖議斤嵆。

C++議new才delete塰麻憲鳩隠更夛才裂更屎械窟伏?徽C欠鯉議malloc()、calloc()、free()才realloc()辛音隠屬宸泣。遇拝?短嗤販採繁嬬?低毅隠?new/delete才malloc/free侭嫺陣議坪贋頁屢札^惹否 ?議。泌惚壓低議旗鷹嶄?曾嶽欠鯉詞喘遇短嗤公低夛撹醍軍?椎厘峪嬬傍?岷欺朕念葎峭?低頁掲械侑塰議 :O)

泌惚低咀葎房廷^胆挫議析realloc() ??俯謹繁脅房廷慢?遇涙隈護普屁倖硬析議C坪贋蛍塘字崙?握塁式鱗???椎担深打聞喘炎彈垂嶄議vector杏。箭泌?

	// read words from input into a vector of strings:
	vector<string> words;
	string s;
	while (cin>>s && s!=".") words.push_back(s);
Vector氏梓俶勣徭強奐海議。

厘議ゞLearning Standard C++ as a New Language〃匯猟嶄公竃阻凪万箭徨?辛參歌深。


Q: ?貫void *廬算?葎焚担駅倬聞喘算侏憲?

A: 壓C嶄?低辛參咨塀廬算?徽宸頁音芦畠議?箭泌?

	#include<stdio.h>
	int main()
	{
		char i = 0;
		char j = 0;
		char* p = &i;
		void* q = p;
		int* pp = q;	/* unsafe, legal C, not C++ */

		printf("%d %d\n",i,j);
		*pp = -1;	/* overwrite memory starting at &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珊嗤現揮議挫侃?
箭泌?
	typedef std::complex<double> cmplx;
	/* C style: */
	cmplx* p = (cmplx*)malloc(sizeof(int));	/* error: wrong size */
							/* forgot to test for p==0 */
	if (*p == 7) { /* ... */ }			/* oops: forgot to initialize *p */
	// C++ style:
	cmplx* q = new cmplx(1,2); // will throw bad_alloc if memory is exhausted
	if (*q == 7) { /* ... */ }

A: 泌採壓窃嶄協吶械楚?

Q: 泌惚低?誼欺匯倖辛喘噐械楚燕器塀嶄議械楚?箭泌方怏寄弌議協吶?椎担低嗤曾嶽僉夲?

	class X {
		static const int c1 = 7;
		enum { c2 = 19 };
		char v1[c1];
		char v2[c2];
		// ...
	};
匯凛李肇?c1議協吶貌窄厚紗岷舜阻輝?徽艶梨阻峪嗤static議屁侏賜旦訟侏楚嘉嬬泌緩兜兵晒。宸祥載嗤蕉尫來?箭泌?
	class Y {
		const int c3 = 7;		// error: not static
		static int c4 = 7;		// error: not const
		static const float c5 = 7;	// error not integral
	};
厘珊頁厚浪散螺^enum老隈 ??咀葎宸嶽協吶辛卞峅來挫?遇拝音氏哈嗾厘肇聞喘掲炎彈議^窃坪兜兵晒 ?制婢囂隈。

椎担?葎採勣嗤宸乂音圭宴議尫崙?咀葎窃宥械蕗苧壓遊猟周嶄?遇遊猟周吏吏瓜俯謹汽圷侭淫根。[侭參?窃辛嬬氏瓜嶷鹸蕗苧。]徽頁?葎阻閲窒全俊匂譜柴議鹸墫晒?C++勣箔耽倖斤嵆脅峪嬬瓜協吶匯肝。泌惚C++塋俯窃坪協吶勣恬葎斤嵆瓜贋壓坪贋嶄議糞悶?椎担宸?勣箔祥涙隈諾怎阻。購噐C++譜柴扮議匯乂孵嶬?歌需ゞThe Design and Evolution of C++〃。

泌惚宸倖械楚音俶勣瓜喘噐械楚燕器塀?椎担低議僉夲噫仇祥曳熟寄阻?

	class Z {
		static char* p;		// initialize in definition
		const int i;		// initialize in constructor
	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;	// definition
	int f()
	{
		const int* p1 = &AE::c6;	// error: c6 not an lvalue
		const int* p2 = &AE::c7;	// ok
		// ...
	}

Q: 葎採delete荷恬音委峺寞崔巣?

A: 狹?諒誼勇嗤祇尖議。厘断栖心?
	delete p;
	// ...
	delete p;
泌惚旗鷹嶄議//...何蛍短嗤壅肝公p蛍塘坪贋?椎担宸粁旗鷹祥斤揖匯頭坪贋瞥慧阻曾肝。宸頁倖冢嶷議危列?辛炉C++涙隈嗤丼仇怦峭低亟宸嶽旗鷹。音狛?厘断脅岑祇?瞥慧腎峺寞頁涙裡墾議?侭參泌惚壓耽匯倖delete p;朔中脅諸俊匯倖p = 0;?椎担曾肝瞥慧揖匯頭坪贋議危列祥音氏窟伏阻。勝砿泌緩?壓C++嶄短嗤販採囂隈辛參膿崙殻會埀壓瞥慧峺寞朔羨震繍乎峺寞拷巣。侭參?心栖閲窒係宸劔議危列議嶷販峪嬬畠鯛壓殻會埀主貧阻。賜俯?delete徭強委峺寞拷巣寔頁倖挫麼吭?

填?音音?宸倖麼吭音校^挫 ?。匯倖尖喇頁?瓜delete議峺寞隆駅頁恣峙。厘断栖心?

	delete p+1;
	delete f(x);
低斑delete委焚担徭強崔巣?匆俯宸劔議箭徨音械需?徽怎辛屬苧^delete徭強委峺寞拷巣 ?旺音隠孁。[咎廣?並糞貧?厘断寔屎?勣議頁?^販採峺?瓜瞥慧議坪贋曝囃議峺寞脅瓜徭強拷巣 ?!!徽辛炉茅阻Garbage Collector翌短焚担叫叫辛參恂欺宸泣。] 壅栖心倖酒汽箭徨?
	T* p = new T;
	T* q = p;
	delete p;
	delete q;	// ouch!
C++炎彈凪糞塋俯園咎匂糞恬葎^徭強委勧公delete議恣峙崔巣 ??厘匆錬李園咎匂皆斌宸劔恂?徽心栖皆斌断旺音浪散宸劔。匯倖尖喇祥頁貧峰箭徨!!及3佩囂鞘泌惚delete委p徭強崔巣阻嗽泌採椿?q嗽短嗤瓜徭強崔巣?及4佩孚劔竃危。

泌惚低状誼瞥慧坪贋扮委峺寞崔巣載嶷勣?椎担音形亟宸劔匯倖destroy痕方?

	template<class T> inline void destroy(T*& p) { delete p; p = 0; }

音形委delete揮栖議醍軍心恬^勝楚富喘new/delete?謹喘炎彈垂嶄議否匂 ?岻総匯訳尖喇杏 :O)

萩廣吭?委峺寞恬葎哈喘勧弓?參宴delete辛參委峺寞崔巣?氏揮栖駆翌議丼吩!!契峭嘔峙瓜勧弓公destroy() ?

	int* f();
	int* p;
	// ...
	destroy(f());	// error: trying to pass an rvalue by non-const reference
	destroy(p+1);	// error: trying to pass an rvalue by non-const reference

Q: 厘辛參亟"void main()"宅?

A: 宸劔議協吶
	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?宸倖int頁卦指公低議殻會議距喘宀議?宸頁嶽^減夭 ?議恂隈?^焚担脅音卦指 ?辛音寄挫填。泌惚低殻會議距喘宀音屶隔喘^卦指峙 ?栖住送?宸倖峙氏瓜徭強策待!!徽宸匆音嬬聞void main()撹葎栽隈議C++賜C旗鷹。軸聞低議園咎匂屶隔宸嶽協吶?恷挫匆音勣劍撹宸嶽楼降!!倦夸低辛嬬瓜凪麿C/C++範葎燃院涙岑填。
壓C++嶄?泌惚低腕醍軍?辛參音駅?塋週慚干?return囂鞘。園咎匂氏徭強卦指0。箭泌?
	#include<iostream>
	int main()
	{
		std::cout << "This program returns the integer value 0\n";
	}
醍軍宅?音醍軍?int main()曳void main()珊富阻匯倖忖銚椿 :O)総翌?珊勣萩低廣吭?涙胎頁ISO C++珊頁C99脅音塋俯低福待卦指窃侏協吶。宸匆祥頁傍?才C89式ARM C++[咎廣?峺Margaret Ellis才Bjarne Stroustrup噐1990定栽广議ゞThe Annotated C++ Reference Manual〃嶄宙峰議C++]音揖?int旺音頁髪福卦指峙。侭參?
	#include<iostream>
	main() { /* ... */ }
氏竃危?咀葎main()痕方髪富卦指窃侏。

Q: 葎採厘音嬬嶷墮^. ?、^:: ?才^sizeof ?吉荷恬憲?

A: 寄何蛍議荷恬憲頁辛參瓜嶷墮議?箭翌議峪嗤^. ?、^:: ?、^?: ?才^sizeof ?。短嗤焚担掲鋤峭operator?:嶷墮議尖喇?峪音狛短嗤駅勣遇厮。総翌?expr1?expr2:expr3議嶷墮痕方涙隈隠屬expr2才expr3嶄峪嗤匯倖瓜峇佩。

遇^sizeof ?涙隈瓜嶷墮頁咀葎音富坪何荷恬?曳泌峺寞紗隈?脅卆正噐万?箭泌?

	X a[10];
	X* p = &a[3];
	X* q = &a[3];
	p++;	// p points to a[4]
		// thus the integer value of p must be
		// sizeof(X) larger than the integer value of q
宸劔?sizeof(X)涙隈壓音離嘘児云囂冱号夸議念戻和燕器焚担仟議囂吶。

壓N::m嶄?N才m脅音頁燕器塀?万断峪頁園咎匂^範紛 ?議兆忖?^:: ?峇佩議糞縞荷恬頁園咎扮議兆忖囃盾裂?旺短嗤燕器塀議塰麻韮膚壓坪。賜俯嗤繁氏状誼嶷墮匯倖^x::y ??凪嶄x頁糞縞斤嵆?遇掲兆忖囃賜窃兆?頁匯倖挫麼吭?徽宸劔恂哈秘阻仟議囂隈[咎廣?嶷墮議云吭頁斑荷恬憲辛參嗤仟議囂吶?遇音頁厚個囂隈!!倦夸氏哈軟詞岱]?厘辛音範葎仟囂隈揮栖議鹸墫來氏公厘断焚担挫侃。

圻夸貧栖傍?^. ?塰麻憲頁辛參瓜嶷墮議?祥崧^-> ?匯劔。音狛?宸氏揮栖囂吶議詞巋!!厘断欺久頁?才^. ?朔中議斤嵆嬉住祇椿?珊頁^. ?朔中議叫叫侭糞縞峺?議糞悶嬉住祇椿?心心宸倖箭徨?万邪譜^. ?嶷墮頁辛參議??

	class Y {
	public:
		void f();
		// ...
	};
	class X {	// assume that you can overload .
		Y* p;
		Y& operator.() { return *p; }
		void f();
		// ...
	};
	void g(X& x)
	{
		x.f();	// X::f or Y::f or error?
	}

宸倖諒籾嗤挫叱嶽盾畳圭宛。壓C++炎彈晒岻扮?採嶽圭宛葎煮旺音苧?圈O現敘覯亮菑?The Design and Evolution of C++〃。


Q: 厘奕劔嘉嬬委屁方廬晒葎忖憲堪?

A: 恷酒汽議圭隈頁聞喘stringstream ?
	#include<iostream>
	#include<string>
	#include<sstream>
	using namespace std;
	string itos(int i)	// convert int to 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";
	}
輝隼?載徭隼仇?低辛參喘宸嶽圭隈栖委販採辛宥狛^<< ?補竃議窃侏廬晒葎string。?岑祇string送議聾准宅?歌需ゞThe C++ Programming Language〃?21.5.3准。

Q: ^int* p; ?才^int *p; ??欺久陳倖屎鳩?

A: 泌惚斑柴麻字栖響?曾宀頼畠吉揖?脅頁屎鳩議。厘断珊辛參蕗苧撹^int * p ?賜^int*p ?。園咎匂音氏尖氏低頁音頁壓陳戦謹慧阻叱倖腎鯉。

音狛泌惚斑繁栖響?曾宀議根吶祥嗤侭音揖阻。旗鷹議慕亟欠鯉頁載嶷勣議。C欠鯉議燕器塀才蕗苧塀械瓜心恬曳^necessary evil ?[咎廣?^駅勣岻具 ??吭峺葎阻器欺蝶嶽朕議遇音誼音原竃議旗勺。箭泌嗤繁範葎桟廠議篤撒頁将蔀窟婢揮栖議^necessary evil ?]厚壯議叫廉?遇C++夸載膿距窃侏。侭參?^int *p ?才^int* p ?岻寂旺涙斤危岻蛍?峪嗤欠鯉岻尸。

匯倖灸侏議C殻會埀氏亟^int *p ??遇拝尅尅嗤簡仇御盆低^宸燕幣`*p頁匯倖int ? ?!!油貧肇勇嗤祇尖議。宸戦?*才p鰯壓阻匯軟!!宸祥頁C議欠鯉。宸嶽欠鯉膿距議頁囂隈。

遇匯倖灸侏議C++殻會埀氏亟^int* p ??旺御盆低^p頁匯倖峺?int議峺寞?p議窃侏頁int* ?。宸嶽欠鯉膿距議頁窃侏。輝隼?厘浪散宸嶽欠鯉 :O) 遇拝?厘範葎?窃侏頁掲械嶷勣議古廷?厘断哘乎廣嶷窃侏。万議嶷勣來某坐音冉噐C++囂冱嶄議凪万^熟葎互雫議何蛍 ?。[咎廣?幗泌RTTI?光嶽cast?template字崙吉?辛各葎^熟互雫議何蛍 ?阻杏?徽万断凪糞匆頁窃侏古廷議制婢才塰喘。厘奚亟狛曾鐙霧欺C++才OOP議猟嫗窟燕壓云侵貧?猟嶄脅膿距阻尖盾^窃侏 ?岻嶷勣來。厘珊奚咎狛Object Unencapsulated ?宸云慕喇恬宀枠念侭广壓利貧鴻葎送勧議C++?? A Critique俐匡遇栖?嶄讐窃侏議嫗准?宸云慕議恬宀封崛各Object Oriented Programming哘乎屎兆葎Type Oriented Programming!!^中?窃侏園殻 ??宸嗤泣獣覧狛屎阻?徽窃侏鳩頁園殻囂冱岻宰伉何蛍。]

輝蕗苧汽倖延楚扮?int *才int*議餓艶旺音頁蒙艶融竃?徽輝厘断勣匯肝蕗苧謹倖延楚扮?叟詞巋岻侃祥畠羽其竃栖阻?

	int* p, p1;	// probable error: p1 is not an int*
宸戦?p1議窃侏欺久頁int珊頁int *椿?委*慧誼宣p除匯泣匆揖劔音嬬確賠諒籾?
	int *p, p1;	// probable error?
心栖葎阻隠孁軟需?峪挫匯肝蕗苧匯倖延楚阻!!蒙艶頁輝蕗苧育昧彭兜兵晒岻扮。[咎廣?云FAQ嶄群圻猟葎declare/declaration議譲咎葎蕗苧?define/definition譲咎葎協吶。宥械範葎?曾宀梱吶岻児云餓艶頁?^蕗苧 ?峪頁葎園咎匂戻工佚連?斑園咎匂壓憲催燕嶄葎瓜蕗苧議憲催?曳泌窃侏兆?延楚兆?痕方兆吉?隠藻了崔?遇音喘峺苧乎憲催侭斤哘議醤悶囂吶!!軸?短嗤販採坪贋腎寂議蛍塘賜宀糞縞屈序崙旗鷹議伏撹。遇^協吶 ?夸倬峺苧囂吶!!泌惚委^蕗苧 ?曳恬壓看灸嶄葎匯倖仟簡隠藻訳朕?椎担^協吶 ?祥挫曳壓訳朕嶄斤宸倖簡議吭房、喘隈公竃峋聾盾瞥。輝厘断傍匯倖C++囂鞘頁^協吶 ??椎担園咎匂駅協氏葎乎囂鞘恢伏斤哘議字匂峺綜賜宀蛍塘坪贋?遇瓜各葎^蕗苧 ?議囂鞘夸音氏瓜園咎竃販採糞縞旗鷹。貫宸倖叔業遇冱?圻猟嶄嗤乂仇圭埋恬宀亟議頁^斤嵆、窃、窃侏議蕗苧?declaration? ??徽賜俯個咎葎^協吶 ?熟憲栽厘断議尖盾。音狛云咎猟珊頁寡喘嶢噐圻猟議咎隈?旺音梓孚厘議尖盾遇紗參厚個。蒙緩傍苧。総翌?咎猟嶄群膚式厘倖繁斤圻猟議尖盾、温割岻何蛍譲參咎廣侘塀公竃?工響宀歌深。]繁断匯違音湊辛嬬亟竃崧宸劔議旗鷹?
	int* p = &i;
	int p1 = p;	// error: int initialized by int*
泌惚寔議嗤繁宸劔亟?園咎匂匆音氏揖吭!!万氏烏危議。

耽輝器欺蝶嶽朕議嗤曾訳參貧余抄?祥氏嗤乂繁瓜吾冊与?耽輝匯乂僉夲頁竃噐倖繁浪挫?尸胎祥氏涙俚涙峭。釈隔匯肝峪蕗苧匯倖峺寞旺壓蕗苧扮乏宴兜兵晒?是氾厘断厮消議詞巋岻坿祥氏昧欠陛肇。泌惚低?阻盾嗤購C議蕗苧囂隈議厚謹網胎?歌需ゞThe Design and Evolution of C++〃 。


Q: 採嶽旗鷹下蕉欠鯉葎煮?

A: 填?宸頁倖繁瞳龍諒籾阻。繁断械械載嶷篇旗鷹下蕉岻欠鯉?徽賜俯欠鯉議匯崑來勣曳僉夲採嶽欠鯉厚嶷勣。泌惚掲勣厘葎厘議倖繁陶挫秀羨^貸辞屬苧 ??才艶繁匯劔?厘氏遊寄議 :O)

厘倖繁浪散聞喘^K&R ?欠鯉?泌惚麻貧椎乂C囂冱嶄音贋壓議更夛岻聞喘降箭?椎担繁断嗤扮匆各岻葎^Stroustrup ?欠鯉。箭泌?

	class C : public B {
	public:
		// ...
	};
	void f(int* p, int max)
	{
		if (p) {
			// ...
		}
	
		for (int i = 0; i<max; ++i) {
			// ...
		}
	}
宸嶽欠鯉曳熟准福^換岷腎寂 ?!!厘浪散斑勝楚謹議坪否辛參?塋菖斷仔蘇? :O) 遇痕方協吶蝕兵議雑凄催岻侭參泌緩慧崔?頁咀葎宸劔匯栖祥才窃協吶曝蛍蝕栖?厘祥辛參匯凛心竃?玳?宸頁痕方?

屎鳩議抹序掲械嶷勣。

匯乂譜柴諒籾?曳泌聞喘渇嵆窃栖燕幣嶷勣議順中、聞喘庁医栖燕幣痩試遇辛制婢議窃侏芦畠渇嵆、屎鳩聞喘^呟械 ?栖燕幣危列?垓垓勣曳旗鷹欠鯉嶷勣。

[咎廣?ゞThe Practice of Programming〃嶄嗤匯嫗斤^旗鷹欠鯉 ?諒籾恬阻峋聾議懐峰。]


Q: 厘乎委const亟壓窃侏念中珊頁朔中?

A: 厘頁浪散亟壓念中議。音狛宸峪頁倖繁笥龍議諒籾。^const T ?才^T const ?譲頁塋俯議?遇拝万断頁吉勺議。箭泌?
	const int a = 1;	// ok
	int const b = 2;	// also ok
厘??聞喘及匯嶽亟隈厚栽窄囂冱楼降?曳熟音否叟斑繁痴雌 :O)

葎焚担氏宸劔?輝厘窟苧^const ??恷壼頁瓜凋兆葎^readonly ?拝嗤匯倖出^writeonly ?議斤哘麗?扮?厘斑万壓念中才朔中脅佩?咀葎宸音氏揮栖屈吶來。輝扮議C/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;	// constant pointer to int variable
	int const* p2 = q;	// pointer to constant int
	const int* p3 = q;	// pointer to constant int

Q: 崎嗤焚担音挫宅?

A: 崎音恆儉C++議恬喘囃才窃侏号夸?宸氏揮栖俯謹醍軍。咀緩?C++戻工阻嬬才囂冱凪万何蛍^栽恬噪酔 ?議紋旗字崙?曳泌坪選痕方、庁医、兆忖腎寂字崙。斑厘断栖心宸劔議旗鷹?
	#include "someheader.h"
struct S {
int alpha;
int beta;
};

泌惚嗤繁(音苧崘仇)亟阻匯倖出^alpha ?賜宀^beta ?議崎?椎担宸粁旗鷹涙隈宥狛園咎?封崛辛嬬厚壯!!園咎竃匯乂低隆奚圓創議潤惚。曳圭傍?泌惚^someheader.h ?淫根阻泌和協吶?
	#define alpha 'a'
	#define beta b[2]
椎担念中議旗鷹祥頼畠嘘宣云吭阻。
委崎?遇拝峪嗤崎?議兆各畠何喘寄亟忖銚燕幣鳩糞嗤廁噐産盾諒籾?徽崎頁短嗤囂冱雫隠擦字崙議。箭泌?壓參貧箭徨嶄alpha才beta壓S議恬喘囃嶄?頁S議撹埀延楚?徽宸斤噐崎坐涙唹峒。崎議婢蝕頁壓園咎念序佩議?婢蝕殻會峪頁委坿猟周心恬忖憲送遇厮。宸匆頁C/C++殻會譜柴桟廠議之髪岻侃?柴麻字才窮辻凛嶄議坿猟周議梱吶頁音揖議。

音侑議頁?低涙隈鳩隠凪麿殻會埀音係低侭範葎議^嘲汗議 ?危列。曳圭傍?除栖嗤繁御盆厘?麿断囑欺匯倖根^goto ?囂鞘議崎。厘需欺狛宸劔議旗鷹?匆油欺狛宸劔議胎泣!!嗤扮崎嶄議^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);	// fine
		square(i++);	// ouch: means (i++*i++)
		square(d+1);	// ouch: means (d+1*d+1); that is, (d+d+1)
		// ...
	}
^d+1 ?議諒籾辛參宥狛公崎協吶紗凄催盾畳?
	#define square(x) ((x)*(x))	/* better */
徽頁?^i++ ?瓜峇佩曾肝議諒籾挽隼短嗤盾畳。

厘岑祇嗤乂?凪万囂冱嶄?瓜各葎^崎 ?議叫廉旺音嵆C/C++圓侃尖匂侭侃尖議^崎 ?椎劔髪尣謹謹、醍軍嶷嶷?徽厘旺音?個序C++議崎?遇頁秀咏低屎鳩聞喘C++囂冱嶄議凪麿字崙?曳泌坪選痕方、庁医、更夛痕方、裂更痕方、呟械侃尖吉。


[咎廣?參貧頁Bjarne Stroustrup議C++ Style and Technique FAQ議畠猟鍬咎。Bjarne頁気拓繁?麿亟議哂猟猟嫗辛音挫響?室宝猟嫗喩封。云咎猟賜俯危列陶督岻侃音富?散哭鴻寄響宀峺屎。厘議email頁 zmelody@sohu.com 。]

AltStyle によって変換されたページ (->オリジナル) /