锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鏁版嵁瀵歸綈錛氭槸鎸囨暟鎹墍鍦ㄧ殑鍐呭瓨鍦板潃蹇呴』鏄鏁版嵁闀垮害鐨勬暣鏁板嶃傚鐞嗗櫒鍙互鐩存帴璁塊棶瀵歸綈鐨勬暟鎹紝鑰岃闂湭瀵歸綈鐨勬暟鎹細鍦ㄥ唴閮ㄨ繘琛屼竴緋誨垪鐨勮皟鏁達紝铏界劧鍙互姝e父澶勭悊錛屼絾鏄細闄嶄綆榪愯閫熷害銆備緥濡備竴涓鐞嗗櫒鎬葷嚎瀹藉害涓?4浣嶏紝閭d箞鍦板潃蹇呴』涓?鐨勫嶆暟錛屼篃灝辨槸涓嬈″彇鍑?涓瓧鑺傘傚鏋滄垜浠彲浠ヤ繚璇佹墍鏈塪ouble鍦板潃閮戒負8鐨勫嶆暟錛岄偅涔堝彲浠ョ敤涓涓瓨鍌ㄥ櫒鎿嶄綔鏉ヨ鎴栬呭啓double浜嗭紝鍚﹀垯鎴戜滑鍙兘闇瑕佹墽琛屼袱嬈″瓨鍌ㄥ櫒璁塊棶錛屽洜涓哄璞″彲鑳戒綅浜庝袱涓?瀛楄妭瀛樺偍鍣ㄥ潡涓?/font>
瀵逛簬緇撴瀯浣撲篃鏄竴鏍風殑渚嬪 struct s2{int i;int j;char c;}; 濡傛灉鎴戜滑鎶婅繖涓粨鏋勬墦鍖呮垚9涓瓧鑺傦紝鍙淇濊瘉璧峰鍦板潃婊¤凍4鐨勫榻愯姹傛垜浠氨鍙互淇濊瘉i j鐨勫榻愶紝涓嶈繃濡傛灉鎴戜滑澹版槑浜嗕竴涓暟緇勶紝閭d箞鍏冪礌鍦板潃鎴愪負 xd,xd+9,xd+18,xd+27 涓嶆弧瓚沖榻愪簡銆傚洜姝ゆ垜浠憿瑕佸垎閰?2涓瓧鑺傜粰榪欎釜緇撴瀯浣?/font>
鏇磋繘涓姝?錛?/font>
鏈榻愮殑鏁版嵁浼氫互涓嶅悓鏂瑰紡緇檆pu甯︽潵楹葷儲~
1.濡傛灉涓涓彉閲忚鍒掑垎鍒頒袱涓紦瀛樿錛岄偅涔堟垜浠渶瑕佽闂袱涓紦瀛樿鎵嶅彲浠ャ?/font>
2.涓浜泂imd鎸囦護鎬繪槸瑕佹眰瀵歸綈鐨勬寚浠わ紝瀵逛簬鏈榻愮殑鎸囦護錛屾暟鎹榻愪篃浼氬獎鍝嶈繖浜涙寚浠ょ殑浣跨敤銆?/font>
Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage ditches so that Bessie's clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch.
Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network. Note however, that there can be more than one ditch between two intersections.
Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle.
Line 1:
Two space-separated integers, N (0 <= N <= 200) and M (2 <= M <= 200). N is the number of ditches that Farmer John has dug. M is the number of intersections points for those ditches. Intersection 1 is the pond. Intersection point M is the stream.
Line 2..N+1:
Each of N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch.
5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
One line with a single integer, the maximum rate at which water may emptied from the pond.
50
鏈鍩烘湰鐨勭綉緇滄祦
1: #include<iostream> 2: #include<fstream>3: #include<string>
4: #include<vector> 5: #include<map> 6: #include<algorithm> 7: #include<sstream> 8: #include <cstring> 9: #include <queue>10: using namespace std;
11: const int MAXN = 220;
12: const int infi = 0x7FFFFFFF;
13: int capacity[MAXN][MAXN], prenode[MAXN], flow[MAXN];
14: queue<int> mq;
15: 16: int start, end, N;
17: void init(){
18: freopen("ditch.in","r",stdin);
19: //freopen("e:\\usaco\\ditch.in","r",stdin);
20: start = 1; 21: scanf("%d %d",&N,&end); int c, s, t;
22: memset(capacity,0,sizeof(capacity));
23: for(int i=0;i<N;i++)
24: {25: scanf("%d %d %d",&c,&s,&t);
26: capacity[c][s] += t; //涓や釜鑺傜偣闂翠笉鍙湁涓鏉¤礬
27: } 28: }29: int bfs(){//瀵繪壘澧炲箍璺緞
30: while(!mq.empty()) mq.pop();
31: mq.push(start); //婧愯妭鐐瑰叆闃?/span>
32: //memset(flow,0,sizeof(flow));
33: memset(prenode,-1,sizeof(prenode)); //閲嶇疆鍓嶅悜鑺傜偣
34: prenode[start] = 0; flow[start]=infi; //婧愯妭鐐規祦閲忔棤闄愬ぇ
35: while(!mq.empty()){
36: int cur = mq.front();
37: mq.pop();38: if(cur == end) break; //鍒拌揪姹囩偣緇撴潫璺緞
39: for(int i=1;i<=end;i++){
40: if(prenode[i]==-1 && capacity[cur][i]) //璁塊棶褰撳墠鑺傜偣鎵鏈夋湭璁塊棶鐨勭浉閭昏妭鐐癸紝鏇存柊flow
41: { 42: prenode[i] = cur; 43: flow[i] = (flow[cur]<capacity[cur][i]?flow[cur]:capacity[cur][i]); 44: mq.push(i); 45: } 46: } 47: }48: if(prenode[end]==-1) //濡傛灉鏈壘鍒板騫胯礬寰勮繑鍥?1
49: return -1;
50: return flow[end];
51: }52: int Edmonds_Karp(){
53: int total = 0, pathcapacity;//pathcapacity 璺緞澧炲姞閲?/span>
54: while((pathcapacity = bfs()) != -1){//鍙互鎵懼埌澧炲箍璺緞鏃跺欒繘琛屽驚鐜?/span>
55: int cur = end; //浠庢眹鐐瑰紑濮嬪鍔犻嗗悜鑺傜偣
56: while( cur != start ){
57: int t = prenode[cur] ;
58: capacity[t][cur] -= pathcapacity; 59: capacity[cur][t] += pathcapacity; 60: cur = t; 61: }62: total += pathcapacity;//max_flow
63: }64: return total;
65: }66: void output(){
67: freopen("ditch.out","w",stdout);
68: //freopen("c:\\usaco\\ditch.out","w",stdout);
69: cout<<Edmonds_Karp()<<endl; 70: } 71: int main()
72: { 73: init(); 74: output();75: return 0;
76: }鏍囩▼錛氫嬌鐢ㄨ椽蹇冩硶錛屽鎵句竴鏉″騫胯礬寰勭殑鏃跺欎笉鏂鎵綾ap鏈澶х殑錛屾湭琚闂殑鑺傜偣mloc錛涚劧鍚庢洿鏂拌窡mloc鐩擱偦鐨勮妭鐐筬low浠?/font>
鍙妏renode淇℃伅.鏈鍚庡綋榪愯鍒癳nd鏃跺欙紝鏇存柊璺緞鑺傜偣capacity錛屽悓鏃跺鍔爉ax_flow.閲嶅涓婅堪榪囩▼鐩村埌鎵句笉鍒板騫胯礬寰?/font>
1: #include <stdio.h>2: #include <string.h>
3: 4: #define MAXI 200
5: 6: /* total drain amount between intersection points */
7: int drain[MAXI][MAXI];
8: int nint; /* number of intersection points */
9: 10: int cap[MAXI]; /* amount of flow that can get to each node */
11: int vis[MAXI]; /* has this node been visited by Dijkstra's yet? */
12: int src[MAXI]; /* the previous node on the path from the source to here */
13: 14: int augment(void)
15: { /* run a Dijkstra's varient to find maximum augmenting path */
16: int lv;
17: int mloc, max;
18: int t;
19: 20: memset(cap, 0, sizeof(cap));
21: memset(vis, 0, sizeof(vis));
22: 23: cap[0] = 2000000000;24: while (1)
25: {26: /* find maximum unvisited node */
27: max = 0; 28: mloc = -1;29: for (lv = 0; lv < nint; lv++)
30: if (!vis[lv] && cap[lv] > max)
31: { 32: max = cap[lv]; 33: mloc = lv; 34: }35: if (mloc == -1) return 0;
36: if (mloc == nint-1) break; /* max is the goal, we're done */
37: 38: vis[mloc] = -1; /* mark as visited */
39: 40: /* update neighbors, if going through this node improves the
41: capacity */
42: for (lv = 0; lv < nint; lv++)
43: if (drain[mloc][lv] > cap[lv] && max > cap[lv])
44: { 45: cap[lv] = drain[mloc][lv];46: if (cap[lv] > max) cap[lv] = max;
47: src[lv] = mloc; 48: } 49: } 50: max = cap[nint-1]; 51: 52: /* augment path, starting at end */
53: for (lv = nint-1; lv > 0; lv = src[lv])
54: { 55: t = src[lv]; 56: drain[t][lv] -= max; 57: drain[lv][t] += max; 58: }59: return max;
60: } 61: 62: int main(int argc, char **argv)
63: { 64: FILE *fout, *fin;65: int lv;
66: int num;
67: int p1, p2, c;
68: 69: if ((fin = fopen("ditch.in", "r")) == NULL)
70: {71: perror ("fopen fin");
72: exit(1); 73: }74: if ((fout = fopen("ditch.out", "w")) == NULL)
75: {76: perror ("fopen fout");
77: exit(1); 78: } 79: 80: fscanf (fin, "%d %d", &num, &nint);
81: while (num--)
82: {83: fscanf (fin, "%d %d %d", &p1, &p2, &c);
84: p1--; 85: p2--;86: drain[p1][p2] += c; /* note += handles two ditches between same points */
87: } 88: 89: /* max flow algorithm: augment while you can */
90: c = 0;91: while ((p1 = augment()))
92: c += p1;93: fprintf (fout, "%d\n", c);
94: return 0;
95: }
鍚嶅瓧錛?On the cusp of the object model
7.1 Template
Template鐢ㄧ殑寰堝皯錛岃繖鑺備腑鐨勬湁浜涗笢瑗挎瘮杈冩櫐娑╋紝鎸戜竴浜涜兘鐞嗚В鐨勮涓嬪惂銆傚墿涓嬬殑絳夌敤鐨勫浜嗗啀鍥炲ご鏉ョ湅銆?/font>
Template鐨勫叿鐜拌涓?template instantiation
Template <calss T>class Point{
public: enum Status{unallocated,normalized};Point(T x=0.0,T y=0.0);
~Point() ; void * operator new(size_t);private:static Point<T> *freelist
static int chunksize; T _x,_y;
};
緙栬瘧鍣ㄧ湅鍒拌繖鏍風殑澹版槑錛屼細鏈変粈涔堝姩浣滐紵錛?/font>
娌℃湁銆俿tatic data 涓嶅彲鐢?enum 涓嶅彲鐢?錛宔num铏界劧綾誨瀷鍥哄畾錛屼絾浠栧彧鑳藉拰template point class 鐨勬煇涓疄浣撴潵瀛樺彇鎴栨搷浣溿傛垜浠彲浠?point<float>::Status s;
浣嗘槸涓嶈兘 point::status s; 鍥犳鎴戜滑鍙兘鎯蟲妸enum鎶界鍒頒竴涓潪妯℃澘綾諱互閬垮厤澶氶噸鎷瘋礉銆傚悓鏍烽亾鐞嗭紝freelist 鍜宑hunksize瀵逛簬紼嬪簭鑰岃█涔熶笉鍙敤銆傚繀欏繪槑紜寚瀹歱oint<float>::freelist.涔熷氨鏄闈欐佹暟鎹垚鍛樻槸鍜岀壒瀹氱被鍨嬬殑綾葷粦瀹氱殑鑰屼笉鏄硾鍨嬬殑妯℃澘綾匯備絾鏄鏋滃畾涔変竴涓寚閽堜笉涓瀹氫細鍏風幇鍑虹浉搴旂殑綾伙紝鍥犱負涓涓寚閽堬紝騫朵笉涓瀹氭寚鍚戜竴涓猚lass object銆傜紪璇戝櫒涓嶉渶瑕佺煡閬撹class 鐩稿簲鐨勪換浣昺ember 鎴栬呮暟鎹垨鑰?/font>
鍐呭瓨甯冨眬錛屾墍浠ユ病鏈夊繀瑕佸叿鐜般備絾鏄鏋滄槸瀹氫箟騫跺垵濮嬪寲涓涓紩鐢ㄥ氨鐪熺殑浼氬叿鐜板嚭涓涓疄浣擄紝鍥犱負涓嶅瓨鍦ㄧ┖寮曠敤銆?/font>
鎴愬憳鍑芥暟騫朵笉搴旇琚疄浣撳寲錛屽彧鏈夊綋浠栬璋冪敤鐨勬椂鍊欐墠闇瑕佽鍏風幇鍑烘潵銆?/font>
template<class T>
class mumble{
public: Muble(T t=1024):tt(t){ if(tt!=t)throw ex; }
private: T tt;
};
涓婇潰鐨勬ā鏉夸腑鍑虹幇閿欒鏈夛紝t=1024 涓嶄竴瀹氭垚鍔燂紝!= 涓嶄竴瀹氬畾涔?/font>
榪欎袱涓敊璇彧鏈夊埌鍏風幇鎿嶄綔緇撳悎鍏蜂綋綾誨瀷鎵嶈兘紜畾鍑烘潵
緙栬瘧鍣ㄩ潰瀵逛竴涓猼emplate澹版槑錛屽湪浠栬涓緇勫疄闄呭弬鏁板叿鐜頒箣鍓嶏紝鍙兘瀹炶浠ユ湁闄愬湴閿欒媯鏌ワ紝鍙湁鐗瑰畾瀹炰綋瀹氫箟涔嬪悗錛屾墠浼氬彂鐜頒竴浜涗笌璇硶鏃犲叧鐨勪絾鏄崄鍒嗘槑鏄劇殑閿欒錛岃繖鏄妧鏈笂鐨勪竴澶ч棶棰樸?/font>
Template 鐨勫悕縐板喅璁柟寮?/font>
.h鏂囦歡瀹氫箟
void out(int x){
cout<<"out_by_class_define_scrope"<<endl;
}
template <class type>
class A{
public:
void test1(){
out(m1);
}
void test2(){
out(m2);
}
private:
int m1;
type m2;
};.cpp鏂囦歡瀹氫箟
void out(double x){
cout<<"out_by_class_instantiation_scrope"<<endl;
}int main(錛?br>{
A<double> a;
a.test1();
a.test2();}
鎸夌収涔︿腑鐨勮娉曪紝濡傛灉涓涓嚱鏁幫紝鍙傛暟綾誨瀷鍜宼ype鏃犲叧鐨勮瘽錛屽簲璇ュ彇浠栫殑scope of template declaration涓畾涔夌殑鍑芥暟錛岃屽弽涔嬪彇鍦ㄤ粬鐨刬nstantiation涓殑閭d釜銆備簨瀹炰笂鍦ㄦ祴璇曚腑鍙戠幇
MSVC 涓?錛屽嚱鏁板畾涔夌殑鍐寵鏄緷鐓х被鍨嬬殑錛屽鏋滄湁鍚堥傜殑鍑芥暟姣斿type鏄痙ouble錛屾鏃跺鏋滃畾涔夊鎴栬呭叿鐜板鏈塪ouble鍨嬬殑鍑芥暟瀹氫箟錛岄偅涔堝嚱鏁板氨浼氬喅璁負閭d竴涓畾涔夌殑~~~
MEMber function鐨勫叿鐜拌涓猴細
緙栬瘧鍣ㄥ浣曠‘淇濆彧鏈変竴涓獀table浜х敓錛?涓縐嶆柟娉曟槸 姣忎竴涓獀irtual func鍦板潃閮芥斁鍦╲table涓紝濡傛灉鍙栧緱鍑芥暟鍦板潃錛屽垯琛ㄧずvirtual func 鐨勫畾涔夊繀鐒跺嚭鐜板湪紼嬪簭鐨勬煇涓湴鐐癸紝鍚﹀垯紼嬪簭鏃犳硶榪炴帴鎴愬姛銆傛澶栬鍑芥暟鍙兘鏈変竴涓疄浣擄紝鍚﹀垯涔熸槸榪炴帴涓嶆垚鍔熴傞偅涔堬紝灝辨妸vtable鏀懼湪瀹氫箟浜嗚class鐨勭涓涓猲on-inline錛宯onpure virtual function鐨勬枃浠朵腑鍚с傘傦紙not so clear錛?/font>
鍦ㄥ疄鐜板眰闈笂錛宼emplate 浼間箮鎷掔粷鍏ㄩ潰鑷姩鍖栵紝浠ユ墜鍔ㄦ柟寮忓湪涓埆鐨刼bject module涓畬鎴愰鍏堢殑鍏風幇宸ヤ綔鏄竴縐嶆湁鏁堢巼鐨勬柟娉曘?/font>
7.2寮傚父澶勭悊
涓轟簡緇存寔鎵ц閫熷害錛岀紪璇戝櫒鍙互鍦ㄧ紪璇戞椂鏈熷緩绔嬭搗鐢ㄤ簬鏀寔鐨勬暟鎹粨鏋?/font>
涓轟簡緇存寔紼嬪簭澶у皬錛岀紪璇戝櫒鍙互鍦ㄦ墽琛屾湡寤虹珛鏁版嵁緇撴瀯
c++ eH 涓昏鐢變笁涓儴鍒嗘瀯鎴愶細
throw璇彞
catch璇彞
try璇彞錛岃繖浜涜鍙ュ彲鑳借Е鍙慶atch瀛愬彞璧蜂綔鐢?/font>
涓涓猠xception 琚姏鍑烘椂鍊欙紝鎺у埗鏉冧細浠庡嚱鏁拌皟鐢ㄩ噴鏀懼嚭鏉ワ紝騫跺鎵句竴涓惢鍚堢殑catch錛屽鏋滄病鏈夐偅涔堥粯璁ょ殑澶勭悊渚嬬▼terminate()浼氳璋冪敤錛屾帶鍒舵潈鏀懼純鍚庯紝鍫嗘爤涓殑姣忎竴涓嚱鏁拌皟鐢ㄤ篃琚帹紱匯傛瘡涓涓嚱鏁拌鎺ㄧ鍫嗘爤鐨勬椂鍊欙紝鍑芥暟鐨刲ocal class object 鐨刣tor涔熶細琚皟鐢ㄣ?/font>
鍦ㄧ▼搴忎笉鍚屾閲岋紝鐢變簬澹版槑涓嶅悓鐨勫彉閲忥紝涓涓尯鍩熷彲鑳藉洜涓哄湪鍖哄煙鍐呭彂鐢焑xception鐨勫鐞嗘柟寮忎笉鍚屽垎鎴愬涓尯孌點?/font>
鍦ㄧ▼搴忓憳灞傞潰錛宔h涔熸敼鍙樹簡鍑芥暟鍦ㄨ祫婧愪笂鐨勭鐞嗐備緥濡備笅闈㈠嚱鏁頒腑鏇村惈鏈夊涓鍧楀叡浜唴瀛樼殑locking鍜寀nlocking鎿嶄綔 錛?/font>
void mumble(void * arena){
Point *p= new point ;
smlock(arena) ;
//鈥?.濡傛灉姝ゆ椂涓涓猠xception鍙戠敓錛岄棶棰樺氨浜х敓浜?/font>
sumunlock(arena);
delete p;
}
浠庤涔変笂璁詫紝鎴戜滑鍦ㄥ嚱鏁伴鍑哄爢鏍堜箣鍓嶏紝闇瑕乽nlock鍏變韓鍐呭瓨騫禿elete p錛屾垜浠渶瑕佽繖鏍峰仛錛?/font>
try{smlock(arena)} catch(鈥?{
smunlock(arena); delete p; throw;
}
new涓嶉渶瑕佹斁鍦╰ry孌甸噷錛屽洜涓猴紝濡傛灉new鍙戠敓浜唀xception錛宧eap涓殑鍐呭瓨騫舵病鏈夊垎閰嶏紝point鐨刢tor娌℃湁璋冪敤錛屽鏋滃湪ctor涓璭xception錛岄偅涔坧iont鐨勪換浣曟瀯閫犲ソ鐨勫悎鎴愮墿涔熶細鑷姩瑙f瀯鎺夛紝heap涔熶細鑷姩閲婃斁鎺夈?/font>
澶勭悊榪欑璧勬簮綆$悊闂錛屽緩璁細 鎶婅祫婧愰渶姹傚皝瑁呭湪涓涓猚lass object 浣撳唴錛屽茍鐢眃tor閲婃斁璧勬簮.
auto_ptr<point> ph (new point); smlock sm(arena);//濡傛灉姝ゆ椂exception 娌℃湁闂
// 涓嶉渶瑕佹槑紜殑unlock 鍜宒elete
// local dtor 浼氬湪榪欓噷琚皟鐢?sm.SMlock::~smlock(); ph.auto_ptr<point>::~auto_ptr<point>
Exception handling 鐨勬敮鎸侊細
1.媯楠屽彂鐢焧hrow鎿嶄綔鐨勫嚱鏁?/font>
2.鍐沖畾throw鏄惁鍙戠敓鍦╰ry鍖烘閲?/font>
3.濡傛灉鏄紪璇戝櫒蹇呴』鎶奺xception type 鎷挎潵鍜宑atch姣旇緝
4.鍚誨悎鐨勮瘽鎺у埗鏉冧氦緇檆atch
5.濡傛灉throw涓嶅彂鐢熷湪try孌墊垨鑰呮病鏈夊惢鍚堢殑錛岀郴緇熶細鎽ф瘉鎵鏈塧ctive local object b浠庡爢鏍堟妸褰撳墠鍑芥暟unwind鎺?錛岃煩鍑哄埌紼嬪簭鍫嗘爤鐨勪笅涓涓嚱鏁板幓錛岀劧鍚庨噸澶嶄笂榪版楠?/font>
褰撲竴涓疄闄呭璞″湪紼嬪簭鎵ц鏃惰鎶涘嚭錛宔xception object浼氳浜х敓鍑烘潵騫墮氬父鏀懼湪鐩稿悓褰㈠紡鐨別xception 鏁版嵁鍫嗘爤涓?/font>
catch(expoint p){
//do sth
throw;
}
浠ュ強涓涓猠xception object 綾誨瀷涓?exVertex 媧劇敓鑷?expoint 錛岃繖涓ょ綾誨瀷閮藉惢鍚堬紝catch浼氭庝箞鍋?/font>
浠xception object浣滀負鍒濆鹼紝鍍忓嚱鏁板弬鏁頒竴鏍蜂細鏈変竴涓猯ocal copy錛屽鏋減鏄竴涓猳bject鑰屼笉鏄竴涓猺eference 錛屽唴瀹硅鎷瘋礉鐨勬椂鍊欙紝榪欎釜object鐨勯潪expoint閮ㄥ垎浼氳鍒囨帀錛屽鏋滄湁vptr 浼氳璁懼畾涓篹xpoint鐨剉ptr錛屽鏋滆鍐嶆涓㈠嚭鍛紵涓㈠嚭p闇瑕佸啀浜х敓鍙﹀涓涓猠xception 涓存椂瀵硅薄錛屼涪鍑哄師鏉ョ殑寮傚父 錛屼箣鍓嶇殑淇敼緇熺粺浣滃簾銆備絾鏄鏋?catch(expoint& p);鎬庝箞鏍峰憿銆?浠諱綍瀵硅繖涓猳bject鐨勬敼鍙橀兘浼氱箒孌栧埌涔嬪悗鐨刢atch璇彞鎬匯?/font>
c++ 緙栬瘧鍣ㄤ負浜嗘敮鎸丒H浠樺嚭鐨勪唬浠鋒渶澶э紝鏌愮紼嬪害鏄洜涓烘墽琛屾湡鐨勫ぉ鎬т互鍙婂搴曞眰紜歡鐨勪緷璧栥?/font>
7.3 RTTI
RTTI鏄疎xcept handling鐨勪竴涓檮灞炰駭鍝侊紝鍥犱負鎴戜滑闇瑕佹彁渚涙煇縐嶆煡璇xception objects鐨勬柟娉曪紝鐢ㄦ潵寰楀埌exception鐨勫疄闄呯被鍨嬨?/font>
鍦ㄥ悜涓嬭漿鍨嬮棶棰樹笂錛屽鏋滆淇濊瘉鍏跺畨鍏ㄦэ紝閭d箞蹇呴』鍦ㄦ墽琛屾湡瀵規寚閽堟湁鎵鏌ヨ錛岀湅鐪嬪畠鍒板簳鎸囧悜浠涔堢被鍨嬬殑瀵硅薄銆傞偅涔堟垜浠渶瑕侀澶栫殑絀洪棿瀛樺偍綾誨瀷淇℃伅錛岄氬父鏄竴涓寚閽堬紝鎸囨煇涓被鍨嬩俊鎭妭鐐廣?/font>
闇瑕侀澶栫殑鏃墮棿浠ュ喅瀹氭墽琛屾湡鐨勭被鍨嬨?/font>
鍐茬獊鍙戠敓鍦細
1.紼嬪簭鍛樺ぇ閲忕殑浣跨敤浜嗗鍙幫紝騫墮渶瑕佸ぇ閲忕殑downcast鎿嶄綔
2.紼嬪簭鍛樹嬌鐢ㄥ唴寤虹殑鏁版嵁綾誨瀷鍜岄潪澶氭侊紝浠栦笉闇瑕侀澶栬礋鎷呭甫鏉ョ殑渚垮埄
閭d箞濡備綍浜嗚В紼嬪簭鍛樼殑闇瑕佸憿錛燂紵 絳栫暐鏄竴涓叿鏈夊鎬佹фц川鐨刢lass錛屼篃灝辨槸鍏鋒湁鍐呮兜緇ф壙鎴栬呭0鏄?virtual func鐨勭被闇瑕乺tti鏀寔銆?/font>
榪欐牱鎵鏈夊鎬佺被緇存姢涓涓獀ptr銆傞澶栬礋鎷呴檷浣庡埌錛氭瘡涓涓猚lass object澶氳姳璐逛竴涓寚閽堬紝鎸囬拡鍙璁懼畾涓嬈★紝鑰屼笖鏄紪璇戝櫒闈欐佽瀹氥?/font>
down_cast
if(pfct pf = dynamic_cast< pfct >(pt))鈥?
((type_info*)(pt->vptr[0]))->type_descripter;
Reference --------Pointer
dynamic_cast鎵ц鍦╬tr涓?澶辮觸榪斿洖0錛屽鏋滃疄琛屽湪ref涓娿傜敱浜巖ef涓嶈兘琚祴浜坣ull錛屼篃灝辨槸娌℃湁絀哄紩鐢ㄣ傚鏋滄垜浠妸涓涓猺ef璁句負0浼氬紩鍙戜復鏃跺璞′駭鐢燂紝鐒跺悗鐢?鍒濆鍖栧畠錛屼嬌ref鎴愪負榪欎釜涓存椂瀵硅薄鐨勫埆鍚嶃傚洜姝ゆ鏃跺け璐ヤ簡浼氫駭鐢熶竴涓猙ad_cast exception銆?/font>
typeid鐨勫弬鏁板彲浠ヤ嬌寮曠敤錛屽璞℃垨鑰呮槸綾誨瀷
浜嬪疄涓婏紝type_info 涔熼傜敤鍐呭緩綾誨瀷錛岃繖瀵逛簬eh鏈哄埗鏈夊繀瑕?/font>
渚嬪 int ex_errno; throw ex_errno;
鍏朵腑int綾誨瀷 int *ptr; if(typeid(ptr) == typeid(int*));
----------------------鍏ㄤ功絎旇鍒版緇撴潫 --------------------------------s
閫氳繃閲嶈澆鎿嶄綔絎︼紝紼嬪簭鍛樺彲浠ラ拡瀵光滅被鈥濈被鍨嬬殑鎿嶄綔鏁板畾涔変笉鍚岀殑鎿嶄綔絎︾増鏈傝壇濂界殑鎿嶄綔絎﹀畾涔夊彲浠ヤ嬌class綾誨瀷鐨勪嬌鐢ㄦ兂鍐呯疆綾誨瀷涓鏍風洿瑙傜畝媧侊紝浣跨敤閲嶅畾涔夌殑鎿嶄綔絎﹁屼笉鏄懡鍚嶅嚱鏁頒嬌寰楃▼搴忓彲浠ョ敤琛ㄨ揪寮忎唬鏇垮嚱鏁拌皟鐢紝浣跨▼搴忕紪鍐欏拰闃呰鏇村鏄搤
2.鍝簺涓嶈兘閲嶈澆
:: .* . ?: 榪欎簺涓嶈兘閲嶈澆
3.闇瑕佹敞鎰忕殑鍦版柟錛?/font>
閲嶈澆蹇呴』鏈変竴涓猚lass綾誨瀷鐨勬搷浣滄暟錛岀煭璺眰鍊煎け鍘伙紝
閲嶈澆鎿嶄綔絎﹀拰鍐呯疆鎿嶄綔絎︾粨鍚堝瀷鐩稿悓錛屼紭鍏堢駭鎿嶄綔鏁頒釜鏁板潎鐩稿悓
涓嶈閲嶈澆涓浜涘惈鏈夊唴緗畾涔夌殑鎿嶄綔絎?& , && || 榪欎簺
路璧嬪鹼紙=錛変笅鏍囷紙銆愩戯級璋冪敤 錛堬紙錛夛級鍜屾垚鍛樿闂搷浣滅蹇呴』瀹氫箟涓烘垚鍛?/font>
路瀵圭О鐨勬搷浣滅涓鑸畾涔変負鏅氶潪鎴愬憳鍑芥暟
++ -- 涓鑸緗負鎴愬憳鍑芥暟 錛屽洜涓哄彲鑳芥敼鍙樺璞$姸鎬?/font>
4.瀹氫箟杈撳叆杈撳嚭鎿嶄綔絎?/font>
io鎿嶄綔絎﹀彧鑳介噸杞戒負闈炴垚鍛樺嚱鏁幫紝鍚﹀垯鍋氭搷浣滅鍙兘鏄璞℃垚鍛?鐢ㄦ硶鍙樻垚浜?object<<cin 涓嶇鍚堟垜浠殑涔犳儻錛岀粡甯告妸浠栦滑璁劇疆鎴愪負鍙嬪厓錛屽洜涓哄彲鑳借Е鍙婄鏈夊彉閲忋?/font>
杈撳叆蹇呴』鍔犲叆鏂囦歡緇撴潫鍜岃緭鍏ラ敊璇殑閿欒澶勭悊
istream&
operator>>(istream& in, Sales_item& s)
{
double price;
in >> s.isbn >> s.units_sold >> price;
// check that the inputs succeeded
if (in)
s.revenue = s.units_sold * price;
else
s = Sales_item(); // input failed: reset object to default state
return in;
}濡傛灉杈撳叆澶辮觸錛岃皟鐢ㄩ粯璁ゆ瀯閫犲嚱鏁版仮澶嶅璞$姸鎬併?/font>
5.綆楁湳榪愮畻絎﹀拰鍏崇郴榪愮畻絎?/font> Sales_item& operator -=(const Sales_item& item){ 涓鑸畻鏈繍綆楃璁劇疆涓洪潪鎴愬憳鍑芥暟錛屼笌鍐呯疆榪愮畻絎﹀搴旓紝閫夋嫨榪斿洖value 鑰屼笉鏄紩鐢ㄣ傝祴鍊艱繍綆楃閲嶈澆涓烘垚鍛樺嚱鏁幫紝騫剁敤瀹冩潵瀹炵幇綆楁湳榪愮畻絎︼紝榪欐牱綆楁湳榪愮畻絎︿笉鐢╢riend 鐩哥瓑榪愮畻絎﹀拰涓嶇瓑榪愮畻絎︿竴鑸垚瀵瑰嚭鐜幫紝涓旂敤涓涓疄鐜板彟涓涓?/font> 鍏崇郴榪愮畻絎?== != > < 涓鑸噸杞芥垚闈炴垚鍛樺嚱鏁?/font> 6.璧嬪兼搷浣滅 蹇呴』涓烘垚鍛樺嚱鏁?錛?鍙鳳級 =鍜?= -= 涓鑸兘闇瑕佽繑鍥炲乏鎿嶄綔鏁扮殑寮曠敤 Sales_item& operator = (string is){ 6.涓嬫爣鎿嶄綔絎?/font> 蹇呴』涓虹被鎴愬憳鍑芥暟 榪斿洖寮曠敤浣垮叾鍙互鍦ㄨ祴鍊兼搷浣滅殑浠繪剰涓杈?/font> 涓鑸畾涔変竴縐峜onst 榪斿洖甯擱噺寮曠敤 涓縐峮ot const 寮曠敤 int& Foo::operator[] (const size_t index) pari<string,string>& operator[] (const vector< pair<string,string>* > ::size_type index){ 6.鎴愬憳璁塊棶鎿嶄綔絎?/font> -> 涓鑸姹傞噸杞戒負鎴愬憳榪愮畻絎︼紝*娌℃湁瑕佹眰 ,浣嗘垚鍛樻瘮杈冨父瑙亊~~ 渚嬪瓙錛歛uto-ptr~~~~ ScreenPtr 鐨勭敤鎴峰皢浼氫紶閫掍竴涓寚閽堬紝璇ユ寚閽堟寚鍚戝姩鎬佸垎閰嶇殑 Screen錛?tt>ScreenPtr 綾誨皢鎷ユ湁璇ユ寚閽堬紝騫跺畨鎺掑湪鎸囧悜鍩虹瀵硅薄鐨勬渶鍚庝竴涓?ScreenPtr 娑堝け鏃跺垹闄ゅ熀紜瀵硅薄銆傚彟澶栵紝涓嶇敤涓?ScreenPtr 綾誨畾涔夐粯璁ゆ瀯閫犲嚱鏁般傚洜姝わ紝鎴戜滑鐭ラ亾涓涓?ScreenPtr 瀵硅薄灝嗘繪槸鎸囧悜涓涓?Screen 瀵硅薄錛屼笉浼氭湁鏈粦瀹氱殑 ScreenPtr錛岃繖涓鐐逛笌鍐呯疆鎸囬拡涓嶅悓銆傚簲鐢ㄧ▼搴忓彲浠ヤ嬌鐢?ScreenPtr 瀵硅薄鑰屾棤欏婚鍏堟祴璇曞畠鏄惁鎸囧悜涓涓?Screen 瀵硅薄銆?/font> // private class for use by ScreenPtr only 縐佹湁綾伙紝 鎸囬拡鏀寔鐨勫熀鏈搷浣滄湁瑙e紩鐢ㄦ搷浣滃拰綆ご鎿嶄綔銆傛垜浠殑綾誨彲浠ヨ繖鏍峰畾涔夎繖浜涙搷浣滐細 瑙e紩鐢ㄦ搷浣滅鏄釜涓鍏冩搷浣滅銆傚湪榪欎釜綾諱腑錛岃В寮曠敤鎿嶄綔絎﹀畾涔変負鎴愬憳錛屽洜姝ゆ病鏈夋樉寮忓艦鍙傦紝璇ユ搷浣滅榪斿洖瀵?ScreenPtr 鎵鎸囧悜鐨?Screen 鐨勫紩鐢ㄣ?/font>
綆ご鎿嶄綔絎︿笉鎺ュ彈鏄懼紡褰㈠弬銆俻oint->action(); 絳変環浜?nbsp; (point->action)(); 鍙互榪欐牱浣跨敤 ScreenPtr 瀵硅薄璁塊棶 Screen 瀵硅薄鐨勬垚鍛橈細 鍥犱負 p 鏄竴涓?ScreenPtr 瀵硅薄錛?tt>p->display 鐨勫惈涔変笌瀵?(p.operator->())->display 姹傚肩浉鍚屻傚 p.operator->() 姹傚煎皢璋冪敤 ScreenPtr 綾葷殑 operator->錛屽畠榪斿洖鎸囧悜 Screen 瀵硅薄鐨勬寚閽堬紝璇ユ寚閽堢敤浜庤幏鍙栧茍榪愯 ScreenPtr 鎵鎸囧璞$殑 display 鎴愬憳銆?/font>
閲嶈澆綆ご鎿嶄綔絎﹀繀欏昏繑鍥炴寚鍚戠被綾誨瀷鐨勬寚閽堬紝鎴栬呰繑鍥炲畾涔変簡鑷繁鐨勭澶存搷浣滅鐨勭被綾誨瀷瀵硅薄銆?/font> 6.鑷鑷噺鎿嶄綔絎?/font> 涓鑸噸杞戒負鎴愬憳鍑芥暟錛屼負浜嗕笌鍐呯疆綾誨瀷涓鑷達紝鍓嶇疆鎿嶄綔絎﹁繑鍥炶繍綆楃粨鏋滃紩鐢紝鍚庣疆鎿嶄綔絎﹁繑鍥炶繍綆楀墠鐨勫鹼紝value not ref 錛屼負浜嗗尯鍒嗭紝鍚庣疆鎿嶄綔絎︽彁渚涗簡涓涓疄鍙?錛?/font> // prefix: return reference to incremented/decremented object CheckedPtr CheckedPtr::operator++(int) // no check needed here, the call to prefix increment will do the check 鏄懼紡璋冪敤錛?/font>
CheckedPtr parr(ia, ia + size); // iapoints to an array of ints 7 璋冪敤鎿嶄綔絎﹀拰鍑芥暟瀵硅薄 struct absInt { 閫氳繃涓虹被綾誨瀷鐨勫璞℃彁渚涗竴涓疄鍙傝〃鑰屼嬌鐢ㄨ皟鐢ㄦ搷浣滅錛屾墍鐢ㄧ殑鏂瑰紡鐪嬭搗鏉ュ儚涓涓嚱鏁拌皟鐢細
int i = -42; 鍑芥暟璋冪敤鎿嶄綔絎﹀繀欏誨0鏄庝負鎴愬憳鍑芥暟銆備竴涓被鍙互瀹氫箟鍑芥暟璋冪敤鎿嶄綔絎︾殑澶氫釜鐗堟湰錛岀敱褰㈠弬鐨勬暟鐩垨綾誨瀷鍔犱互鍖哄埆銆?/font>
瀹氫箟浜嗚皟鐢ㄦ搷浣滅鐨勭被錛屽叾瀵硅薄甯哥О涓哄嚱鏁板璞★紝鍗沖畠浠槸琛屼負綾諱技鍑芥暟鐨勫璞°?/font>
鍑芥暟錛?/font> 鍑芥暟瀵硅薄錛?/font> // determine whether a length of a given word is longer than a stored bound for (size_t i = 0; i != 11; ++i) 鍑芥暟瀵硅薄鐨勪究鎹鋒с?/font>
plus<int> intAdd; // function object that can add two int values 鍑芥暟閫傞厤鍣細
banding鍣紝瀹冮氳繃灝嗕竴涓搷浣滄暟緇戝畾鍒扮粰瀹氬艱屽皢浜屽厓鍑芥暟瀵硅薄杞崲涓轟竴鍏冨嚱鏁板璞?/font>
姹傚弽鍣ㄦ槸涓縐嶅嚱鏁伴傞厤鍣紝瀹冨皢璋撹瘝鍑芥暟瀵硅薄鐨勭湡鍊兼眰鍙嶃傛爣鍑嗗簱瀹氫箟浜嗕袱涓眰鍙嶅櫒錛?tt>not1 鍜?not2 鍒嗗埆姹傚弽涓鍏冧簩鍏冨璞?/tt> 8銆傚疄鍙傚尮閰嶅拰杞崲錛堜亢鏉ョ湅閲嶈澆鎿嶄綔絎︾殑鍘熷洜鍟婏紝錛岋紝錛?/font>
杞崲鎿嶄綔絎︽槸涓縐嶇壒孌婄殑綾繪垚鍛樺嚱鏁般傚畠瀹氫箟灝嗙被綾誨瀷鍊艱漿鍙樹負鍏朵粬綾誨瀷鍊肩殑杞崲銆傝漿鎹㈡搷浣滅鍦ㄧ被瀹氫箟浣撳唴澹版槑錛屽湪淇濈暀瀛?operator 涔嬪悗璺熺潃杞崲鐨勭洰鏍囩被鍨嬶細 杞崲鍑芥暟閲囩敤濡備笅閫氱敤褰㈠紡錛?/font> 杞崲鍑芥暟蹇呴』鏄垚鍛樺嚱鏁幫紝涓嶈兘鎸囧畾榪斿洖綾誨瀷錛屽茍涓斿艦鍙傝〃蹇呴』涓虹┖銆?/font>
铏界劧杞崲鍑芥暟涓嶈兘鎸囧畾榪斿洖綾誨瀷錛屼絾鏄瘡涓漿鎹㈠嚱鏁板繀欏繪樉寮忚繑鍥炰竴涓寚瀹氱被鍨嬬殑鍊箋備緥濡傦紝operator int 榪斿洖涓涓?int 鍊鹼紱濡傛灉瀹氫箟 operator Sales_item錛屽畠灝嗚繑鍥炰竴涓?Sales_item 瀵硅薄錛岃濡傛綾匯?/font> 杞崲鍑芥暟涓鑸笉搴旇鏀瑰彉琚漿鎹㈢殑瀵硅薄銆傚洜姝わ紝杞崲鎿嶄綔絎﹂氬父搴斿畾涔変負 const 鎴愬憳銆?/font> 鍙瀛樺湪杞崲錛岀紪璇戝櫒灝嗗湪鍙互浣跨敤鍐呯疆杞崲鐨勫湴鏂硅嚜鍔ㄨ皟鐢ㄥ畠 In expressions:
鍦ㄨ〃杈懼紡涓細 In conditions:
鍦ㄦ潯浠朵腑錛?/font> When passing arguments to or returning values from a function:
灝嗗疄鍙備紶緇欏嚱鏁版垨浠庡嚱鏁拌繑鍥炲鹼細 As operands to overloaded operators:
浣滀負閲嶈澆鎿嶄綔絎︾殑鎿嶄綔鏁幫細 In an explicit cast:
鍦ㄦ樉寮忕被鍨嬭漿鎹腑錛?/font> 綾葷被鍨嬭漿鎹箣鍚庝笉鑳藉啀璺熷彟涓涓被綾誨瀷杞崲銆傚鏋滈渶瑕佸涓被綾誨瀷杞崲錛屽垯浠g爜灝嗗嚭閿欍傦紙鎸囩殑鏄笉鑳借繛緇袱涓嚜瀹氫箟鐨勭被鍨嬭漿鎹紝浣嗘槸鍐呯疆綾誨瀷杞崲鍙互鐨勶級 榪樻湁涓閮ㄥ垎鏄疄鍙傚尮閰嶅拰杞崲 錛屾病鏃墮棿浜?浠ュ悗鍐嶇湅~~~~
units_sold-=item.units_sold;
revenue-=item.revenue;
return *this;
}
Sales_item operator - (const Sales_item& lhs,const Sales_item& rhs){
Sales_item res(lhs);
res+=rhs;
return res;
}
isbn = is;
return *this;
}
class Foo {
public:
int &operator[] (const size_t);
const int &operator[] (const size_t) const;
// other interface members
private:
vector<int> data;
// other member data and private utility functions
};
{
return data[index]; // no range checking on index
}
const int& Foo::operator[] (const size_t index) const
{
return data[index]; // no range checking on index
}
return *wait_list.at(index);//浣跨敤at鍒ゆ柇鏄惁瓚婄晫
}
class ScrPtr {
friend class ScreenPtr;
Screen *sp;
size_t use;
ScrPtr(Screen *p): sp(p), use(1) { }
~ScrPtr() { delete sp; }
};
/*
* smart pointer: Users pass to a pointer to a dynamically allocated Screen, which
* is automatically destroyed when the last ScreenPtr goes away
*/
class ScreenPtr {
public:
// no default constructor: ScreenPtrs must be bound to an object
ScreenPtr(Screen *p): ptr(new ScrPtr(p)) { }
// copy members and increment the use count
ScreenPtr(const ScreenPtr &orig):
ptr(orig.ptr) { ++ptr->use; }
ScreenPtr& operator=(const ScreenPtr&);
// if use count goes to zero, delete the ScrPtr object
~ScreenPtr() { if (--ptr->use == 0) delete ptr; }
private:
ScrPtr *ptr; // points to use-counted ScrPtr class
};
class ScreenPtr {
public:
// constructor and copy control members as before
Screen &operator*() { return *ptr->sp; }
Screen *operator->() { return ptr->sp; }
const Screen &operator*() const { return *ptr->sp; }
const Screen *operator->() const { return ptr->sp; }
private:
ScrPtr *ptr; // points to use-counted ScrPtr class
};
ScreenPtr p(&myScreen); // copies the underlying Screen
p->display(cout);
CheckedPtr& CheckedPtr::operator++()
{
if (curr == end)
throw out_of_range
("increment past the end of CheckedPtr");
++curr; // advance current state
return *this;
}
{
CheckedPtr ret(*this); // save current value
++*this; // advance one element, checking the increment 鐢ㄥ墠緗疄鐜板畠錛屼笉鐢ㄥ垽鏂嚭鐣屼簡
return ret; // return saved state
}
parr.operator++(0); // call postfix operator++
parr.operator++(); // call prefix operator++
int operator() (int val) {
return val < 0 ? -val : val;
}
};
absInt absObj; // object that defines function call operator
unsigned int ui = absObj(i); // calls absInt::operator(int)
// determine whether a length of a given word is 6 or more
bool GT6(const string &s)
{
return s.size() >= 6;
}
class GT_cls {
public:
GT_cls(size_t val = 0): bound(val) { }
bool operator()(const string &s)
{ return s.size() >= bound; }
private:
std::string::size_type bound;
};
cout << count_if(words.begin(), words.end(), GT(i))
<< " words " << i
<< " characters or longer" << endl;
negate<int> intNegate; // function object that can negate an int value
// uses intAdd::operator(int, int) to add 10 and 20
int sum = intAdd(10, 20); // sum = 30
// uses intNegate::operator(int) to generate -10 as second parameter
// to intAdd::operator(int, int)
sum = intAdd(10, intNegate(10)); // sum = 0
operator type();
SmallInt si;
double dval;
si >= dval // si converted to int and then convert to double
if (si) // si converted to int and then convert to bool
int calc(int);
SmallInt si;
int i = calc(si); // convert si to int and call calc
// convert si to int then call opeator<< on the int value
cout << si << endl;
int ival;
SmallInt si = 3.541; //
instruct compiler to cast si to int
ival = static_cast<int>(si) + 3;
]]>
#include <iostream> #include <vector> #include "time.h" using namespace std; void sieve(int n){ vector<bool> isprime(n,true); vector<int> prime; int cnt=0; for(int i=2;i<n;i++){ if(isprime[i])cnt++,prime.push_back(i); for(int t=0;t<cnt&&i*prime[t]<n;t++){ isprime[i*prime[t]]=false; if(i%prime[t]==0)break; } } /*for(int i=0;i<cnt;i++) cout<<prime[i]<<" ";*/ } void oldseive(int n){ vector<bool> isprime(n,true); vector<int> prime; for(int i=2;i<n;i++){ if(isprime[i]){ prime.push_back(i); for(int j=i*2;j<n;j+=i) isprime[j]=false; } } /*for(int i=0;i<prime.size();i++) cout<<prime[i]<<" ";*/ } int main(){ clock_t start,end; start = clock(); sieve(2000000); //oldseive(2000000); end = clock(); double time = double(end-start)/CLOCKS_PER_SEC; cout<<endl<< time<<endl; }
綰挎х瓫娉晄ieve 1.546s oldsieve 2.875s 蹇簡灝嗚繎涓鍊?/p>
old sieve 緙洪櫡錛氬悎鏁板彲鑳借澶氭絳涙帀錛屼緥濡?30琚?錛?錛?絳涙帀浜?嬈?鐒跺悗 綰挎х瓫娉曢檺瀹氫簡 浠諱綍涓涓悎鏁板彧琚畠鐨勬渶灝忚川鍥犳暟絳涙帀涓嬈★紝鎬庝箞鍋氬埌榪欎竴鐐箏~
if(i%prime[t]==0) break; 濡傛灉姝ゆ椂絳涙帀鐨勫悎鏁頒粠灝忓埌澶ф壘鍒扮涓涓彲浠ユ暣闄ょ殑璐ㄦ暟錛岄偅涔堟樉鐒朵粬鎵懼埌浜嗗畠鐨勬渶灝忚川鍥犳暟錛屾鏃舵垜浠仠姝㈡悳绱㈣川鏁拌〃錛屽洜涓哄悗闈㈢殑璐ㄦ暟姣斿綋鍓嶇殑prime[t]瑕佸ぇ錛屽鏋滄垜浠敤prime[t+n]*i 絳涙帀浜嗕竴涓悎鏁幫紝榪欎釜鍚堟暟蹇呯劧鍙互琛ㄨ堪鎴愪負 prime[t]*someK *prime[t+n] 涔熷氨鏄榪欎釜鍚堟暟鐨勬渶灝忚川鍥犳暟涔熸槸prime[t],浠栧簲璇ヨ prime[t]絳涙帀-->褰撶▼搴忚繍琛屽埌 someK*prime[t+n] 鐨勬椂鍊檦~~~
over--------------------------------------------------------------------
路路路路member 鐨勫悇縐嶈皟鐢ㄦ柟寮弤
1.闈為潤鎬佹垚鍛樺嚱鏁奧?/font>
float Point3d::mangitude3d()const{鈥
浼氬彉鎴?float Point3d::magnitude(const Point3d* this){鈥
c++鐨勫噯鍒欎箣涓錛氶潪闈欐佹垚鍛樺嚱鏁拌嚦灝戝繀欏誨悓涓鑸殑nonmember function 鏈夌浉鍚岀殑鏁堢巼
鍚嶇О鐨勭壒孌婂鐞嗭細錛坣ame mangling錛変竴鑸琺ember鍚嶇О鍓嶉潰閮戒細鍔犱笂class鍚嶇О錛屽艦鎴愮嫭涓鏃犱簩鐨勫懡鍚嶏紝class Bar {public 錛歩nt ival錛泒 鍙兘鍙樻垚 ival_3Bar ;3搴旇鏄痓ar鐨勯暱搴︿簡銆?/font>
榪欐牱鍙互闃叉緇ф壙浣撶郴涓袱涓被瀹氫箟鍚屾牱鍚嶅瓧鐨勫彉閲弤
濡傛灉浣跨敤extern 鈥淐鈥?灝卞彲浠ュ帇鍒秐onmember 鐨刴angling 鏁堟灉
2.铏氭嫙鎴愬憳鍑芥暟路
濡傛灉normalize 鏄櫄鎷熷嚱鏁?浠栦細琚炕璇戞垚:
(*ptr->vptr[1])(ptr); 絎簩涓猵tr鏄痶his鎸囬拡
綾諱技鐨刴agnitude 浼氬彉鎴?/font>
(*this->vptr[2])(this);
鑰宮agnitude鏄湪normalize涔嬪悗璋冪敤鐨勫洜姝ゆ鏃跺凡緇忕‘瀹歵his鎸囧悜鐨勬槸Point3d 鍥犳鍙互鐩存帴璋冪敤Point3d::magnitude()鏇存湁鏁堢巼
濡傛灉鐢ㄤ竴涓璞¤皟鐢ㄤ竴涓櫄鎷熷嚱鏁板簲璇ユ妸瀹冨綋鍋氭甯稿嚱鏁版潵瀵瑰緟錛屽洜涓哄彲浠ョ‘瀹氬璞$被鍨嬬洿鎺ヨ皟鐢ㄧ浉搴旂殑鍑芥暟鍗沖彲錛屽湪榪欑鎯呭喌涓嬶紝铏氭嫙鍑芥暟涔熷彲浠nline 鏉ユ彁楂樻晥鐜囦簡~~~
3.闈欐佹垚鍛樺嚱鏁?/font>
class A{
public:
static int a;
static int geta(){return a;}
};
int A::a=33333;
int main(){
cout<< ((A*)0)->geta()<<endl;
}
static鐨勪富瑕佺壒寰佹槸浠栨病鏈塼his 鎸囬拡錛岃繖鏍峰鑷粹?/font>
浠栦笉鑳界洿鎺ュ瓨鍙栧叾class涓殑nonstatic members
浠栦笉鑳借澹版槑涓篶onst volatile 鎴栬卾irtual
浠栦笉闇瑕佺粡鐢眂lass object 鎵嶈璋冪敤 铏界劧澶ч儴鍒嗘儏鍐墊槸榪欐牱璋冪敤鐨?/font>
濡傛灉鍙栦竴涓猻tatic member func 鍦板潃鍒欏緱鍒扮殑鏄粬鍦ㄥ唴瀛樹腑鐨勭湡姝e湴鍧錛岃屼笖寰楀埌鐨勬槸涓涓嚱鏁版寚閽堬紝鑰屼笉鏄竴涓寚鍚慶lass member 鍑芥暟鐨勬寚閽?/font>
路路路路铏氭嫙鎴愬憳鍑芥暟
涓轟簡鏀寔virtual func 鏈哄埗錛屽繀欏婚鍏堣兘澶熷澶氭佸璞$敱鏌愮褰㈠紡鐨勮繍琛屾湡綾誨瀷鍒ゆ柇鏂規硶
c++涓鎬佽〃紺猴細浠ヤ竴涓猵ublic blase class 鎸囬拡鎴栬呭紩鐢?瀵誨潃鍑轟竴涓猟erived class object 鐨勬剰鎬?/font>
璇嗗埆鍑哄摢涓被闇瑕佹敮鎸佸鎬佸彧瑕佺湅浠栨槸鍚︽湁浠諱綍鐨剉irtual func
~~~鍗曚竴緇ф壙
vtable涓瘡涓涓獀irtual func錛堝寘鎷琾ure func錛夐兘琚寚媧句竴涓浐瀹氱殑绱㈠紩鍊鹼紝榪欎釜绱㈠紩鍦ㄦ暣涓戶鎵夸綋緋諱腑淇濇寔涓庣壒瀹氱殑virtual function 鐨勫叧鑱?/font>
褰撲竴涓猚lass 緇ф壙鑷笂涓涓猚lass鏃跺?/font>
1.鍙互緇ф壙base class 澹版槑鐨剉irtual func 錛岃繖鏍瘋鍑芥暟瀹炰綋鐨勫湴鍧浼氳鎷瘋礉鍒頒粬鐨剉table鐩稿搴旂殑slot 涓紝浣嶇疆x涓嶅彉 榪欐牱璋冪敤鏃跺?ptr->func();浼氱炕璇戞垚 (*ptr->vtbl[x])func(ptr) ;鑰屼笉鐢ㄧptr 鍒板簳鏄竴涓猙ase 榪樻槸涓涓猟erived
2.浠栧彲浠ヤ嬌鐢ㄨ嚜宸辯殑鍑芥暟瀹炰綋錛岃〃紺轟粬鑷繁鐨勫嚱鏁板湴鍧蹇呴』鏀懼湪鐩稿簲鐨勪綅緗畑澶?,璺熶笂闈㈢殑渚嬪瓙涓鏍?/font>
3.鍙互鍔犲叆鏂扮殑virtual 鍑芥暟錛岃繖鏃跺檝tbl 浼氬彉澶?/font>
~~~澶氶噸緇ф壙鍛?/font>
澶氶噸緇ф壙鏃跺?渚嬪 Derived public 鑷?Base1,Base2
Base2 *pbase2 = new Derived; 鏂扮殑Derived蹇呴』璋冩暣
Base2 *pbase2 = tmp?tmp+sizeof(Base1):0;
褰撶▼搴忓憳鍒犻櫎pbase2鎸囧悜鐨勫璞℃椂鎸囬拡蹇呴』鍐嶄竴嬈¤皟鏁淬備笂榪扮殑璋冩暣騫朵笉鑳藉湪緙栬瘧鏃舵湡璁懼畾錛屽洜涓簆base2鎸囧悜鐨勫璞″彧鏈夊湪鎵ц鏈熸墠鑳界‘瀹氥?/font>
鍚屾牱閬撶悊錛宲base2 濡傛灉瑕佽皟鐢ㄥ嚱鏁扮殑璇濓紝璋冪敤鎿嶄綔浼氬紩鍙戝繀瑕佺殑鎸囬拡璋冩暣錛屼篃蹇呴』鍦ㄦ墽琛屾湡璋冩暣銆?/font>
Bjarne閲囩敤鎵╁厖vtable 姣忎竴欏硅褰曡皟鏁磘his鎸囬拡鐨勪俊鎭紝浣嗘氮璐癸紝鍥犱負澶ч儴鍒嗕笉闇瑕佽皟鏁?/font>
Thunk鎶鏈槸鐢ㄤ竴孌墊眹緙栧疄鐜拌皟鏁磘his鎸囬拡浠ュ強璺沖埌virtual func鐨勮繃紼?/font>
璋冩暣this鎸囬拡鐨勭浜屼釜璐熸媴鏄細濡傛灉鐢眃erved class 璋冪敤錛屾垨鑰呯敱絎簩涓猙ase class 璋冪敤錛屽悓涓涓嚱鏁板彲鑳藉湪virtual table 瀵瑰簲澶氫釜slots
pbase1 鍜宒erived 鐨剉table鍙互鍚堝茍錛屼粬浠敤鍚屾牱鐨剆lots 鍋忕Щ錛岄噷闈㈠彲浠ユ斁鐪熸鐨勫湴鍧錛岃宲base2 闇瑕佽皟鏁磘his鎸囬拡錛屽叾vtabl 鐩稿簲鐨勫湴鍧鏀劇殑鏄浉搴旂殑thunk鍦板潃銆?/font>
鍙互鐪嬪埌鈥濓細
1.濡傛灉閫氳繃鎸囧悜絎簩涓猙ase class 鎸囬拡璋冪敤derived鐨刦unc ptr 闇瑕佽皟鏁?/font>
2.濡傛灉閫氳繃鎸囧悜derived鎸囬拡璋冪敤浠庣浜屼釜緇ф壙鏉ョ殑func 闇璋冩暣
3.濡傛灉鍏佽virtual func 榪斿洖綾誨瀷鏈夋墍鍙樺寲錛屽彲鑳絙ase 鍙兘derived錛屼篃闇瑕佽皟鏁磘his
Microsoft 鐢╝ddress point 絳栫暐錛屽嵆灝嗙敤鏉ユ敼鍐欏埆浜虹殑鍑芥暟錛屾湡寰呰幏寰楃殑鍙傛暟錛坱his錛夋槸寮曞叆璇lass 鐨勫湴鍧錛岃繖灝辨槸鍑芥暟鐨刟ddress class錛垀~涓嶄簡鍟妦~錛?/font>
~~~铏氭嫙緇ф壙涓嬬殑virtual func
鍗充究鍙湁涓涓猙ase clas 瀹冪殑甯冨眬杞崲涔熼渶瑕乼his 鎸囬拡鐨勮皟鏁達紝鐩稿綋澶嶆潅~~~
鈥︽寚鍚戞垚鍛樺嚱鏁扮殑鎸囬拡
double Point::x();
鍙互瀹氫箟鎸囧悜鎴愬憳鍑芥暟鐨勬寚閽?/font>
double (Point::* pmf)()=&Point::x;
璋冪敤鍙互 (origin.*pmf)() 鎴栬?ptr->*pmf();
濡傛灉鏄櫄鎷熷嚱鏁扮殑鎸囬拡鍛紵錛?/font>
Point* ptr= new Point3d;
濡傛灉x鏄竴涓櫄鎷熷嚱鏁?/font>
(ptr->*pmf)();浠嶇劧鏄疨oint3d::x()琚皟鐢ㄤ箞錛?/font>
絳旀~~鏄殑
鍥犱負鍙栧緱铏氭嫙鍑芥暟鐨勫湴鍧鍏跺疄鍙栧緱鐨勬槸铏氭嫙鍑芥暟鐨刼ffset鍊?/font>
璋冪敤浼氬彉鎴?nbsp; (*ptr->vtbl[(int)pmf])(ptr);
class A{
public:
static int a;
static int geta() {return a;} //闈欐佸茍涓嶈兘浣滀負閲嶈澆鏉′歡
int geta(int x){
return a;
}
int geta( int a)const{} // const鎴愬憳鍑芥暟 錛屽彲浠ヤ綔涓洪噸杞芥潯浠?br>};
int A::a=33333;
int main(){
A a;
cout<< ((A*)0)->geta()<<endl;//闈欐佹垚鍛樺嚱鏁扮殑涓縐嶈皟鐢ㄦ柟娉?((A*)0)->geta()
int(*p)()= &A::geta;
cout<<(*p)()<<endl;
int (A::* pgeta)(int a) = &A::geta;
cout<<(a.*pgeta)(3)<<endl;
}
杈撳嚭鍧囦負33333
澶氶噸緇ф壙涓嬪憿錛燂紵錛燂紵
Microsoft鎻愪緵浜?縐嶈В鍐蟲柟娉曪細
涓縐嶏細鍗曚竴緇ф壙鐨勬儏鍐碉紙甯call thunk鍦板潃鎴栬呭嚱鏁板湴鍧錛?/font>
2澶氶噸緇ф壙 甯︽湁faddr 鍜宒elta
铏氭嫙緇ф壙 甯︽湁鍥涗釜members
錛埪仿仿仿仿峰叿浣撲互鍚庡啀鏌ュ惂錛?/font>
----------
inline members
鐪熸鐨刬nline 鍑芥暟鎵╁睍鏄湪璋冪敤鐨勯偅涓涓偣涓婏紝榪欏洖甯︽潵鍙傛暟鐨勬眰鍊兼搷浣滀互鍙婃殏鏃舵у璞$殑綆$悊
褰㈠紡鍙傛暟 formal arguments
鍦╥nline 鏈熼棿 姣忎竴涓艦寮忓弬鏁伴兘浼氳鐩稿簲鐨勫疄闄呭弬鏁板彇浠o紝鍓綔鐢ㄦ槸錛屼笉鍙互鍙槸綆鍗曠殑涓涓灝佸紼嬪簭涓嚭鐜扮殑姣忎竴涓艦寮忓弬鏁幫紝鍥犱負榪欏皢瀵艱嚧瀵逛簬瀹為檯鍙傛暟鐨勫嬈℃眰鍊兼搷浣滐紝鍙兘浜х敓 甯︽潵鍓綔鐢ㄧ殑 瀹為檯鍙傛暟錛岄氬父榪欓渶瑕佸祵鍏ュ疄闄呭璞$殑~~~~
鎵浠ワ紝濡傛灉瀹為檯鍙傛暟鏄父閲忥紝閭d箞鎴戜滑鍙互鐩存帴緇戝畾錛屽鏋滀笉鏄父閲忎篃娌℃湁鍓綔鐢紝鎴戜滑鐩存帴浠f浛錛屽惁鍒檦~~鏆傛椂瀵硅薄浼氶渶瑕佺殑~路
渚嬪錛?/font>
inline int min(int i,int j) { return i<j ? i:j ;}
minval = min(val1,val2);
minval = min(11,12);
minval = min (foo(),bar()+1);
榪欎細鎵╁睍鎴? minval = val1<val2 ? val1?val2;
minval = 11;( 甯擱噺鍝?
int t1,t2; minval =(t1 = foo()), (t2=bar()+1),t1<t2?t1:t2;
濡傛灉鎴戜滑鏀瑰彉鍑芥暟瀹氫箟
{int minval = i<j?i:j; return minval;}
濡備笅璋冪敤{int minval ; minval = min(val1,val2);}
涓轟簡緇存姢灞閮ㄥ彉閲忓彲鑳戒細鍙樻垚錛?/font>
{ int m_lv_minval; minval=(__min_lv_minval=val1<val2?val1:val2),min_lv_minval;}
涓鑸岃█錛宨nline 鍑芥暟鐨勬瘡涓涓眬閮ㄥ彉閲忛兘蹇呴』鏀懼湪鍑芥暟璋冪敤鐨勪竴涓皝闂尯孌典腑錛屾嫢鏈変竴涓嫭涓鏃犱簩鐨勫悕瀛楋紝濡傛灉inline鍑芥暟浠ュ崟涓琛ㄨ揪寮忔墿灞曞嬈★紝閭d箞姣忔鎵╁睍閮介渶瑕佽嚜宸辯殑涓緇勫眬閮ㄥ彉閲忋傚鏋渋nline 鍑芥暟鍙互浠ュ垎紱葷殑澶氫釜寮忓瓙琚墿灞曞嬈★紝閭d箞鍙渶瑕佷竴緇勫眬閮ㄥ彉閲忓氨鍙互閲嶅浣跨敤錛屽洜涓轟粬浠灝侀棴鍦ㄨ嚜宸辯殑scope涓細
渚嬪 minval = min(val1,val2) + min(foo(),foo()+1) ;
鎵╁睍 int __min_lv_minval_0,__min_lv_minval_1,t1,t2;
minval = ((__min_lv_minval_0 = val1<val2?val1:val2),__min_lv_minval_0)+鈥?;
鍙傛暟甯︽湁鍓綔鐢ㄦ垨鑰呮槸浠ヤ竴涓崟涓琛ㄨ揪寮忓仛澶氶噸璋冪敤錛屾垨鑰呮槸鍦╥nline 鍑芥暟鍐呴儴鏈夊涓眬閮ㄥ彉閲?/font>
閮戒細浜х敓灞閮ㄥ彉閲忥紝瑕佸皬蹇冨寰?/font>
--------------------緇撴潫綰垮摝~~~~~~路路----------------------
榪欐浠g爜杈撳嚭浠涔堬紵
#include <iostream>
using namespace std;
class A{ public:A(){ac='s';}private:char ac;};
class B:virtual public A{public:B(){a='e';}char a; };
class C:virtual public A{ };
class D:public B,public C
{
public:
D():A(),B(),C(){b=13;}
int b;
};
int main(){
D d;
cout<<"sizeof(A)="<<sizeof(A)<<endl;
cout<<"sizeof(B)="<<sizeof(B)<<endl;
cout<<"sizeof(C)="<<sizeof(C)<<endl;
cout<<"sizeof(D)="<<sizeof(D)<<endl;
cout<<endl;
cout<<"address of A's subobject in d"<<(A*)&d<<endl;
cout<<"address of B's subobject in d"<<(B*)&d<<endl;
cout<<"address of C's subobject in d"<<(C*)&d<<endl;
cout<<"address of D's subobject in d"<<(D*)&d<<endl;
cout<<endl;
int* p = (int*)(*((int*)&d));
cout<<"address of b's virtual base table="<<p<<endl;
cout<<"first member in b's virtual base table="<<*p<<endl;
cout<<"second member in b's virtual base table="<<*(p+1)<<endl;
cout<<"third member in b's virtual base table="<<*(p+2)<<endl;
cout<<endl;
p= (int*)*((int*)((C*)&d));
cout<<"address of c's virtual base class table= "<<p<<endl;
cout<<"first member in c's virtual base table="<< *p<<endl;
cout<<"second member in c's virtual base table="<<*(p+1)<<endl;
cout<<"third member in c's virtual base table="<<*(p+2)<<endl;
char *pchar= (char*)(&d)+4; //char鍨嬪姞4 娉ㄦ剰A涓殑ac鍏跺疄鏄鏈夊彉閲忥紝B涓嶅簲璇ュ彲浠ヨ闂埌鐨勶紝瀹為檯涓婇氳繃寮哄埗杞崲鍙互闈炴硶瑙﹀強濂?銆?
cout<<*pchar<<endl;
cout<<*(pchar+12)<<endl;
B b;
int *pint =(int*)(&b)+1; //int鍨?1
cout<<*((char*)(pint))<<endl;
pint = (int*)(&d)+3;
cout<<*(pint)<<endl;
}
緇撴灉鏄細
sizeof(A)=1
sizeof(B)=9
sizeof(C)=5
sizeof(D)=17
address of A's subobject in d0012FF74
address of B's subobject in d0012FF64
address of C's subobject in d0012FF6C
address of D's subobject in d0012FF64
address of b's virtual base table=00403350
first member in b's virtual base table=0
second member in b's virtual base table=16
third member in b's virtual base table=0
address of c's virtual base class table= 00403358
first member in c's virtual base table=0
second member in c's virtual base table=8
third member in c's virtual base table=0
e
s
e
13
1.璇█鏈韓閫犳垚鐨勮礋鎷咃細濡倂irtual baseclass
2.瀵歸綈閫犳垚鐨勮礋鎷咃紙瀵歸綈浼氬崟鐙紑棰樿璁猴級
3.緙栬瘧鍣ㄤ紭鍖栧鐞?A铏界劧鏄┖鐨?but 涓轟簡璁〢鐨勪袱涓猳bject鍦ㄥ唴瀛樹腑寰楀埌涓嶅悓鐨勫湴鍧錛岀紪璇戝櫒緇欎粬鍔犱笂浜嗕竴涓猙yte錛屼絾鏄疊鍜孋閮芥病鏈夎繖涓涓猙yte鍛紵榪欐槸緙栬瘧鍣ㄥ仛浜嗕紭鍖栵紝鍏佽鐪佹帀榪欎竴涓猙yte
鐪嬩笂闈㈢殑浠g爜鈥濓細
鐜鏄痸s2008 瀵歸綈璁劇疆涓?瀛楄妭
A鐨勫ぇ灝忎負1 鍥犱負鏈変竴涓猚har 娌℃湁瀵歸綈鍥犱負涓嶆槸緇撴瀯鍨嬪璞★紝濡傛灉A娌℃湁榪欎釜char澶у皬渚濈劧鏄?鐨?/font>
B鐨勫ぇ灝忎負9 棣栧厛寮濮嬫槸瀹冪殑virtual base class ptr錛?涓瓧鑺傜殑鎸囬拡錛岀劧鍚庢槸浠栬嚜宸辯殑member 1涓猚har 姝ゆ椂涓轟簡淇濊瘉鍏跺璞″畬鏁存х紪璇戝櫒瀵歸綈鍒?瀛楄妭澶勪篃灝辨槸鍦ㄧ涔濅釜瀛楄妭鍐呮斁鍏ュ熀綾葷殑member
榪欐牱濡傛灉鎴戜滑鎶夾=B B璧嬬粰A錛屼紶杈撳彲浠ヤ粠鏁?瀛楄妭寮濮嬪壊鍑篈鍗沖彲
C鐨勫ぇ灝忔槸5 娌′粈涔堝ソ瑙i噴
D鐨勫ぇ灝忔槸17棣栧厛鏄疊鐨?瀛楄妭(4瀛楄妭vbptr+1瀛楄妭char member+3瀛楄妭瀵歸綈)鐒跺悗鏄疌鐨?瀛楄妭vbptr,鐒跺悗鏄嚜宸辯殑member4瀛楄妭鏈鍚庢槸1瀛楄妭鐨刡ase class member,鍙互鐪嬪埌B鍜孋鐨刡ase class table涓殑欏歸兘鏄嚜宸變綅緗笌榪欎釜member鐨刼ffset 鍊?/font>
涓嶅悓緙栬瘧鍣ㄥ彲鑳界粨鏋滀笉鍚岀殑錛屽洜涓篶++ standard 騫舵病鏈夊己鍒惰瀹?base class subobjects鐨勯『搴忕瓑
data member 鏄▼搴忔墽琛岃繃紼嬩腑鐨勬煇縐嶇姸鎬侊細
static data member 鏄暣涓猚lass 鐨勭姸鎬?/font>
non-static data member 鏄釜鍒玞lass-object 鐨勭姸鎬?/font>
c++瀵硅薄灝介噺浠ョ┖闂翠紭鍖栧拰瀛樺彇閫熷害鐨勮冭檻鏉ヨ〃鐜皀on-static members 錛屽茍涓斿拰c鐨剆truct 鏁版嵁閰嶇疆鐨勫吋瀹規с?/font>
static data member 鏀懼湪紼嬪簭鐨勪竴涓猤lobal data segment 涓紝涓嶄細褰卞搷涓埆鐨刢lass-object 澶у皬
錛屽湪class娌℃湁object 鏃跺凡緇忓瓨鍦紝浣嗘槸template涓湁浜涗笉鍚?/font>
-----DATA member 鐨勭粦瀹?/font>
濮嬬粓鎶妌ested type 澹版槑 鏀懼湪class 璧峰澶勶紝argument list 涓殑鍚嶇О浼氬湪絎竴嬈¢亣鍒版椂鍊欒閫傚綋鐨勫喅璁畬鎴愶紝鍥犳extern 鍜宯ested type names 涔嬮棿鐨勯潪鐩磋緇戝畾鎿嶄綔榪樻槸浼氬彂鐢熴?/font>
---- DATA 鐨勫瓨鍙?/font>
Point3d origin,*pt=&origin;
origin.x = 0.0; 鍜?pt->x=0.0 ; 鏈変粈涔堝尯鍒箞錛燂紵
濡傛灉x鏄潤鎬乨ata member 鍒欏畬鍏ㄦ病鏈夊尯鍒?鍥犱負浠栦滑閮藉湪data segment 涓拰object鏃犲叧
~nonstatic data member---------
濡傛灉point3d涓嶅寘鍚櫄鎷熺戶鎵塊偅涔堟病鏈夊樊寮?/font>
鍚﹀垯鎴戜滑涓嶈兘紜畾pt涓繀鐒舵寚鍚戝摢涓縐嶅洜姝や笉鑳藉湪緙栬瘧鍣ㄧ‘瀹歰ffset闇瑕佷竴浜涜繍琛屾椂鍊欑殑璁$畻鎶夋嫨錛岃宱rigin鍒欎笉鍚屼竴瀹氭槸鏌愪竴涓被鍨嬬殑鎵浠ユ病鏈夐棶棰?/font>
澶氱戶鎵挎垨鑰呭崟緇ф壙閮戒笉浼氬甫鏉ヨ闂笂鐨勫獎鍝嶏紝鍥犱負浠栦滑閮藉彲浠ュ悜c鐨勭粨鏋勪綋閭f牱鍦ㄧ紪璇戞椂鏈熺‘瀹氬悇涓猰ember鐨刼ffset銆傚嵆浣挎槸澶氱戶鎵縫t鎸囧悜絎簩涓猙aseclass鐨刣ata錛岀敱浜巑ember鐨勪綅緗湪緙栬瘧鏃舵湡灝卞凡緇忓浐瀹氫簡錛屽洜姝ゅ瓨鍙杕ember鍙槸涓涓猳ffset榪愮畻錛屽儚鍗曚竴緇ф壙閭f牱綆鍗曪紝涓嶇鏄寚閽堬紝reference鎴栬卭bject閮戒竴鏍?
鍙湁virtual base class 浼氬甫鏉ヤ竴浜涙崯鑰楋紝鍥犱負浠栦嬌寰楀璞℃ā鍨嬪彉寰楀鏉備簡
濡傛灉鎴戜滑鍦ㄤ竴涓被涓姞鍏ヤ簡virtual func 浼氬彂鐢熶粈涔垀~~
1. 浼氫駭鐢熶竴涓獀irtual table錛屽瓨鏀炬瘡涓涓獀irtual func鍦板潃浠ュ強rtti鏀寔鐨則ype_info
2.class object 鍐呴兘鍔犲叆涓涓獀ptr錛屾彁渚涙墽琛屾湡鐨勯摼鎺?/font>
3.鍔犲己ctor 璁懼畾vpr鍒濆?/font>
4.鍔犲己dtor 娑堥櫎vptr 浠巇irived class 鍒?base class
铏氭嫙緇ф壙錛?/font>
浠栧繀欏繪敮鎸佹煇縐嶅艦寮忕殑鈥渟hared subobject鈥濈戶鎵?/font>
閭d箞涓涓猳bject浼氬垎鎴愪竴涓笉鍙樺眬閮ㄥ拰涓涓叡浜眬閮ㄧ殑鏁版嵁錛屽叡浜眬閮ㄥ氨鏄痸irtual base class subobject錛屼粬鐨勪綅緗細鍥犱負姣忔媧劇敓鎿嶄綔鍙戠敓鍙樺寲(渚嬪涓涓獀irtual base class subobject鐨勪綅緗湪涓嶅悓綰у埆鐨勭戶鎵夸綋緋諱腑鐨勪綅緗槸涓嶇‘瀹氱殑錛屼笉鍍忓緇ф壙鍗曠戶鎵塊偅鏍鋒湁鍥哄畾鐨刼ffset)錛屾墍浠ヤ粬鍙兘闂存帴瀛樺彇錛屽洜姝や駭鐢熶簡鏁堢巼緙烘崯.(闂存帴鏄寚鐨勬槸浠栧彧鑳介鍏堣鍑轟粬鐨勬寚閽堬紝鐒跺悗鏍規嵁鎸囬拡鐨勫唴瀹瑰彇鍒頒粬)
鎵浠ュ湪铏氭嫙緇ф壙鍩虹被涓渶濂戒笉瑕佹湁data member
-------鎸囧悜DATAmember 鐨勬寚閽?/font>
#include <iostream>
using namespace std;
class A
{
public:
int a;
};
int main(){
int A::* p=&A::a;
cout<<p<<endl;
}
杈撳嚭 1
鍥犱負涓轟簡闃叉&A::a鍜?int A::*a = 0錛涗竴鏍鋒妸浠栧姞浜?銆?
铏氭嫙緇ф壙甯︽潵鐨勪富瑕佸啿鍑繪槸錛屽Θ紕嶄簡浼樺寲鐨勬湁鏁堟э紝鍥犱負姣忎竴灞傝櫄鎷熺戶鎵塊兘甯︽潵浜嗕竴涓澶栧眰嬈$殑闂存帴鎬э紝鍦ㄧ紪璇戝櫒涓瓨鍙?綾諱技point::x鐨勬搷浣減b.*bx
浼氳杞寲涓?&pb->vbcPoint+bx
鑰屼笉鏄漿鎹㈡垚 &pB +bx
棰濆鐨勯棿鎺ユт細闄嶄綆鈥滄妸鎵鏈夋搷浣滈兘鎼Щ鍒扮紦瀛樺櫒涓墽琛屸濅紭鍖栬兘鍔涳紝涔熷氨鏄檷浣庝簡灞閮ㄦ
--浜嗚В緙栬瘧鍣ㄥ湪鏋勯犲璞℃椂鑳岀潃鎴戜滑騫蹭簡浠涔堝嬀褰?/font>
Default Ctor 鍦ㄩ渶瑕佺殑鏃跺欒鏋勫緩鍑烘潵~
浠涔堥渶瑕? 鏄紪璇戝櫒闇瑕佽屼笉鏄▼搴忕殑闇瑕?鎵浠ヤ笉瑕佹湡鏈涚紪璇戝櫒鐢熸垚鐨凜tor浼氬府鎴戜滑鎶婃垜浠殑鎴愬憳鍙橀噺鍒濆鍖栦負闆躲傞偅鏄▼搴忕殑闇瑕侊紝涔熷氨鏄垜浠▼搴忓憳鐨勪換鍔÷仿仿仿?/font>
渚嬪錛?/font>
class Foo(public:int val;);
void foo_bar(){Foo bar; if(bar.val)dosth;} 涓嶈鏈熸湜緙栬瘧鍣ㄥ府鎴戜滑鍒濆鍖栧畠涓?銆傚彧鏈塯lobal鍙橀噺浼氬垵濮嬪寲涓?錛屽垵濮嬪寲val榪欐牱鐨勫彉閲忛渶瑕佹垜浠嚜宸卞啓浠g爜鐨剘~
Default Ctor鍒嗕負trival錛堟病鐢ㄧ殑錛夊拰non-trival鐨勶紝涓嬮潰璁ㄨ浠涔堟椂鍊欑紪璇戝櫒闇瑕乧tor 涔熷氨鏄湁鐢ㄧ殑ctor錛岃繖鏃跺欏鏋滄垜浠病鏈夋彁渚涗竴涓粯璁ょ殑default ctor 瀹冧細甯垜浠悎鎴愪竴涓殑~~
1.甯︽湁Default Ctor 鐨刴ember class object
寰堝ソ鐞嗚В錛屾棦鐒跺唴閮ㄦ垚鍛樺惈鏈塪efault ctor 閭d箞鎴戜滑鍒涘緩鏂扮殑瀵硅薄鏃墮渶瑕佽皟鐢ㄥ畠錛岃屾垜浠茍鏈ㄦ湁璋冪敤瀹冪殑鍑芥暟錛岀紪璇戝櫒鑷劧浼氬府鎴戜滑鎻愪緵涓涓傚鏋滄垜浠彁渚涗簡default ctor 錛岄偅涔堢紪璇戝櫒浼氬湪鎴戜滑鎻愪緵鐨勫嚱鏁板姞鍏ヨ皟鐢ㄥ繀欏昏皟鐢ㄧ殑member class 鐨刣efault ctor銆傚悓鏍風殑鍦ㄦ瘡涓涓猚tor閲岄潰閮藉皢鍦ㄧ敤鎴峰啓鐨勪唬鐮佷箣鍓嶈皟鐢ㄩ渶瑕佽皟鐢ㄧ殑default ctor -------鐪嬩緥瀛愶細
class Dopey();class Sneezy{public:Sneezy(int val);Sneezy();};class Bashful{public:BashFul();};
class Snow_white{public: Dopey dopey;Sneezy sneezy;Bashful bashful;private:int muble};
濡傛灉Snow_white娌℃湁瀹氫箟default ctor 閭d箞緙栬瘧鍣ㄤ細鍒涘緩涓涓紝騫跺湪鍏朵腑渚濈収澹版槑欏哄簭渚濇璋冪敤dopey sneezy bashful鐨刣efault ctor 鐒惰屽鏋滐細
Snow_white::Snow_white():sneezy(1024){muble=2045;}
緙栬瘧鍣ㄤ細鎵╁紶涓?/font>
Snow_white::Snow_white():sneezy(1024){
dopey.Dopey::Dopey();
sneezy.Sneezy::Sneezy(1024);
bashful.Bashful::Bashful();
///////// explicit user code
muble = 2048;
}
2.媧劇敓鑷甫鏈塂efault ctor 鐨?base class
鍚屾牱閬撶悊濡傛灉鐖剁被鏈塂efault ctor 瀛愮被褰撶劧瑕佽皟鐢紝緙栬瘧鍣ㄤ細涓烘兂涓婇潰涓鏍蜂負鎴戜滑鍔犱笂
3.鍚湁virtual functions鐨凜lass
鍒涘緩object 鏃跺欓渶瑕乧tor 鏉ヨ緗ソvptr
4.甯︽湁virtual base class
virtual base 瀹炵幇鏂規硶鍚勬湁涓嶅悓錛岀劧鑰屽叡鍚岀偣鏄繀欏繪槸virtual base class 鍦ㄥ叾姣忎竴涓猟erived class涓殑浣嶇疆鑳藉涓庢墽琛屾湡鍑嗗濡ュ綋
X A B C 鑿卞艦緇ф壙
void foo(const A*pa){pa->i=1024;}
foo(new A);foo(new C);
鐭ラ亾pa 鍚?i鍦ㄥ璞′腑鐨勪綅緗茍涓嶆槸鍥哄畾鐨勶紝鑰屾槸鍦ㄨ繍琛屾椂鐪熸紜畾pa鎸囧悜浠涔堝璞榪樻槸C鎵嶈兘紜畾鐨勶紝鍥犳闇瑕佽瀹氫竴涓寚鍚戝熀綾籹ubobject鐨勬寚閽堬紝鎵浠ラ渶瑕乧tor宸ヤ綔浜?/font>
OK:
1.浠諱綍class 濡傛灉娌℃湁瀹氫箟Default ctor 灝變細琚悎鎴愪竴涓?/font>
2.鍚堟垚鍑烘潵鐨凞efault ctor 浼氭槑紜瀹氭瘡涓涓猟ata member鍊?/font>
閿欑殑寰坋asy浜唦
-------------------------------------------------------------------------------
鍐嶆潵鐪?Copy Ctor錛?/font>
copy ctor 璐熻矗鐢ㄥ彟涓涓璞″垵濮嬪寲涓涓璞?/font>
operator = 璐熻矗鐢ㄥ彟涓涓璞$粰涓涓璞¤祴鍊?/font>
鐩存帴璧嬪兼椂錛屼紶鍙傛椂錛岃繑鍥炴椂鍙兘璋冪敤Copy ctor
Default member initialization~~~
涔熷氨鏄痬emberwise 鐨刬nitialization
浠栦細鎶婃瘡涓涓猟ata member 錛堝唴寤虹殑鎴栬呮淳鐢熺殑錛変粠涓涓猳bject 鎷瘋礉鍒板彟涓涓猳bject涓幓
濡傛灉object鍏佽bitwise鐨勬嫹璐濋偅涔堢紪璇戝櫒灝變笉鐢ㄧ敓鎴愪竴涓猲ontrival鐨刣efault copy ctor
浠涔堟椂鍊欎笉鍙互鍛
1 鍐呭惈涓涓猰ember object 鑰屽悗鑰呭惈鏈塩opy constructor (澹版槑鎴栬呭悎鎴愮殑)
2 緇ф壙涓涓猙ase class 鍚庤呮湁copy ctor
3 鍚湁virtual func
4 媧劇敓鑷竴涓戶鎵塊摼錛屽叾涓湁virtual base class
1鍜? 涓紪璇戝櫒浼氭妸member 鎴栬卋aseclass copy ctor 璋冪敤瀹夋彃鍦ㄥ悎鎴愮殑copy ctor 涓?/font>
3 涓細
濡傛灉涓や釜鍚屾牱綾誨瀷鐨刼bject璧嬪兼椂錛屾病鏈夐棶棰樺洜涓轟粬浠殑vptr鐩稿悓
浣嗘槸鑰冭檻瀛愮被璧嬪肩粰鐖剁被錛屾鏃秜ptr闇瑕佹洿鏀癸紝閭d箞姝ゆ椂涓嶅叿鏈塨itwise鐗規э紝鍥犳闇瑕佺紪璇戝櫒鏉ュ姞鍏ヨ鍙ユ紜洿鏂皏ptr
4涓細
姣忎釜緙栬瘧鍣ㄩ兘鎵胯蹇呴』璁ヾerived class 涓殑virtual base class object 鍦ㄦ墽琛屾湡闂村噯澶囧Ε褰擄紝緇存姢浣嶇疆瀹屾暣鎬ф槸緙栬瘧鍣ㄧ殑璐d換銆俠itwise copy 鏈夊彲鑳戒細鐮村潖榪欎釜浣嶇疆鎵浠ョ紪璇戝櫒闇瑕佸湪鑷繁鍚堟垚鐨刢opy ctor 涓綔鍑轟徊瑁?/font>
鍚屾牱闂鍙戠敓鍦ㄧ戶鎵夸綋緋諱腑瀛愮被鍚戠埗綾昏祴鍊兼椂錛岀敱浜庡璞℃ā鍨嬮棶棰橈紝鐩存帴bitwise澶嶅埗鍙兘浼氬鑷碽ase class object 鐨勭牬鍧忥紙鍚庨潰绔犺妭浼氭湁璁ㄨ錛?/font>
--------------------------------------------------------------------------------
紼嬪簭杞寲璇箟瀛?
X x0;
void foo(){X x1(x0); X x2=x0; X x3=X(x0);}
杞寲錛氶噸鍐欏畾涔夛紝鍒濆鍖栨搷浣滀細琚墺闄?nbsp; copy constructor 璋冪敤浼氳瀹夋彃
void foo(){ X x1;X x2; X x3; x1.X::X(x0); x2.X::X(x0); x3.X::X(x0);}
鍙傛暟鐨勫垵濮嬪寲錛?/font>
涓縐嶇瓥鐣ュ鍏ユ殏鏃剁殑object
void foo(X x0);X xx; foo(xx);
杞寲錛?/font>
X _tmp;
_tmp.X::X(x0); foo(_tmp);
foo鍙樻垚 void foo(X& x0);
鍙︿竴縐嶆槸鎷瘋礉鏋勫緩錛?/font>
鎶婂疄闄呭弬鏁扮洿鎺ュ緩鏋勯犲簲璇ュ湪鐨勪綅緗笂錛屽嚱鏁拌繑鍥炴椂灞閮ㄥ璞$殑destructor 浼氭墽琛?/font>
涔熷氨鏄鎶妜0寤烘瀯鍦╢oo 鐨勫嚱鏁版墽琛岀殑鍦版柟
榪斿洖鍊肩殑鍒濆鍖栵細
X bar(){
X xx;
return xx;
}
榪斿洖鍊煎浣曚粠灞閮ㄥ璞x鎷瘋礉鑰屾潵鍛紵
涓縐嶆柟娉曪細1.鍔犱笂棰濆鍙傛暟錛岀被鍨嬫槸class object鐨剅eference錛岃繖涓弬鏁扮敤鏉ユ斁緗鎷瘋礉寤烘瀯鐨勮繑鍥炲?錛堟敞鎰忔嫹璐濆緩鏋勪篃灝辨槸璇翠粬琚斁鍦ㄥ簲璇ュ湪鐨勪綅緗紝涔熷氨鏄涓嶆槸灞閮ㄥ彉閲忎簡錛?/font>
2.return 鎸囦護涔嬪墠瀹夋彃涓涓猚opy constructor 璋冪敤鎿嶄綔 錛屼互渚垮皢浼犲洖鐨刼bject 鍐呭褰撳仛涓婅堪鍙傛暟鐨勫垵鍊?/font>
so 涓婇潰鐨勭▼搴忓彉鎴愪簡錛?/font>
void bar(X& _result){
X xx;
xx.X::X(); //緙栬瘧鍣ㄤ駭鐢熺殑default ctor 璋冪敤
_result.X::X(xx);//緙栬瘧鍣ㄤ駭鐢熺殑copy ctor 璋冪敤
return ;
}
鐜板湪緙栬瘧鍣ㄥ繀欏昏漿鎹ar鐨勮皟鐢ㄦ搷浣?X xx=bar();杞崲鎴?X xx; bar(xx); // 娉ㄦ剰涓嶇敤copy ctor浜嗙洿鎺ユ搷浣滃湪xx涓婁簡 濡傛灉緙栬瘧鍣ㄥ仛浜嗕紭鍖?榪欏氨鏄痭amed return value 浼樺寲
鑰岋細
bar.memfunc();//bar()浼犲洖鐨刋 璋冪敤鎴愬憳鍑芥暟
鍙樻垚錛?/font>
X _tmp; (bar(_tmp),_tmp).memfunc();
鍚屾牱閬撶悊鍑芥暟鎸囬拡 X(*pf)(); 鍙樻垚 void (*pf)(X&);
浣跨敤鑰呯殑浼樺寲:
X bar(const T& y,const T& z){
X xx;
閫氳繃 y z 璁$畻xx
return xx;
}
榪欑鎯呭喌涓嬭iuxx琚玬emberwise鎷瘋礉鍒扮紪璇戝櫒浜х敓鐨刜result涓紝
濡傛灉瀹氫箟 ctor鏉ュ埄鐢▂z璁$畻xx鍒欙細
X bar(const T& y,const T& z){
return X(y,z);
}
鍙樻垚錛?/font>
bar(X& result){
result . X::X(y,z);
return;
}
鏃犻渶copy ctor浜?/font>
緙栬瘧鍣ㄧ殑浼樺寲錛?/font>
濡備笂鎵榪癰ar涓繑鍥炰簡鍏峰悕鏁板?named value錛屽洜姝ょ紪璇戝櫒鏈夊彲鑳借嚜宸變紭鍖栵紝鏂規硶鏄互result鍙栦唬named return value
bar(X& result){_result.X::X(); 鐩存帴澶勭悊result 騫朵笉澶勭悊鍙橀噺xx鐒跺悗澶嶅埗緇檙esult 榪欐牱灝變紭鍖栦簡}
榪欎釜浼樺寲鐨勬縺媧婚渶瑕乧lass鎻愪緵涓涓猚opy ctor~~~~~~
Copy ctor 瑕佷笉瑕?
濡傛灉涓涓猚lass 絎﹀悎bitwise鐨勮姹傞偅涔堟鏃秏ember wise 鐨勬嫹璐濆凡緇忛珮鏁堢畝媧?鏃犻渶鍔犲叆浜?/font>
浣嗘槸濡傛灉class闇瑕佸ぇ閲忕殑member wise 鍒濆鍖栨搷浣滐紝濡傜敤浼犲兼柟寮忚繑鍥瀘bjects錛屽鏋滄槸榪欐牱鎻愪緵涓涓猚opy ctor 鍙互嬋媧籲RV named return value 浼樺寲錛岃繖灝卞緢鍚堢悊浜?/font>
鎴愬憳浠殑鍒濆鍖栬繃紼嬶細
浠涔堟椂鍊欏繀欏葷敤鍒濆鍖栧垪琛細
1.鍒濆鍖栦竴涓猺eference鏃?2.鍒濆鍖栦竴涓猚onst member 3.璋冪敤鐖剁被ctor鑰屼笖鏈夊弬鏁版椂4璋冪敤member class ctor 鏈夊弬鏁?
鍏朵粬鎯呭喌鍛細
class word{string name;int cnt;public: name=0;cnt=0;}
緙栬瘧鍣ㄥ彲鑳借繖涔堝仛:
word::word{
name.String::string();璋冪敤string鐨刣efault ctor
string tmp=string(0);
_name.string::operator=(tmp);
tmp.string::~string();
cnt=0;
}
鏄劇劧name鏀懼埌鍒濆鍖栧垪琛ㄤ細鏇存湁鏁堢巼 錛屼細鍙樻垚
name.String::String(0);
鑰宑nt榪欑鍐呭緩綾誨瀷鍒欐病鏈夊叧緋伙紝鏀句笉鏀懼埌鍒濆鍖栧垪琛ㄦ病鏈夋晥鐜囦笂鐨勫樊鍒?/font>
鍒濆鍖栧垪琛ㄧ┒绔熻緙栬瘧鍣ㄥ仛浜嗕粈涔堬紵錛燂紵錛?/font>
緙栬瘧鍣ㄤ細涓涓釜鎿嶄綔list涓殑寮忓瓙錛屼互閫傚綋嬈″簭鍦╟tor鍐呭畨鎻掑垵濮嬪寲鎿嶄綔鍦ㄤ換浣昬xplicit user code 涔嬪墠銆?/font>
娉ㄦ剰鐨勫湴鏂癸細
list涓殑嬈″簭鏄寜鐓embers澹版槑嬈″簭鍐沖畾鑰屼笉鏄痩ist 涓殑鎺掑垪欏哄簭鍐沖畾銆?/font>
渚嬪錛歝lass x{int i;int j; X(int val):j(val),i(j)}
閿欎簡 i鍏堝0鏄庡垯i棣栧厛璧嬩簣val 鐒跺悗鐢ㄦ湭鍒濆鍖栫殑j璧嬬粰i銆傘傘?/font>
鍙互榪欐牱X::X(int val):j(val){i=j;}
鐢變簬浼氬畨鎻掑湪explicit code 涔嬪墠 鎵浠ユ病闂 浼氬彉鎴?j=val; i=j;
鍙惁鐢╩ember functions 鍒濆鍖栨垚鍛橈紵錛?/font>
絳旀鏄彲浠ョ殑錛屽洜涓哄拰objects鐩稿叧鐨則his鎸囬拡宸茬粡鏋勫緩濡ュ綋錛屽彧鏄娉ㄦ剰鍑芥暟璋冪敤鐨刴ember鏄惁宸茬粡鏋勫緩濡ュ綋浜嗗嵆鍙?/font>
------ - - - ---------- -- --鐤叉儷鐨勭粨鏉熺嚎- - - - - -- - -----
name return value TEST:
~~~~1 cl /od 涓嶅紑浼樺寲
#include <iostream>
using namespace std;
class RVO
{
public:
RVO(){printf("I am in constructor\n");}
RVO (const RVO& c_RVO) {printf ("I am in copy constructor\n");}
~RVO(){printf ("I am in destructor\n");}
int mem_var;
};
RVO MyMethod (int i)
{
RVO rvo1;
rvo1.mem_var = i;
return (rvo1);
}
int main()
{
RVO rvo;rvo=MyMethod(5);
}
杈撳嚭錛?
I am in constructor //rvo 鍒涘緩
I am in constructor // rvo1鍒涘緩
I am in copy constructor // rvo1璧嬪肩粰hiddern
I am in destructor // rvo1瑙f瀯
I am in destructor // hiddern瑙f瀯
I am in destructor // rvo 瑙f瀯
A MyMethod (A &_hiddenArg, B &var)
{
A retVal;
retVal.A::A(); // constructor for retVal
retVal.member = var.value + bar(var);
_hiddenArg.A::A(retVal); // the copy constructor for A
return;
retVal.A::~A(); // destructor for retVal
}A MyMethod(A &_hiddenArg, B &var)
{
_hiddenArg.A::A();
_hiddenArg.member = var.value + bar(var);
Return
}~~~~2 cl /o2 浠g爜鍚屼笂
output
I am in constructor //rvo鍒涘緩
I am in constructor //hiddern 鍒涘緩
I am in destructor //hiddern 瑙f瀯
I am in destructor //rvo瑙f瀯
鎴戜笉鏄庣櫧鐨勬槸hiddern 鎬庝箞浼犵粰rvo 錛屾垜鐚滃彲鑳芥槸緙栬瘧鍣ㄦ寜鐓itwise鐨勫鍒舵柟寮忚繘琛岀殑,姝ゆ椂緙栬瘧鍣ㄥ茍娌℃湁鐩存帴寤烘瀯緇撴灉浜巖vo涓?/strike> 錛岀湅鐪嬩笅闈㈢殑璇曢獙錛?/font>
娉細鏄庣櫧浜嗭紝 緇撴灉鐩存帴寤烘瀯鍦╤iddern錛岀劧鍚庨氳繃operator = 浼犵粰rvo 銆傛病鏈塩opy ctor鍥犱負鎷瘋礉鏋勯犲嚱鏁版槸璐熻矗鍒濆鍖栫殑錛岃宱perator = 鎵嶆槸鐢ㄦ潵璧嬪肩殑.
緇忚繃浠g爜璇佹槑鏄鐨勶紝濡傛灉閲嶈澆璧嬪艱繍綆楃 杈撳嚭鍙樻垚錛?/font>
I am in constructor //rvo鍒涘緩
I am in constructor //hiddern 鍒涘緩
I am in operator = //璧嬪兼搷浣渵~
I am in destructor //hiddern 瑙f瀯
I am in destructor //rvo瑙f瀯
~~~~3 cl /od
#include <iostream>
using namespace std;
class RVO
{
public:
RVO(){printf("I am in constructor\n");}
RVO (const RVO& c_RVO) {printf ("I am in copy constructor\n");}
~RVO(){printf ("I am in destructor\n");}
int mem_var;
};
RVO MyMethod (int i)
{
RVO rvo1;
rvo1.mem_var = i;
return (rvo1);
}
void abc(RVO& i){
}
int main()
{
RVO rvo=MyMethod(5); //姝ゆ椂瀹氫箟鍜岃祴鍊兼斁鍒頒簡涓涓〃杈懼紡瀛?br> return 0;
}
output:
I am in constructor // rvo1 鍒涘緩 娉ㄦ剰 璺熶笂闈㈢殑絎竴縐嶆儏鍐典笅鐨刪iddern涓鏍?rvo騫舵病鏈夎皟鐢╟tor
I am in copy constructor // rvo1 鎷瘋礉鏋勯犵粰rvo 姝ゆ椂娌℃湁hiddern浜?鐩存帴鏋勫緩rvo浜?br>I am in destructor // rvo1 鏋愭瀯
I am in destructor // rvo1 瑙f瀯
~~~~3 cl /o2 鍐嶆潵~~~~ NRV鍑洪┈
I am in constructor // rvo鏋勫緩浜?nbsp;
I am in destructor // rvo鏋愭瀯浜?/font>姝ゆ椂 mymethod涓殑涓鍒囬兘鐩存帴鍙嶆槧鍦╮vo韜笂
ok~~~~~4涓唬鐮佸畬鍏ㄤ竴鏍鋒瀯閫犳瀽鏋勬嫹璐濆嚱鏁頒釜鏁扮敱2-6涓嶇瓑~~~over~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
絎旇褰撳仛鐨勭簿鐐艱屾湁鎰忎箟錛岃屽悗鍥為【鍙煡鍏舵剰錛屽洖鍏跺懗錛屾柟鏈夋垚鏁?/font>
---------------------------------------------------------------------------------
C璇█錛氭暟鎹拰鎿嶇旱鏁版嵁鐨勬柟娉曞垎寮澹版槑,鏂規硶琚啓鎴愬嚱鏁板鐞嗗閮ㄦ暟鎹?/font>
C++:鏁版嵁鍜屾柟娉曠殑緇勫悎灝佽ADT 鏇村畨鍏?鏀寔緇ф壙 娓呮櫚
灝佽鍦ㄧ┖闂翠笂鐨勪唬浠鳳細
濡傛灉浠呬粎鏄櫘閫氱戶鎵垮垯騫舵病鏈変粈涔堜唬浠鳳紝鍥犱負姣忎釜鏁版嵁鎴愬憳鐩存帴鍐呮兜鍦ㄦ瘡涓涓猚lass瀵硅薄涓紝鍜宑涓殑struct涓鏍鳳紝鑰宮ember function濡傛灉涓嶆槸inline鐨勫垯鍙細浜х敓涓涓疄浣擄紝鑰宨nline浼氬湪姣忎竴涓嬌鐢ㄧ殑妯″潡浜х敓涓涓嚱鏁板疄浣?/font>
c++鍦ㄧ┖闂村拰瀛樺彇鏁堢巼鐨勪唬浠蜂富瑕佺敱virtual甯︽潵錛?/font>
virtual function 鏈哄埗錛?vtable vptr 鎵ц鏈熺粦瀹?/font>
virtual class 鏈哄埗錛?/font>
榪樻湁澶氶噸緇ф壙涓嬬殑棰濆璐熸媴錛堝瓙綾昏漿鎹㈡垚絎簩涓埗綾葷殑鏃跺欙級
----------------------------------------------------------------------
c++瀵硅薄妯″瀷錛氫篃灝辨槸鎴戜滑鎬庝箞鍦ㄥ唴瀛樹腑瀹夋帓鍚勪釜鏁版嵁鎴愬憳浠ュ強鎴愬憳鍑芥暟
1.綆鍗曞璞℃ā鍨媬 瀵硅薄鐢卞悇涓猻lot緇勬垚錛屾瘡涓涓猻lot鍖呭惈鎸囬拡錛屾寚鍚戝悇涓垚鍛?/font>
2.琛ㄦ牸椹卞姩妯″瀷~ 瀵硅薄鍚湁涓や釜鎸囬拡錛屼竴涓寚鍚戞垚鍛樻暟鎹〃錛屽彟涓涓寚鍚戞垚鍛樺嚱鏁拌〃
3.c++瀹為檯瀵硅薄妯″瀷~ 闈為潤鎬佹暟鎹鏀懼湪瀵硅薄鍐咃紝鑰岄潤鎬佹暟鎹垚鍛樻斁鍦ㄥ璞″錛堟樉鐒跺晩錛屼粬灞炰簬綾伙級錛屾垚鍛樺嚱鏁?/font>
涓嶇闈欐佹垨鑰呴潪闈欐侀兘鏀懼湪瀵硅薄澶栭潰
Virtual functions 錛氭瘡涓猚lass浜х敓涓鍫嗘寚鍚憊itrualfunctions鐨勬寚閽堬紝鏀懼湪vtables涓紝姣忎釜瀵硅薄
鍚湁vptr 鎸囧悜vtable vptr鐨勮瀹氾紝閲嶇疆鍧囨湁class鐨刢tor錛宒tor錛宑opy assignment 榪愮畻絎﹁嚜鍔ㄥ畬鎴?/font>
浼樼偣錛氱┖闂村拰瀛樺偍鏁堢巼 緙虹偣錛氬鏋滃璞℃ā鍨嬬殑nonstatic data members 鏈夋墍淇敼錛屼篃灝辨槸瀵硅薄鍐呴儴甯冨眬鏈夋墍鏇存敼錛岄偅涔堜嬌鐢ㄨ瀵硅薄鐨勫簲鐢ㄧ▼搴忛渶瑕侀噸鏂扮紪璇?
铏氭嫙緇ф壙錛氫笉綆″熀綾昏媧劇敓浜嗗灝戞錛屾案榪滃彧鏈変竴涓疄浣擄紙鑿卞艦緇ф壙鏈涓嬮潰瀵硅薄涓彧鏈変竴涓《閮ㄧ被瀹炰綋錛?/font>
緇ф壙鐨勫疄鐜幫細涓縐嶅彲浠ョ敤basetable 鍦╞asetable涓寚鍚戜竴涓猙aseclass鐨勫湴鍧錛屼絾榪欎細闅忕潃緇ф壙娣卞害瓚婃潵瓚婃繁鍙樺緱鎱?/font>
鐜板湪閲囩敤鐨勬柟娉曚箣鍚庤褰晘~~ 錛歅
涔︿腑鐨勭▼搴忥細瀵硅薄妯″瀷瀵圭▼搴忕殑褰卞搷錛?/font>
X foobar(){
X xx;
X *px = new X;
xx.foo();
px->foo(); //foo鏄竴涓獀irtual function
delete px;
return xx;
}
//璋冪敤澶?X _result;
// foobar(_result);
void foobar(X& _result){
_result.X::X();//鏋勯爎esult
px = _new(sizeof(X));
if(px!=0)
px->X::X;
foo(&_result);//浣跨敤result鍙栦唬xx浣嗘槸涓嶆縺媧籿irtual鏈哄埗
(*px->vtbl[2])(px);//浣跨敤virtual鏈哄埗鎵╁睍px->foo();
if(px!=0){
(*px->vtbl[1])(px);//浣跨敤virtual璋冪敤destructor
delete px;
}
//涓嶇敤浣跨敤named return statement
return ;
}
------------------------------------------------------------------------------------
鍏抽敭璇嶅甫鏉ョ殑楹葷儲~~
struct 鍜?class 鍦–++涓彲浠ユ販鐢紝騫朵笉鏄敱浜庝嬌鐢ㄥ摢涓涓喅瀹氬叾鐗規э紝鍙槸緇欎漢鐨勬劅瑙変笉鍚岀艦浜哻lass鏇村儚鏄痗++涓戶鎵跨殑浠e悕璇?struct鏇村儚C涓殑鏁版嵁闆?/font>
濡傛灉闇瑕佸悜C鍑芥暟浼犻掓暟鎹泦鍚堝彲浠ヤ嬌鐢╯truct浠ヤ繚璇佸璞℃ā鍨嬬殑鏀寔
浣跨敤struct瀹屽叏鍙互澹版槑鍚勭class鐨勭壒鎬?/font>
瀵硅薄鐨勫樊寮?/font>
1.紼嬪簭妯″瀷procedural model 鍚宑涓鏍?/font>
2.鎶借薄鏁版嵁綾誨瀷妯″瀷 ADT object-base 鎶借薄鎸囩殑鏄竴鏃忚〃杈懼紡錛坧ublic鎺ュ彛錛夌殑鎻愪緵錛屽叿浣撹綆楁柟娉曟湭鏄?/font>
3.闈㈠悜瀵硅薄 oo 鏈変竴浜涘郊姝ょ浉鍏崇殑妯″瀷閫氳繃涓涓娊璞$殑baseclass鐢ㄤ互鎻愪緵鍏叡鎺ュ彛灝佽璧鋒潵
OO涓▼搴忓憳鍙兘闇瑕佸鐞嗕竴涓湭鐭ュ疄浣擄紝鍦ㄦ墽琛岀偣涔嬪墠鏃犳硶紜畾錛岃繖鏄敱pointers鍜宺eference瀹炵幇鐨勮屽湪ADT涓▼搴忓憳澶勭悊鐨勬槸涓涓嫢鏈夊浐瀹氬崟涓綾誨瀷鐨勫疄浣擄紝緙栬瘧鏃舵湡灝卞凡緇忕‘瀹氫簡~
c++涓殑澶氭侊細1.鎶奷erived class鐨勬寚閽堣漿鍖栨垚涓涓熀綾葷殑鎸囬拡 2virtualfunctions 3.dynamic_cast 鍜宼ypeid榪愮畻絎?/font>
澶氭佷富瑕佹槸緇忕敱涓涓叡鍚岀殑鎺ュ彛鏉ュ獎鍝嶇被鍨嬬殑灝佽錛岃繖涓帴鍙i氬父琚斁緗湪鎶借薄鐨刡aseclass涓紝榪欎釜鍏變韓鎺ュ彛鏄互virtual functions鏈哄埗鏉ュ紩鍙戠殑錛屽彲浠ュ湪鎵ц鏈熼棿鏍規嵁object鐨勭湡姝g被鍨嬭В鏋愬嚭鍒板簳鏄摢涓涓嚱鏁板疄浣撹璋冪敤銆?/font>
鎴戜滑鐨勪唬鐮佸彲浠ラ伩鍏嶇敱浜庡鍔犳煇涓涓壒瀹氱殑derived 瀹炰綋鑰屾敼鍙橈紝鍙渶瑕佹柊鐨刣erivedclass閲嶅啓榪欐牱鐨勬帴鍙d究鍙?/font>
//嫻嬭瘯鎸囬拡寮曠敤鐨勫鎬?br>#include <iostream>
using namespace std;
struct Point{
public:
Point(float x=0.):_x(x){}
float x(){return _x;}
void x(float xval){_x=xval;}
virtual void out(){
cout<<"I am a Point"<<endl;
}
protected:
float _x;
};
struct Point2d:public Point{
public:
Point2d(float x=0.,float y=0.):Point(x),_y(y){}
float y(){return _y;}
void y(float yval){_y=yval;}
virtual void out(){
cout<<"I am a Point2d"<<endl;
}
protected:
float _y;
};
int main(){
Point pt;
Point2d pt2;
Point* ptr;
Point2d* ptr2;
pt.out(); pt2.out();
pt=pt2;pt.out();
ptr=&pt2;
ptr->out();
(*ptr).out();
Point& ptref=pt2;
ptref.out();
}
output:
I am a Point
I am a Point2d
I am a Point
I am a Point2d
I am a Point2d
I am a Point2d
鎸囬拡鍜屽紩鐢ㄥ彲浠ュ疄鐜板鎬侊紝鍥犱負鎸囬拡鍜屽紩鐢ㄧ殑璧嬪煎彧鏄敼鍙樺叾鎸囧悜鐨勮寖鍥達紝騫舵病鏈夎Е鍙婂璞℃ā鍨嬬殑鏀瑰彉錛屽洜姝ゅ彲浠ヤ駭鐢熷鎬佺殑鏁堟灉銆傝寁alue鐨勮祴鍊兼搷浣滀細瀵艱嚧瀵硅薄妯″瀷鐨勫垏鍓詫紝浠庤岀湡瀹炵殑鏀瑰彉浜嗗璞$殑鍐呴儴妯″瀷涓庣被鍨嬶紝澶卞幓浜嗗鎬佺殑鏁堟灉銆俹o 涓嶆敮鎸佸瀵硅薄鐨勭洿鎺ュ鐞?/font>
鎸囬拡鐨勭被鍨嬶細
涓嶅悓鐨勬寚閽堜粠鍐呭瓨瑙掑害鏉ョ湅娌′粈涔堜笉鍚岋紝鍙槸鍗犳嵁浜嗕竴涓獁ord鐨勭┖闂達紝浣嗘槸鎸囬拡鐨勭被鍨嬩細鍛婅瘔緙栬瘧鍣ㄥ浣曡В閲婃煇涓壒瀹氬湴鍧涓殑鍐呭瓨鍐呭浠ュ強澶у皬
OB璁捐涔熷氨鏄疉DT璁捐姣擮O璁劇疆鏇存湁鏁堢巼鍥犱負鍏舵墍鏈夊嚱鏁板紩鍙戞搷浣滃潎鍦ㄧ紪璇戝櫒紜畾OO闇瑕佷竴浜涜繍琛屾椂紜畾錛屽璞℃瀯寤鴻搗鏉ヤ笉闇瑕佽緗畍irtual鏈哄埗
姣擮O绱у噾鍥犱負鏃犻渶鏀寔virtual鏈哄埗浠庤屾病鏈夐澶栬礋鎷?/font>
浣嗘槸OB鐩稿鏉ヨ寮規ц緝灝弤~
······鏉℃16 璁頒綇80-20鍑嗗垯
澶х害20%鐨勪唬鐮佷嬌鐢ㄤ簡80%鐨勮祫婧愶紝紼嬪簭鐨勬暣浣撴ц兘鏄敱璇ョ▼搴忕殑涓灝忛儴鍒嗕唬鐮佹墍鍐沖畾鐨剘
鍙鐨勫姙娉曟槸浣跨敤紼嬪簭鍒嗘瀽鍣紙profiler錛夋潵鎵懼埌瀵艱嚧鎬ц兘鐡墮鐨勬嬁20%鐨勭▼搴弤
鑰屼笖瑕侀拡瀵歸犳垚鐡墮鐨勮祫婧愭潵浣跨敤鐩稿簲鐨勫垎鏋愬櫒~
······鏉℃17 鑰冭檻浣跨敤寤惰繜璁$畻
寤惰繜璁$畻錛?涔熷氨鏄鐭ラ亾紼嬪簭瑕佹眰緇欏嚭緇撴灉鐨勬椂鍊欐墠榪涜榪愮畻~ 寰堝ソ鐞嗚В錛屽拰鎿嶄綔緋葷粺涓殑cow copy on write 涓涓師鐞唦
鍥涗釜浣跨敤鍦烘櫙錛?/font>
~1~ 寮曠敤璁℃暟 錛?/font>
銆銆class String{…};
String s1 = “hello”;
String s2 = s1 ; //call string Copy ctor
閫氬父鎯呭喌涓嬶紝s2璧嬪煎悗浼氭湁涓涓猦ello鐨勬嫹璐濓紝鑰呴氬父闇瑕佷嬌鐢╪ew鎿嶄綔絎﹀垎閰嶅唴瀛橈紝涔嬪悗strcpys1
鐨勬暟鎹粰浠栵紝浣嗗鏋滀笅闈㈢殑鎿嶄綔濡備笅鐨勮瘽錛?/font>
cout << s1 ;
cout << s1 + s2;
榪欑鎯呭喌涓嬪鏋滃彧澧炲姞s1鐨勫紩鐢ㄨ鏁幫紝鑰宻2鍙槸鍏變韓s1鐨勫煎氨鍙互浜嗐傚彧鏈夊湪闇瑕佸s2榪涜淇敼鎴栬卻1榪涜淇敼鏃訛紝鎵嶉渶瑕佺湡姝f嫹璐濈粰s2涓涓壇鏈紝寮曠敤璁℃暟鐨勫疄鐜板湪29鏉℃
~2~鍖哄垎璇誨啓鎿嶄綔
濡傦細 String s = “homer’s all”;
cout<< s[3];
s[3] = ‘x’;
鍦ㄨ繘琛岃鎿嶄綔鏃訛紝浣跨敤寮曠敤璁℃暟鏄紑閿寰堝皬鐨勶紝鐒惰屽啓鎿嶄綔蹇呴』鐢熸垚鏂扮殑鎷瘋礉銆傞氳繃鏉℃30鐨勪唬鐞嗙被鎴戜滑鍙互鎶婂垽鏂鍐欐搷浣滄帹榪熷埌鎴戜滑鑳藉鍐沖畾鍝釜鏄紜搷浣滅殑鏃跺?/font>
~3~寤惰繜璇誨彇
鍋囪紼嬪簭浣跨敤浜嗗寘鍚澶氭暟鎹垚鍛樼殑澶у璞★紝榪欎簺瀵硅薄蹇呴』鍦ㄦ瘡嬈$▼搴忚繍琛岀殑鏃跺欎繚鐣欎笅鏉ワ紝鍥犳瀛樿繘浜嗘暟鎹簱銆傛煇浜涙椂鍊欎粠database涓彇鍑烘墍鏈夋暟鎹槸娌℃湁蹇呰鐨勶紝姣斿浠栧彧璁塊棶璇ュ璞′腑鐨勪竴涓暟鎹垚鍛樸傛鏃訛紝搴旇瀵瑰璞¤繘琛屽鐞嗭紝鍙湁瀵硅薄鍐呴儴鏌愪竴涓壒瀹氱殑鏁版嵁鎴愬憳琚闂殑鏃跺欐墠鎶婁粬鍙栧嚭鏉ャ傜被浼間簬os涓殑鎸夐渶鎹㈤〉~
class LargeObject{
LargeObject(ObjectID id);
const string& field1() const;
int field2() const;
double field3() const;
const string& field4() const;
private:
ObjectID id;
mutable string* field1value;
mutable int * fieldValue;
};
LargeObject::LargeObject(ObjectID id):oid(id),fieldValue(0),…{}
const string& LargeObject::field1()const{
if(fieldValue == 0){
//read the data for field 1 from database and make field1 point to it
}
return *field1Value;
}
瀹炴柦lazy fetching 浠諱綍鎴愬憳鍑芥暟閮介渶瑕佸垵濮嬪寲絀烘寚閽堜互鎸囧悜鏈夋晥鏁版嵁銆備絾鏄痗onst鎴愬憳鍑芥暟涓紝璇曞浘淇敼鏁版嵁緙栬瘧鍣ㄤ細鎶ラ敊銆傛墍浠ュ0鏄庡瓧孌墊寚閽堜負 mutable 錛岃〃紺轟換浣曞嚱鏁伴兘鍙互淇敼,鍗充究鍦╟onst鎴愬憳鍑芥暟涓篃鍙互~ 鏉℃28涓殑鏅鴻兘鎸囬拡鍙互璁╄繖涓鏂規硶鏇寸伒媧?/font>
~3~寤惰繜琛ㄨ揪寮忔眰鍊?/font>
鏁板艱綆楅鍩燂紝涔熷湪浣跨敤寤惰繜璁$畻銆備緥濡?/font>
matrix<int> m1(1000,1000);
matrix<int> m2(1000,1000);
matrix<int> m3 = m1 + m2;
濡傛灉姝ゆ椂璁$畻鍑簃3鐨勮瘽榪愮畻閲忛潪甯鎬箣澶
浣嗘槸濡傛灉姝ゆ椂紼嬪簭涓猴細
m3 = m4*m1;
閭d箞鍒氭墠鐨勮綆楀氨娌″繀瑕佷簡
濡傛灉cout<< m3[4];
鎴戜滑鍙渶瑕佽綆梞3[4]灝卞彲浠ヤ簡錛屽叾浠栫殑鍊肩瓑鍒扮‘瀹為渶瑕佷粬浠殑鏃跺欐墠浜堜互璁$畻~濡傛灉榪愭皵澶熷ソ鐨勮瘽姘歌繙涓嶉渶瑕佽綆梸
鎬葷粨錛屽歡榪熻綆楀彧鏈夊綋杞歡鍦ㄦ煇縐嶇▼搴︿笅鍙互琚伩鍏嶆椂鍊欐墠鏈夋剰涔墌鍙湁寤惰繜璁$畻寰楀埌鐨勫ソ澶勫ぇ浜庤璁″畠涓庡疄鐜板畠鑺辮垂鐨勭簿鍔涙椂鎵嶆湁鎰忎箟~
·······鏉℃18錛?鍒嗘湡鎽婅繕棰勬湡鐨勮綆楀紑閿
鎻愬墠璁$畻~ over-eager evaluation 鍦ㄧ郴緇熻姹備綘鍋氭煇浜涗簨鎯呬箣鍓嶅氨鍋氫簡浠杶
渚嬪錛氬ぇ閲忔暟鎹殑闆嗗悎
template<class NumericalType>
class DataCollection}{
public:
NumericalType min() const;
NumericalType max() const;
NumericalType avg() const;
};
浣跨敤鎻愬墠璁$畻錛屾垜浠殢鏃惰窡韙洰鍓嶉泦鍚堢殑鏈澶ф渶灝忓鉤鍧囧鹼紝榪欐牱 min max avg琚皟鐢ㄦ椂鍊欙紝鎴戜滑鍙互涓嶇敤璁$畻绔嬪埢榪斿洖姝g‘鐨勬暟鍊紐~
鎻愬墠璁$畻鐨勬濇兂渚挎槸錛氬鏋滈璁℃煇涓綆椾細琚綣佽皟鐢紝浣犲彲浠ラ氳繃璁捐浣犵殑鏁版嵁緇撴瀯浠ユ洿楂樻晥鐨勫姙娉曞鐞嗚姹傦紝榪欐牱鍙互闄嶄綆姣忔璇鋒眰鐨勫鉤鍧囧紑閿~
鏈綆鍗曠殑鍋氭硶涓?緙撳瓨宸茬粡璁$畻榪囧茍涓斿緢鍙兘涓嶉渶瑕侀噸鏂拌綆楃殑閭d簺鍊紐
渚嬪鍦ㄦ暟鎹簱涓瓨鏈夊緢澶氬姙鍏鐨勭數璇濆彿鐮侊紝紼嬪簭鍦ㄦ瘡嬈℃煡璇㈢數璇濇椂鍏堟煡璇㈡湰鍦扮殑緙撳瓨濡傛灉娌℃壘鍒板啀鍘昏闂暟鎹簱錛屽茍涓旀洿鏂扮紦瀛橈紝榪欐牱浣跨敤緙撳瓨騫沖潎璁塊棶鏃墮棿瑕佸ぇ澶у噺灝忋?/font>
棰勫鐞嗕篃鏄竴縐嶇瓥鐣ャ?/font>
渚嬪璁捐鍔ㄦ佹暟緇勭殑鏃跺欙紝褰撶儲寮曚笅鏍囧ぇ浜庡凡鏈夋渶澶ц寖鍥存椂鍊欙紝闇瑕乶ew鍑烘柊鐨勭┖闂達紝濡傛灉鐢寵涓ゅ嶄簬绱㈠紩鐨勫ぇ灝忕殑璇濆氨鍙互閬垮厤棰戠箒鐨勭敵璇鋒搷浣渵~~
········鏉℃ 19 錛?浜嗚В涓存椂瀵硅薄鐨勬潵婧?/font>
濡傛灉涓涓璞¤鍒涘緩錛屼笉鏄湪鍫嗕笂錛屾病鏈夊悕瀛楋紝閭d箞榪欎釜瀵硅薄灝辨槸涓存椂瀵硅薄銆?/font>
閫氬父浜х敓浜庯細 涓轟簡浣垮嚱鏁拌皟鐢ㄨ兘澶熸垚鍔熻岃繘琛岀殑闅愬紡杞崲錛屾垨鑰呭嚱鏁拌繑鍥炲璞℃槸榪涜鐨勯殣寮忚漿鎹€傜敱浜庢瀯閫犲拰鏋愭瀯浠栦滑甯︽潵鐨勫紑閿鍙互緇欎綘鐨勭▼搴忓甫鏉ユ樉钁楃殑褰卞搷錛屽洜姝ゆ湁蹇呰浜嗚В浠栦滑~
~1棣栧厛鑰冭檻涓轟簡鍑芥暟璋冪敤鑳介氳繃浜х敓鐨勪復鏃跺璞$殑鎯呭喌
浼犵粰鏌愪釜鍑芥暟鐨勫璞$殑綾誨瀷鍜岃繖涓嚱鏁版墍緇戝畾鐨勫弬鏁扮被鍨嬩笉涓鑷寸殑鎯呭喌涓嬩細鍑虹幇榪欑鎯呭喌銆?/font>
渚嬪錛?/font>
size_t count(const string& str,char ch);
鍑芥暟瀹氫箟涓鴻綆梥tr涓璫h鐨勬暟閲?/font>
char buffer[100];
cout<<count(buffer,‘c’);
浼犲叆鐨勬槸涓涓猚har鏁扮粍錛屾鏃剁紪璇戝櫒浼氳皟鐢╯tr鐨勬瀯閫犲嚱鏁幫紝鍒╃敤buffer鏉ュ垱寤轟竴涓復鏃跺璞°?/font>
鍦ㄨ皟鐢ㄥ畬countChar璇彞鍚庤繖涓復鏃跺璞″氨琚嚜鍔ㄩ攢姣佷簡~
浠呭綋浼犲兼垨鑰卌onst寮曠敤鐨勬椂鍊欐墠浼氬彂鐢熻繖鏍風殑綾誨瀷杞崲~褰撲紶閫掍竴涓潪甯擱噺寮曠敤鐨勬椂鍊欙紝涓嶄細鍙戠敓銆?/font>
void uppercasify(string& str); //change all chars in str to upper case;
鍦ㄨ繖涓緥瀛愪腑浣跨敤char鏁扮粍灝變笉浼氭垚鍔焴
鍥犱負紼嬪簭浣滆呭0鏄庨潪甯擱噺寮曠敤涔熷氨鏄兂璁╁寮曠敤鐨勪慨鏀瑰弽鏄犲湪浠栧紩鐢ㄧ殑瀵硅薄韜笂錛屼絾鏄鏋滄鏃剁敓鎴愪簡涓存椂瀵硅薄錛岄偅涔堣繖浜涗慨鏀瑰彧鏄綔鐢ㄥ湪涓存椂瀵硅薄韜笂錛屼篃灝變笉鏄綔鑰呯殑鏈剰浜嗐傛墍浠++紱佹闈炲父閲忓紩鐢ㄤ駭鐢熶復鏃跺璞°?/font>
~2 鍑芥暟榪斿洖瀵硅薄鏃跺欎細浜х敓涓存椂瀵硅薄
渚嬪錛?const Number operator + ( const Number& lhs,const Number& rhs);
榪欎釜鍑芥暟榪斿洖涓涓復鏃跺璞★紝鍥犱負浠栨病鏈夊悕瀛楋紝鍙槸鍑芥暟鐨勮繑鍥炲箋?/font>
鏉℃20涓?錛屼細浠嬬粛璁╃紪璇戝櫒瀵瑰凡緇忚秴鍑虹敓瀛樺懆鏈熺殑涓存椂瀵硅薄榪涜浼樺寲
········鏉℃20錛?鍗忓姪緙栬瘧鍣ㄥ疄鐜拌繑鍥炲間紭鍖?/font>
榪斿洖鍊間紭鍖栵細榪斿洖甯︽湁鍙傛暟鐨勬瀯閫犲嚱鏁般?/font>
cosnt Rational operator * (cosnt Rational& lhs,const Rational& rhs){
return Rational(lhs.numerator()*rhs.numerator(),lhs.denomiator()*rhs.denominator()};
c++鍏佽緙栬瘧鍣ㄩ拡瀵硅秴鍑虹敓鍛藉懆鏈熺殑涓存椂瀵硅薄榪涜浼樺寲銆傚洜姝ゅ鏋滆皟鐢≧ational c=a*b錛?/font>
c++鍏佽緙栬瘧鍣ㄦ秷闄perator*鍐呴儴鐨勪復鏃跺彉閲忎互鍙妎perator*榪斿洖鐨勪復鏃跺彉閲忥紝緙栬瘧鍣ㄥ彲浠ユ妸return琛ㄨ揪寮忔墍瀹氫箟鐨勮繑鍥炲璞℃瀯閫犲湪鍒嗛厤緇檆鐨勫唴瀛樹笂銆傚鏋滆繖鏍峰仛鐨勮瘽閭d箞璋冪敤operator*鎵浜х敓鐨勪復鏃跺璞℃墍甯︽潵鐨勫紑閿灝辨槸0~ 鎴戜滑鍙互鎶妎perator 澹版槑涓哄唴鑱斿嚱鏁拌屽幓闄よ皟鐢ㄦ瀯閫犲嚱鏁板甫鏉ョ殑寮閿~
#include <iostream>
#include <string>
#include "time.h"
using namespace std;
char buffer[100];
class number{
public:
const friend number operator * (const number& rhs,const number lhs);
number(){}
number(int b):a(b){}
number(const number& rhs){
a = rhs.a;
}
int a;
};
const number operator*(const number& rhs,const number lhs){
number res;
res.a = rhs.a * lhs.a;
return res;
/*return number(rhs.a*lhs.a);*/
}
//CLOCKS_PER_SEC
int main()
{
clock_t start = clock();
number A(5);number B(6);
for(int i=0;i<100000000;i++)
number C = A*B;
clock_t end = clock();
cout<<double(end-start)/CLOCKS_PER_SEC<<endl;
}
閫氳繃涓婇潰鐨勭▼搴忚繍琛?濡傛灉娌℃湁榪斿洖鍊間紭鍖?榪愯鏃墮棿 15.9s 浼樺寲鍚庢槸 10.1s
榪樻槸寰堟樉钁楃殑涔?蹇簡33% 錛屽鏋滆繖縐嶆儏鍐靛嚭鐜板湪紼嬪簭鐨勭儹鐐瑰~鏁堟灉灝卞緢濂戒簡
·········鏉℃21 錛?閫氳繃鍑芥暟閲嶈澆閬垮厤闅愬紡綾誨瀷杞崲
渚嬪瓙錛?/font>
class upint{
public:
upint();
upint(int value);
};
cosnt upint operator+(const upint&lhs,const upint&rhs);
upint up1,up2;
upint up3 = up1+up2;
upi3 = up1 +10;
upi4 = 10+ upi2;
榪欎簺璇彞涔熷彲浠ラ氳繃錛屽洜涓哄垱寤轟簡涓存椂瀵硅薄錛岄氳繃甯︽湁int鐨勬瀯閫犲嚱鏁頒駭鐢熶簡涓存椂鐨剈pint瀵硅薄錛屽鏋滄垜浠笉鎰挎剰涓鴻繖浜涗復鏃跺璞$殑浜х敓涓庢瀽鏋勪粯鍑轟唬浠鳳紝鎴戜滑闇瑕佸仛浠涔堬細
鎴戜滑澹版槑 cosnt upint operator+(cosnt upint&lhs,int rhs);
cosnt upint operator+(int lhs,const upint& rhs);
灝卞彲浠ュ幓闄や復鏃跺璞′駭鐢熶簡~
浣嗘槸濡傛灉鎴戜滑鍐欎簡 const upint operator+(int lhs,int rhs); // 閿欎簡~
c++瑙勫畾錛屾瘡涓涓閲嶈澆鐨勮繍綆楃蹇呴』鑷沖皯鏈変竴涓弬鏁板睘浜庣敤鎴瘋嚜瀹氫箟綾誨瀷錛宨nt騫朵笉鏄嚜瀹氫箟綾誨瀷鎵浠ヤ笂闈㈢殑涓嶅鐨?/font>
鍚屾牱鐨勫鏋滃笇鏈泂tring char* 浣滀負鍙傛暟鐨勫嚱鏁幫紝閮芥湁鐞嗙敱榪涜閲嶈澆鑰岄伩鍏嶉殣褰㈢被鍨嬭漿鎹紙浠呬粎鍦ㄦ湁蹇呰鐨勬椂鍊欙紝涔熷氨鏄浠栦滑鍙互瀵圭▼搴忔晥鐜囪搗鍒板緢澶у府鍔╃殑鏃跺檦錛?/font>
··········鏉℃錛?鑰冭檻浣跨敤 op = 鏉ュ彇浠?鍗曠嫭鐨?op榪愮畻絎?/font>
class Rational{
public:
Rational& operator+=(const Rational& rhs);
Rational& operator-=(const Rational& rhs);
}
const Rational operator+(cosnt Rational& lhs,const Rational & rhs){
return Rational(lhs)+=rhs;
}
鍒╃敤+= -=鏉ュ疄鐜? -鍙互淇濊瘉榪愮畻絎︾殑璧嬪煎艦寮忎笌鍗曠嫭浣跨敤榪愮畻絎︿箣闂村瓨鍦ㄦ甯哥殑鍏崇郴銆?/font>
Rational a,b,c,d,result;
result = a+ b+c+d; // 鍙兘瑕佺敤鍒?涓復鏃跺璞?/font>
result +=a;result+=b;result+=c; //娌℃湁涓存椂瀵硅薄
鍓嶈呬功鍐欑淮鎶ら兘鏇村鏄擄紝鑰屼笖涓鑸潵璇存晥鐜囦笉瀛樺湪闂錛屼絾鏄壒孌婃儏鍐典笅鍚庤呮晥鐜囨洿楂樻洿鍙彇
娉ㄦ剰錛?/font>
濡傛灉+鐨勫疄鐜版槸榪欐牱鐨勶細
const T operator+ (constT& lhs,const T&rhs){
T result(lhs);
return result += rhs;
}
榪欎釜妯$増涓寘鍚湁鍚嶅瓧瀵硅薄result錛岃繖涓璞℃湁鍚嶅瓧鎰忓懗鐫榪斿洖鍊間紭鍖栦笉鍙敤~~~~~~~~·
·······鏉℃23 錛?鑰冭檻浣跨敤鍏朵粬絳変環鐨勭▼搴忓簱
涓繪棬錛?/font>
鎻愪緵綾諱技鍔熻兘鐨勭▼搴忓簱閫氬父鍦ㄦц兘闂涓婇噰鍙栦笉鍚岀殑鏉冭 鎺柦錛屾瘮濡俰ostream鍜宻tdio錛屾墍浠ラ氳繃鍒嗘瀽紼嬪簭鎵懼埌杞歡鐡墮涔嬪悗錛屽彲浠ヨ冭檻鏄惁閫氳繃鏇挎崲紼嬪簭搴撴潵娑堥櫎鐡墮~~~~
······鏉℃24 : 鐞嗚В铏氬嚱鏁幫紝澶氶噸緇ф壙錛岃櫄鍩虹被浠ュ強 RTTI 甯︽潵鐨勫紑閿
铏氬嚱鏁拌〃錛歷tabs 鎸囧悜铏氬嚱鏁拌〃鐨勬寚閽?vptrs
紼嬪簭涓瘡涓0鏄庝簡鎴栬呯戶鎵夸簡鐨勮櫄鍑芥暟鐨勭被閮藉叿鏈夎嚜宸辯殑铏氬嚱鏁拌〃銆傝〃涓殑鍚勪釜欏瑰氨鏄寚鍚戣櫄鍑芥暟鍏蜂綋瀹炵幇鐨勬寚閽堛?/font>
class c1{
c1();
virtual ~c1();
virtual void f1();
virtual int f2(char c)const;
virtual void f3(const string& s);
};
c1 鐨勮櫄鍑芥暟琛ㄥ寘鎷細 c1::~c1 c1::f1 c1::f2 c1::f3
class c2:public c1{
c2();
virtual ~c2();
virtual void f1();
virtual void f5(char *str);
};
瀹冪殑铏氬嚱鏁拌〃鍏ュ彛鎸囧悜鐨勬槸閭d簺鐢眂1澹版槑浣嗘槸c2娌℃湁閲嶅畾涔夌殑铏氬嚱鏁版寚閽堬細
c2::~c2 c2::f1 c1::f2 c1::f3 c2::f5
鎵浠ュ紑閿涓婏細 蹇呴』涓哄寘鍚櫄鍑芥暟鐨勭被鑵懼嚭棰濆鐨勭┖闂存潵瀛樻斁铏氬嚱鏁拌〃銆備竴涓被鐨勮櫄鍑芥暟琛ㄧ殑澶у皬鍙栧喅浜庡畠鐨勮櫄鍑芥暟鐨勪釜鏁幫紝铏界劧姣忎竴涓被鍙鏈変竴涓櫄鍑芥暟琛紝浣嗘槸濡傛灉鏈夊緢澶氱被鎴栬呮瘡涓被鍏鋒湁寰堝涓櫄鍑芥暟錛岃櫄鍑芥暟琛ㄤ篃浼氬崰鎹緢澶х殑絀洪棿錛岃繖涔熸槸mfc娌℃湁閲囩敤铏氬嚱鏁板疄鐜版秷鎭満鍒剁殑涓涓師鍥犮?/font>
鐢變簬姣忎竴涓被鍙渶瑕佷竴涓獀tbl鐨勬嫹璐濓紝鎶婂畠鏀懼湪鍝噷鏄竴涓棶棰橈細
涓縐嶏細涓烘瘡涓涓渶瑕乿tbl鐨勭洰鏍囨枃浠剁敓鎴愭嫹璐濓紝鐒跺悗榪炴帴鏃跺彇鍑洪噸澶嶆嫹璐?/font>
鎴栬咃細鏇村父瑙佺殑鏄噰鐢ㄨ瘯鎺㈡х畻娉曞喅瀹氬摢涓涓洰鏍囨枃浠跺簲璇ュ寘鍚被鐨剉tbl銆傝瘯鎺細涓涓被鐨剉tbl閫氬父浜х敓鍦ㄥ寘鍚綾葷涓涓潪鍐呰仈錛岄潪綰櫄鍑芥暟瀹氫箟鐨勭洰鏍囨枃浠墮噷銆傛墍浠ヤ笂闈1綾葷殑vtbl灝嗘斁鍦╟1::~c1 瀹氫箟鐨勭洰鏍囨枃浠墮噷銆傚鏋滄墍鏈夎櫄鍑芥暟閮藉0鏄庝負鍐呰仈錛岃瘯鎺㈡х畻娉曞氨浼氬け璐ワ紝鍦ㄦ瘡涓涓洰鏍囨枃浠跺氨浼氭湁vtbl銆傛墍浠ヤ竴鑸拷鐣ヨ櫄鍑芥暟鐨刬nline鎸囦護銆?/font>
濡傛灉涓涓被鍏鋒湁铏氬嚱鏁幫紝閭d箞榪欎釜綾葷殑姣忎竴涓璞¢兘浼氬叿鏈夋寚鍚戣繖涓櫄鍑芥暟琛ㄧ殑鎸囬拡錛岃繖鏄竴涓殣钘忔暟鎹垚鍛榲ptr~琚紪璇戝櫒鍔犲湪鏌愪竴涓綅緗?/font>
姝ゅ絎簩涓紑閿錛氫綘蹇呴』鍦ㄦ瘡涓涓璞′腑瀛樻斁涓涓澶栫殑鎸囬拡~
濡傛灉瀵硅薄寰堝皬榪欎釜寮閿灝卞崄鍒嗘樉钁梸~鍥犱負姣斾緥澶
姝ゆ椂 void makeCall(c1* pc1){
pc1->f1();
}
緲昏瘧涓?(*pc1->vptr[i])(pc1);
鏍規嵁vptr鎵懼埌vtbl 榪欏緢綆鍗曪紝
鍦╲tbl鎵懼埌璋冪敤鍑芥暟瀵瑰簲鐨勫嚱鏁版寚閽堬紝榪欎釜姝ラ涔熷緢綆鍗曪紝鍥犱負緙栬瘧鍣ㄤ負铏氬嚱鏁拌〃閲岀殑姣忎竴涓嚱鏁拌緗簡鍞竴鐨勭儲寮?/font>
鐒跺悗璋冪敤鎸囬拡鎵鎸囧悜鐨勫嚱鏁皛
榪欐牱鐪嬫潵錛岃皟鐢ㄨ櫄鍑芥暟涓庢櫘閫氬嚱鏁拌皟鐢ㄧ殑鏁堢巼鐩稿樊鏃犲嚑錛屽彧澶氬嚭鍑犱釜鎸囦護銆?/font>
铏氬嚱鏁扮湡姝g殑寮閿涓庡唴鑱斿嚱鏁版湁鍏硚錛氬湪瀹為檯搴旂敤涓紝铏氬嚱鏁頒笉搴旇琚唴鑱旓紝鍥犱負鍐呰仈鎰忓懗鐫鍦ㄧ紪璇戞椂鍒葷敤琚皟鐢ㄥ嚱鏁扮殑鍑芥暟浣撴潵浠f浛琚皟鐢ㄥ嚱鏁般備絾鏄櫄鍑芥暟鎰忓懗鐫榪愯鏃跺埢鍐沖畾璋冪敤鍝釜涓鍑芥暟錛宻o~~~铏氬嚱鏁頒粯鍑虹殑絎笁涓唬浠峰晩錛殈涓嶈兘鍐呰仈錛堥氳繃瀵硅薄璋冪敤铏氬嚱鏁扮殑鏃跺欙紝榪欎簺铏氬嚱鏁板彲浠ュ唴鑱旓紝浣嗘槸澶у鏁拌櫄鍑芥暟閫氳繃鎸囬拡鎴栬呬互鐢ㄦ潵璋冪敤鐨勶級銆?/font>
~澶氶噸緇ф壙鐨勬儏鍐?/font>
澶氶噸緇ф壙涓鑸姹傝櫄鍩虹被銆傛病鏈夎櫄鍩虹被錛屽鏋滀竴涓淳鐢熺被鍏鋒湁澶氫釜閫氬悜鍩虹被鐨勭戶鎵胯礬寰勶紝鍩虹被鐨勬暟鎹垚鍛樹細琚鍒跺埌姣忎竴涓戶鎵跨被瀵硅薄閲岋紝緇ф壙綾諱笌鍩虹被闂寸殑姣忎竴鏉¤礬寰勯兘鏈変竴涓嫹璐濄?/font>
鏈変簡铏氬熀綾伙紝閫氬父浣跨敤鎸囧悜铏氬熀綾葷殑鎸囬拡浣滀負閬垮厤閲嶅鐨勬墜孌碉紝榪欐牱闇瑕佸湪瀵硅薄鍐呴儴宓屽叆涓涓垨鑰呭涓寚閽垀涔熷甫鏉ヤ簡涓瀹氱殑寮閿~
渚嬪鑿卞艦緇ф壙 錛?
class A{};
class B:virtual public A{};
class C:virtual public A{};
class D:public B,public C{};
榪欓噷A鏄竴涓櫄鍩虹被錛屽洜涓築鍜孋铏氭嫙緇ф壙浜嗕粬銆?/font>
瀵硅薄 D 鐨勫竷灞錛?/font>
B data
vptr
pointer to virtual base class
C data
vptr
pointer to virtual base class
D data members
A data members
vptr
涓婇潰鍥涗釜綾伙紝鍙湁涓変釜vptr錛屽洜涓築鍜孌鍙互鍏變韓涓涓獀ptr 錛堜負鍟ワ紵錛?/font>
鐜板湪鎴戜滑宸茬粡鐪嬪埌铏氬嚱鏁板浣曚嬌瀵硅薄鍙樺緱鏇村ぇ錛屼互鍙婁負浣曚笉鑳芥妸瀹冨唴鑱斾簡~
涓嬮潰鎴戜滑鐪嬬湅RTTI鐨勫紑閿 runtime type identifycation 鎵闇瑕佺殑寮閿
閫氳繃rtti鎴戜滑鍙互鐭ラ亾瀵硅薄鍜岀被鐨勬湁鍏充俊鎭紝鎵浠ヨ偗瀹氬湪鏌愪釜鍦版柟瀛樺偍浜嗚繖浜涗緵鎴戜滑鏌ヨ鐨勪俊鎭紝榪欎簺淇℃伅琚瓨鍌ㄥ湪type_info 綾誨瀷鐨勫璞¢噷錛屼綘鍙互閫氳繃typeid榪愮畻絎﹁闂竴涓被鐨則ype_info瀵硅薄銆?/font>
姣忎釜綾諱粎浠呴渶瑕佷竴涓猂TTI鐨勬嫹璐濓紝瑙勮寖涓婂彧淇濊瘉鎻愪緵鍝簺鑷沖皯鏈変竴涓櫄鍑芥暟鐨勫璞$殑鍑嗙‘鐨勫姩鎬佺被鍨嬩俊鎭瘇
why錛熷拰铏氬嚱鏁版湁鍟ュ叧緋粇 鍥犱負rtti璁捐鍦╲tbl閲?/font>
vtbl鐨勪笅鏍?鍖呭惈鎸囧悜type_info瀵硅薄鐨勬寚閽堛傛墍浠ヤ嬌鐢ㄨ繖縐嶅疄鐜版柟娉曪紝娑堣垂鐨勭┖闂存槸vtbl涓崰鐢ㄤ竴涓澶栫殑鍗曞厓鍐嶅姞涓婂瓨鍌╰ype_info瀵硅薄鎵闇瑕佺殑絀洪棿銆?/font>
------------------------緗伓鐨勭粨鏉熺嚎 OVER~------------------------------------------
瀛︿範涓涓嬫柇璦鍚э細
·······浠涔堟槸鏂█
鍦ㄦ煇澶勫垽鏂煇涓涓〃杈懼紡鐨勫間負鐪熸垨鑰呭亣錛屽鏋滃亣鍒欒緭鍑洪敊璇秷鎭茍鍋滄紼嬪簭鐨勬墽琛寏
assert鏄畯錛岃屼笉鏄嚱鏁幫紝鍙湪debug鐗堟湰涓湁鏁堬紝鍥犳鏃犻渶鍦╮elease鐗堟湰鍒犻櫎銆?/font>
·······鍝嚑縐嶆柇璦
MFC
ASSERT
void foo(char* p,int size)
{
ASSERT(p != 0); // 楠岃瘉緙撳啿鍖烘寚閽?br>ASSERT((size >= 100); // 紜緙撳啿鍖哄ぇ灝忚嚦灝戜負100瀛楄妭
// foo 鍑芥暟鐨勫叾瀹冭綆楄繃紼?br>}
濡傛灉娌℃湁瀹氫箟_DEBUG棰勫鐞嗙錛屽垯璇ヨ鍙ヤ笉浼氱湡姝g敓鎴愪唬鐮併俈isual C++浼氬湪璋冭瘯妯″紡緙栬瘧鏃惰嚜鍔ㄥ畾涔塤DEBUG錛岃屽湪鍙戣妯″紡涓嬶紝璇ラ澶勭悊絎︽槸涓嶅瓨鍦ㄧ殑銆傚鏋滃畾涔変簡_DEBUG錛屽垯涓婅堪涓や釜鏂█鐢熸垚鐨勪唬鐮佺被濡傦細
//ASSERT(p != 0);
do
{
if(!(p != 0) && AfxAssertFailedLine(__FILE__, __LINE__))
AfxDebugBreak();
} while(0);
//ASSERT((size >= 100);
do
{
if(!(size >= 100) && AfxAssertFailedLine(__FILE__,__LINE__))
AfxDebugBreak();
}while(0);
ASSERT_KINDOF(classname,pObject); ASSERT_KINDOF(CDocument,pDocument);
媯楠宲Object鎸囧悜鐨勫璞℃槸classname綾葷殑涓涓璞℃垨鑰呭叾媧劇敓綾葷殑瀵硅薄
ASSERT_VALID(pObject); pObject 蹇呴』鏄竴涓淳鐢熶簬CObject綾葷殑綾誨璞★紝浼氳皟鐢ㄥ叾閲嶅啓鐨凙ssertValid鍑芥暟 錛屼緥濡?/font>
濡傛灉浣跨敤搴旂敤鍚戝鎴栫被鍚戝鐢熸垚鍩轟簬MFC鐨勭被錛岄氬父浼氬緱鍒癆ssertValid()鐨勯鏋訛紝鏈濂芥敼鍐欒繖浜涢鏋朵唬鐮佷互澧炲姞鏈鍩烘湰鐨勫畬鏁存ф鏌ャ備笅闈㈡槸涓涓吀鍨嬬殑渚嬪瓙錛岀被Sample浠嶤Object緇ф壙錛屽亣瀹氬畠鍚湁鑱屽憳鍚嶅瓧鍙婂叾钖按錛?
class Sample : public CObject
{
protected:
CString m_Name; // 鑱屽憳鍚嶅瓧
double m_Salary; // 钖按
public:
Sample(LPCTSTR name,double salary) : m_Name(name), m_Salary(salary) {}
#ifdef _DEBUG
virtual void AssertValid() const;
#endif
};
#ifdef _DEBUG
void Sample::AssertValid() const
{
CObject::AssertValid(); // 楠岃瘉鍩虹被
ASSERT(!m_Name.IsEmpty()); // 楠岃瘉鑱屽憳鍚嶅瓧
ASSERT(m_Salary > 0); // 楠岃瘉钖按
}
#endif
CRT assertion
_ASSERT 鍜?nbsp; _ASSERTE 鍚庝竴涓細鍦ㄥ嚭閿欐椂鍚屾椂鎵撳嵃鍑烘潯浠跺垽鏂彞
ANSI
assert()
娉ㄦ剰錛歛ssert鐢ㄤ簬媯嫻嬮潪娉曠殑杈撳叆錛屼絾鏄悎娉曠殑杈撳叆騫朵笉涓瀹氭槸姝g‘鐨勶紝渚嬪錛?/font>
int pB = (int*)malloc(sizeof(int)*1000);
assert(pB!=NULL) //閿欒鐨勪嬌鐢╝ssert 浠栦細鍦╮elease鐗堟湰澶辨晥~涔熷氨鏄assert涓嶅簲璇ュ紼嬪簭浜х敓鍓綔鐢?/font>
姝g‘鐨勫仛娉曪細
int pB = (int*) malloc(sizeof(int)*1000);
if(pB == NULL)
{
//閿欒澶勭悊
}
else{
}
鍙︿竴涓緥瀛愶細
void draw(){
CFigure* pF = getCF();
assert(pf!=NULL);
if(pf == NULL){}
else{
}
}
姝ゅ錛屽浜巊etCF鏉ヨ榪斿洖鍊間負NULL鏄潪娉曠殑錛屽鏋滀粬鐨勮繑鍥炲煎彲鑳戒負null灝辨病蹇呰鍔犱笂assert璇彞銆?/font>
鑰屼笅闈㈢殑if璇彞鍒欐槸涓轟簡闃叉release鐗堟湰鍑虹幇null鎸囬拡鐨勬儏鍐點?
VERIFY()
鐢變簬ASSERT浠呭湪紼嬪簭鐨勮皟璇曠増璧蜂綔鐢紝嫻嬭瘯琛ㄨ揪寮忔繪槸琚姩鐨勩備篃灝辨槸璇達紝瀹冧滑涓嶈兘鍖呭惈璧嬪箋佸閲忋佸噺閲忕瓑鐪熸鏀瑰彉鏁版嵁鐨勬搷浣溿備絾鏈夋椂鍊欐垜浠渶瑕侀獙璇佷竴涓富鍔ㄨ〃杈懼紡錛屾瘮濡傝祴鍊艱鍙ャ傝繖鏃跺彲浠ヤ嬌鐢╒ERIFY浠f浛ASSERT銆備笅闈㈡槸涓涓緥瀛愶細
void foo(char* p,int size)
{
char* q; // 鎸囬拡鐨勫壇鏈?br>VERIFY(q = p); // 鎷瘋礉鎸囬拡騫舵墽琛岄獙璇?br>ASSERT((size >= 100); // 紜繚緙撳啿鍖哄ぇ灝忚嚦灝戜負100瀛楄妭
// 鎵ц foo 鐨勫叾瀹冩搷浣?br>}
鍦ㄨ皟璇曟ā寮忎笅ASSERT鍜孷ERIFY鏄浉鍚岀殑銆備絾鍦╮elease妯″紡涓嬶紝VERIFY鑳藉緇х畫瀵硅〃杈懼紡姹傚鹼紙浣嗕笉鍐嶈繘琛屾柇璦媯楠岋級錛岃孉SSERT璇彞鍦ㄦ晥鏋滀笂灝卞鍚屽凡緇忓垹闄や簡涓鏍楓?
灝界鍦∕FC婧愪唬鐮佷腑鍙互鎵懼埌涓浜涘簲鐢╒ERIFY鐨勪緥瀛愶紝浣咥SSERT鐢ㄥ緱鏇翠負鏅亶銆備竴浜涚▼搴忓憳鎬繪槸瀹屽叏閬垮厤浣跨敤VERIFY錛屽洜涓轟粬浠凡緇忎範鎯簬浣跨敤琚姩鏂█銆傝璁頒綇錛屽鏋滃湪ASSERT璇彞涓嬌鐢ㄤ簡涓誨姩琛ㄨ揪寮忥紝緙栬瘧鍣ㄤ笉浼氬彂鍑轟換浣曡鍛娿傚湪鍙戣妯″紡涓嬬紪璇戞椂璇ヨ〃杈懼紡浼氳鐩存帴鍒犻櫎錛屼粠鑰屽鑷寸▼搴忚繍琛岀殑閿欒銆傜敱浜庡彂琛岀増紼嬪簭涓嶅惈璋冭瘯淇℃伅錛岃繖縐嶇被鍨嬬殑閿欒鏄緢闅炬壘鍒板師鍥犵殑銆?
紼嬪簭鍙互浣跨敤鍩虹被鐨勬寚閽?/font>鎴栬呭紩鐢ㄦ潵媯绱㈣繖浜涙寚閽堟垨寮曠敤鎵鎸囧璞$殑瀹為檯媧劇敓綾誨瀷
鏍囧噯搴撴彁渚涗簡涓や釜鎿嶄綔絎︼細
1. typeid 浠栧彲浠ヨ繑鍥炴寚閽堟垨鑰呭紩鐢ㄦ墍鎸囧悜瀵硅薄鐨勫疄闄呯被鍨?/font>
2. dynamic_cast 灝嗗熀綾葷被鍨嬬殑鎸囬拡鎴栧紩鐢ㄥ畨鍏ㄧ殑杞負媧劇敓綾葷殑鎸囬拡鎴栬呭紩鐢?nbsp;
瀵逛簬涓嶅甫铏氬嚱鏁扮殑綾誨湪緙栬瘧鏃舵湡鎵ц錛屽惁鍒欏湪榪愯鏈熼棿鎵ц
浣跨敤鏃舵満錛?/font>
鍩虹被鎸囬拡璋冪敤媧劇敓綾繪垚鍛樺嚱鏁扮殑璇濓紝涓鑸簲浣跨敤铏氬嚱鏁幫紝榪欐牱緙栬瘧鍣ㄤ細鏍規嵁瀵硅薄鐨勫疄闄呯被鍨嬫潵閫夋嫨姝g‘鐨勫嚱鏁般備絾鏄煇浜涙儏鍐典笅鏃犳硶浣跨敤铏氬嚱鏁幫紝閭d箞姝?/font>
鏃跺鏋滈渶瑕佷嬌鐢ㄥ熀綾繪寚閽堣皟鐢ㄦ淳鐢熺被鎴愬憳鍑芥暟渚塊渶瑕佷嬌鐢≧TTI寮哄埗杞崲錛岃屼笖蹇呴』媯鏌ヨ漿鎹㈡槸鍚︽垚鍔?/font>浜?/font>
(涓) Dynamic_cast
dynamic_cast 濡傛灉杞崲鍒版寚閽堝け璐ュ垯榪斿洖 0 濡傛灉杞崲鍒板紩鐢ㄧ被鍨嬪け璐ュ垯鎶涘嚭 bad_cast 寮傚父
瀵規寚閽堟搷浣滐細
if(Derived *derivedPtr = dynamic_cast<Derived*> (basePtr)){
//basePtr point to a derived object;
}else{
//basePtr point to a base object;
}
鍦?if 璇彞涓繘琛屾鏌?1.鏉′歡浠g爜鍐呴儴鐭ラ亾 derivedPtr 鐨勭被鍨?2.涓嶅彲鑳藉湪嫻嬭瘯浠g爜鍜屼嬌鐢ㄤ唬鐮佷腑鍔犲叆浠g爜錛屼篃灝辨槸璇翠笉浼氬湪娌℃湁嫻嬭瘯鍓嶅氨浣跨敤derivedPtr 3.濡傛灉澶辮觸澶栭儴涓嶄細浣跨敤鏈粦瀹氱殑鎸囬拡derivedPtr
瀵瑰紩鐢ㄦ搷浣滐細
鍥犱負涓嶅瓨鍦ㄧ┖寮曠敤鎵浠ヨ漿鎹㈠け璐ユ姏鍑哄紓甯?/font>
void f(const Base& b){
try{
const Derived &d = dynamic_cast<const Derived&> (b);
}catch(bad_cast){
}
}
(浜? typeid
typeid(e) e鏄換鎰忕殑琛ㄨ揪寮忔垨鑰呯被鍨嬪悕
Base *bp;
Derived *dp;
//compare type at run time of two objects
if(typeid(*bp)==typeid(*dp)){
//bp dp point to objects of the same type
}
if(typeid(*bp)==typeid(Derived)){
//bp actually point to a Derived
}
娉ㄦ剰typeid 嫻嬭瘯鐨勬槸 *bp 瀵硅薄
//test always fails: The type of bp if pointer to Base
if(typeid(bp)==typeid(Derived)){
}
Base* 灝嗘案榪滃拰Derived綾誨瀷涓嶅悓
鍙湁typeid 鐨勬搷浣滄暟鏄甫铏氬嚱鏁扮殑綾葷殑瀵硅薄鐨勬椂鍊欙紝鎵嶈繑鍥炲姩鎬佺被鍨嬩俊鎭紝嫻嬭瘯鎸囬拡榪斿洖鎸囬拡鐨勯潤鎬佺殑錛岀紪璇戞椂綾誨瀷
錛堜笁 錛塼ype_info 綾?/p>
浣滀負typeid鐨勮繑鍥炲?鎻愪緵
t1==t2 t1!=t2 t.name() 鐨勬搷浣?/p>
浣滀負搴旂敤渚嬪瓙錛屽彲浠ュ疄鐜頒竴涓被鍨嬫晱鎰熺殑鐩哥瓑鎿嶄綔絎?/p>
friend bool operator == (const base& lhs, const base& rhs){
return typeid(lhs)==typeid(rhs) && lhs.equal(rhs);
}
榪欐牱鍙互澶勭悊鍩虹被瀛愮被娣峰悎鐨勭浉絳夊垽鏂簡
tchs-2 250pt 鐩存帴綆楀氨琛?鎴戝啓浜?鍒?500pt 鏆村姏鍙互榪囷紝浣嗘槸鍒ゆ柇鏃跺欎笉鑳界敤stringstream 鐢ㄧ畻鏈垽鏂?涔熷彲浠ョ敤鏋勯犳硶 1000pt 姣忎竴浣嶆湁涓夌鍙兘鎬?/p>
涓嶇敤錛屼繚鎸佷笉鍔紝鍙樺寲錛屽垎鍒掑綊璁$畻value騫舵洿鏂扮粨鏋滃嵆鍙紝鐢變簬閫掑綊娣卞害鏈澶氬彧鏈?3灞傛墍浠ヤ笉浼歵le
鍙﹀涔熷彲浠ュ啓鍑哄熀鏁頒負3鐨勫驚鐜潵閬嶅巻姣忎竴縐嶆儏鍐靛叿浣撶湅浠g爜
for(i=0,A[0]++;A[i]>2;i++){
A[i]=0;A[i+1]++;
}
tchs-3 1000pt 瑕佹兂浣夸箻縐渶澶э紝闇瑕佹洿澶氱殑3鍗沖彲 500pt 鍙堢湅閿欓浜?~~~ft 瑕佹敞鎰忛鐩竴瀹氳鐪嬫竻妤?/p>
tchs-4 500pt 妯℃嫙棰橈紝濂介毦鎳?闊充箰鐨剘 鍙互閮戒箻浠?6 鐢ㄦ暣鏁版潵璁$畻 嫻偣浼氬緢鐑 榪欑棰樻濊礬瑕佹竻鏅?涓姝ヤ竴姝ユ潵
tchs-5 250pt 綆鍗曢錛屾敞鎰忎嬌鐢╠ouble 鍙互鐢?.0*int灝變笉鐢╠ouble()浜嗚繕鏈?int(h+1e-9);
500pt 綆鍗曢錛屾妸鎵鏈墂ord鎻愬彇鍑烘潵鐒跺悗鎺掑簭錛屽啀渚濇鎻掑叆鏍囩偣鍗沖彲錛屾敞鎰忔湁浜涘皬鎶宸?/p>
鎬濊礬瑕佹竻鏅幫紝涓や釜杞浛璁板綍鍗沖彲
1000pt 鏄劇劧鐨凚FS 鍒╃敤闃熷垪 鍙槸棰樻剰涓嶅お濂界悊瑙o紝鏈濂芥妸鍒ゆ柇鍐欐垚灝忓嚱鏁幫紝涓葷▼搴忎細鐪嬭搗鏉ユ瘮杈冩竻鏅幫紝涓嶅鏄撳嚭閿檦 涓姝ヤ竴姝ユ潵
涓昏鍐呭 FIND-UNION ALGORITHM
灝辨槸鍒╃敤騫舵煡闆嗘潵鑰冨療榪為氭х殑綆楁硶 銆傛潯浠禢涓妭鐐癸紝M瀵硅妭鐐癸紝杈撳叆姣忎竴瀵硅妭鐐規椂鍊欙紝濡傛灉宸茬粡榪為氾紝鍒欏拷鐣ワ紝鍚﹀垯杈撳嚭鎺ョ偣騫舵洿鏂?
涓昏浠嬬粛涓夌綆楁硶錛氱涓縐嶏紝QUCK-FIND 鍒╃敤鏁扮粍璁板綍姣忎竴涓仈閫氬瓙鍥撅紝鍚屼竴涓仈閫氬瓙鍥劇殑鑺傜偣鏁扮粍鍙橀噺鏄浉鍚岀殑銆傚洜姝ゆ瘡璇誨叆涓瀵瑰氨闇瑕侀亶鍘哊涓暟緇勫彉閲忚冨療鏄惁闇瑕佹洿鏂幫紝鏈鍧忔椂闂碝N錛屽疄闄呬笂姣忎釜瀛愬浘涓洪珮搴︿負2鐨勬爲;絎簩縐嶏紝QUICK-UNION 鑱旈氬瓙鍥鵑渶瑕乽nion鏃?浠呬粎闇瑕佸皢涓や釜root union 鍥犳姣忎釜鑱旈氬瓙鍥鵑珮搴﹀彉楂橈紝鎵鏈塮ind root 浼氭秷鑰椾竴瀹氭椂闂達紝褰撶劧鏃犻渶閬嶅巻N浜?錛屾渶鍧忔椂闂達紝涔熷氨鏄瘡嬈″潎闇瑕佷粠鍙跺瓙鑺傜偣鍘誨洖婧眰鏍癸紙榪欓噷涔︿腑涓懼緱渚嬪瓙濂藉儚鏈夐棶棰橈級涔熸槸MN錛涚涓夌涔熷氨鏄?QUICK WEIGHT UNION 榪欑鏂規硶鍦ㄤ袱涓瓙鏍戝悎騫剁殑鏃跺欙紝涓嶆槸綆鍗曠殑鎸囧畾鍚堝茍絳栫暐錛岃屾槸緇忚繃鍒ゆ柇鐨勶紝鎶妔ize灝忥紙鐩稿簲楂樺害涔熷皬錛夌殑鍚堝茍鍒皊ize澶х殑閲岄潰錛涘疄闄呬笂寰堝鏄撶悊瑙e氨鏄敖閲忓噺灝戞爲鐨勯珮搴︽潵榪芥眰quick-find鐨勬晥鐜囷紱
榪涜屼綔鑰呭啓閬撹礬寰勫帇緙╋紝涔熸槸榪欑鎬濇兂銆傛垨鑰呭疄鐜頒負鍏ㄩ儴鍘嬬緝錛屼篃灝辨槸璇村湪榪涜union鎿嶄綔鐨勬椂鍊欙紝鎵鏈塩heck鐨勮妭鐐歸兘鐩存帴閾炬帴鍒皍nion鍚庣殑鏂皉oot涓嬮潰錛屾垨鑰卙alf union 錛堝鏄撳疄鐜頒笖鎬ц兘濂斤級姣忔check鏃跺欙紝濡傛灉娌℃湁鍋滄loop綆鍗曠殑浠?id[i]=id[id[i]];鍗沖彲杈懼埌鍑忓皯鍒版牴璺濈鐨勬晥鏋溿?
half union 鐨勪富瑕佷唬鐮侊細
int i,j; for(i=p;id[i]!=i;i=id[i]) id[i]=id[id[i]]; for(j=p;id[j]!=j;j=id[j]) id[j]=id[id[j]]; if(i==j)continue; if(size[i]>size[j]) id[j]=i,size[i]+=size[j]; else id[i]=j,size[j]+=size[i];
絎竴嬈$敤windows live writer 璇曡瘯鏁堟灉鍝~