锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久中文,亚洲一二三区在线观看,香蕉免费一区二区三区在线观看http://www.shnenglu.com/zqsand/category/12848.html鍟ユ槸瀛愭爣棰?/description>zh-cnMon, 05 Apr 2010 09:07:03 GMTMon, 05 Apr 2010 09:07:03 GMT60鍏充簬瀵歸綈http://www.shnenglu.com/zqsand/archive/2010/04/04/111589.htmlrikisandrikisandSun, 04 Apr 2010 08:00:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/04/04/111589.htmlhttp://www.shnenglu.com/zqsand/comments/111589.htmlhttp://www.shnenglu.com/zqsand/archive/2010/04/04/111589.html#Feedback3http://www.shnenglu.com/zqsand/comments/commentRss/111589.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/111589.html

鏁版嵁瀵歸綈錛氭槸鎸囨暟鎹墍鍦ㄧ殑鍐呭瓨鍦板潃蹇呴』鏄鏁版嵁闀垮害鐨勬暣鏁板嶃傚鐞嗗櫒鍙互鐩存帴璁塊棶瀵歸綈鐨勬暟鎹紝鑰岃闂湭瀵歸綈鐨勬暟鎹細鍦ㄥ唴閮ㄨ繘琛屼竴緋誨垪鐨勮皟鏁達紝铏界劧鍙互姝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>



rikisand 2010-04-04 16:00 鍙戣〃璇勮
]]>
USACO 4.2.2 絎竴閬撶綉緇滄祦····http://www.shnenglu.com/zqsand/archive/2010/03/26/110584.htmlrikisandrikisandFri, 26 Mar 2010 05:04:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/03/26/110584.htmlhttp://www.shnenglu.com/zqsand/comments/110584.htmlhttp://www.shnenglu.com/zqsand/archive/2010/03/26/110584.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/110584.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/110584.htmlDrainage Ditches
Hal Burch

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.

PROGRAM NAME: ditch
INPUT FORMAT

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.

SAMPLE INPUT (file ditch.in)
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
OUTPUT FORMAT

One line with a single integer, the maximum rate at which water may emptied from the pond.

SAMPLE OUTPUT (file ditch.out)
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:   }

 

 

 

 

 

 

 

 



rikisand 2010-03-26 13:04 鍙戣〃璇勮
]]>
娣卞叆鎺㈢儲C++瀵硅薄妯″瀷璇諱功絎旇 (涓?http://www.shnenglu.com/zqsand/archive/2010/03/25/110552.htmlrikisandrikisandThu, 25 Mar 2010 13:09:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/03/25/110552.htmlhttp://www.shnenglu.com/zqsand/comments/110552.htmlhttp://www.shnenglu.com/zqsand/archive/2010/03/25/110552.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/110552.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/110552.html鏈鍚庝竴绔爚~鎷栦簡鍑犲ぉ錛屽緱璧剁揣璁頒笅浜唦~

鍚嶅瓧錛?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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



rikisand 2010-03-25 21:09 鍙戣〃璇勮
]]>
閲嶈澆鎿嶄綔絎?(c++primer 4e)http://www.shnenglu.com/zqsand/archive/2010/03/15/109748.htmlrikisandrikisandMon, 15 Mar 2010 08:40:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/03/15/109748.htmlhttp://www.shnenglu.com/zqsand/comments/109748.htmlhttp://www.shnenglu.com/zqsand/archive/2010/03/15/109748.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/109748.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/109748.html1.涓哄暐瑕侀噸杞芥搷浣滅錛?/font>

閫氳繃閲嶈澆鎿嶄綔絎︼紝紼嬪簭鍛樺彲浠ラ拡瀵光滅被鈥濈被鍨嬬殑鎿嶄綔鏁板畾涔変笉鍚岀殑鎿嶄綔絎︾増鏈傝壇濂界殑鎿嶄綔絎﹀畾涔夊彲浠ヤ嬌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){
    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;
}

 

涓鑸畻鏈繍綆楃璁劇疆涓洪潪鎴愬憳鍑芥暟錛屼笌鍐呯疆榪愮畻絎﹀搴旓紝閫夋嫨榪斿洖value 鑰屼笉鏄紩鐢ㄣ傝祴鍊艱繍綆楃閲嶈澆涓烘垚鍛樺嚱鏁幫紝騫剁敤瀹冩潵瀹炵幇綆楁湳榪愮畻絎︼紝榪欐牱綆楁湳榪愮畻絎︿笉鐢╢riend

鐩哥瓑榪愮畻絎﹀拰涓嶇瓑榪愮畻絎︿竴鑸垚瀵瑰嚭鐜幫紝涓旂敤涓涓疄鐜板彟涓涓?/font>

鍏崇郴榪愮畻絎?== != > < 涓鑸噸杞芥垚闈炴垚鍛樺嚱鏁?/font>

6.璧嬪兼搷浣滅

蹇呴』涓烘垚鍛樺嚱鏁?錛?鍙鳳級

=鍜?=  -= 涓鑸兘闇瑕佽繑鍥炲乏鎿嶄綔鏁扮殑寮曠敤

Sales_item& operator = (string is){
    isbn = is;
    return *this;
}

6.涓嬫爣鎿嶄綔絎?/font>

蹇呴』涓虹被鎴愬憳鍑芥暟   榪斿洖寮曠敤浣垮叾鍙互鍦ㄨ祴鍊兼搷浣滅殑浠繪剰涓杈?/font>

涓鑸畾涔変竴縐峜onst 榪斿洖甯擱噺寮曠敤 涓縐峮ot const 寮曠敤

     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
      };

int& Foo::operator[] (const size_t index)
     {
         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
     }

pari<string,string>& operator[] (const  vector< pair<string,string>* > ::size_type index){
    return *wait_list.at(index);//浣跨敤at鍒ゆ柇鏄惁瓚婄晫
}

6.鎴愬憳璁塊棶鎿嶄綔絎?/font>

-> 涓鑸姹傞噸杞戒負鎴愬憳榪愮畻絎︼紝*娌℃湁瑕佹眰 ,浣嗘垚鍛樻瘮杈冨父瑙亊~~

渚嬪瓙錛歛uto-ptr~~~~

ScreenPtr 鐨勭敤鎴峰皢浼氫紶閫掍竴涓寚閽堬紝璇ユ寚閽堟寚鍚戝姩鎬佸垎閰嶇殑 Screen錛?tt>ScreenPtr 綾誨皢鎷ユ湁璇ユ寚閽堬紝騫跺畨鎺掑湪鎸囧悜鍩虹瀵硅薄鐨勬渶鍚庝竴涓?ScreenPtr 娑堝け鏃跺垹闄ゅ熀紜瀵硅薄銆傚彟澶栵紝涓嶇敤涓?ScreenPtr 綾誨畾涔夐粯璁ゆ瀯閫犲嚱鏁般傚洜姝わ紝鎴戜滑鐭ラ亾涓涓?ScreenPtr 瀵硅薄灝嗘繪槸鎸囧悜涓涓?Screen 瀵硅薄錛屼笉浼氭湁鏈粦瀹氱殑 ScreenPtr錛岃繖涓鐐逛笌鍐呯疆鎸囬拡涓嶅悓銆傚簲鐢ㄧ▼搴忓彲浠ヤ嬌鐢?ScreenPtr 瀵硅薄鑰屾棤欏婚鍏堟祴璇曞畠鏄惁鎸囧悜涓涓?Screen 瀵硅薄銆?/font>

     // private class for use by ScreenPtr only 縐佹湁綾伙紝
     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
     };

鎸囬拡鏀寔鐨勫熀鏈搷浣滄湁瑙e紩鐢ㄦ搷浣滃拰綆ご鎿嶄綔銆傛垜浠殑綾誨彲浠ヨ繖鏍峰畾涔夎繖浜涙搷浣滐細

     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
     };

瑙e紩鐢ㄦ搷浣滅鏄釜涓鍏冩搷浣滅銆傚湪榪欎釜綾諱腑錛岃В寮曠敤鎿嶄綔絎﹀畾涔変負鎴愬憳錛屽洜姝ゆ病鏈夋樉寮忓艦鍙傦紝璇ユ搷浣滅榪斿洖瀵?ScreenPtr 鎵鎸囧悜鐨?Screen 鐨勫紩鐢ㄣ?/font>

綆ご鎿嶄綔絎︿笉鎺ュ彈鏄懼紡褰㈠弬銆俻oint->action();   絳変環浜?nbsp; (point->action)();

鍙互榪欐牱浣跨敤 ScreenPtr 瀵硅薄璁塊棶 Screen 瀵硅薄鐨勬垚鍛橈細

ScreenPtr p(&myScreen);     // copies the underlying Screen
p->display(cout);

鍥犱負 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++()
    {
        if (curr == end)
            throw out_of_range
                  ("increment past the end of CheckedPtr");
        ++curr;                // advance current state
        return *this;
    }

CheckedPtr CheckedPtr::operator++(int)
     {

         // no check needed here, the call to prefix increment will do the check
         CheckedPtr ret(*this);        // save current value
         ++*this;                      // advance one element, checking the increment 鐢ㄥ墠緗疄鐜板畠錛屼笉鐢ㄥ垽鏂嚭鐣屼簡
         return ret;                   // return saved state
     }

鏄懼紡璋冪敤錛?/font>

CheckedPtr parr(ia, ia + size);        // iapoints to an array of ints
parr.operator++(0);                    // call postfix operator++
parr.operator++();                     // call prefix operator++

7 璋冪敤鎿嶄綔絎﹀拰鍑芥暟瀵硅薄

struct absInt {
       int operator() (int val) {
           return val < 0 ? -val : val;
       }
   };

 

閫氳繃涓虹被綾誨瀷鐨勫璞℃彁渚涗竴涓疄鍙傝〃鑰屼嬌鐢ㄨ皟鐢ㄦ搷浣滅錛屾墍鐢ㄧ殑鏂瑰紡鐪嬭搗鏉ュ儚涓涓嚱鏁拌皟鐢細

     int i = -42;
     absInt absObj;  // object that defines function call operator
     unsigned int ui = absObj(i);     // calls absInt::operator(int)

鍑芥暟璋冪敤鎿嶄綔絎﹀繀欏誨0鏄庝負鎴愬憳鍑芥暟銆備竴涓被鍙互瀹氫箟鍑芥暟璋冪敤鎿嶄綔絎︾殑澶氫釜鐗堟湰錛岀敱褰㈠弬鐨勬暟鐩垨綾誨瀷鍔犱互鍖哄埆銆?/font>

瀹氫箟浜嗚皟鐢ㄦ搷浣滅鐨勭被錛屽叾瀵硅薄甯哥О涓哄嚱鏁板璞★紝鍗沖畠浠槸琛屼負綾諱技鍑芥暟鐨勫璞°?/font>

鍑芥暟錛?/font>

     // determine whether a length of a given word is 6 or more
     bool GT6(const string &s)
     {
         return s.size() >= 6;
     }

鍑芥暟瀵硅薄錛?/font>

// determine whether a length of a given word is longer than a stored bound
     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;
     };

for (size_t i = 0; i != 11; ++i)
     cout << count_if(words.begin(), words.end(), GT(i))
          << " words " << i
          << " characters or longer" << endl;

鍑芥暟瀵硅薄鐨勪究鎹鋒с?/font>

         plus<int> intAdd;         // function object that can add two int values
     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

鍑芥暟閫傞厤鍣細

banding鍣紝瀹冮氳繃灝嗕竴涓搷浣滄暟緇戝畾鍒扮粰瀹氬艱屽皢浜屽厓鍑芥暟瀵硅薄杞崲涓轟竴鍏冨嚱鏁板璞?/font>

姹傚弽鍣ㄦ槸涓縐嶅嚱鏁伴傞厤鍣紝瀹冨皢璋撹瘝鍑芥暟瀵硅薄鐨勭湡鍊兼眰鍙嶃傛爣鍑嗗簱瀹氫箟浜嗕袱涓眰鍙嶅櫒錛?tt>not1 鍜?not2 鍒嗗埆姹傚弽涓鍏冧簩鍏冨璞?/tt>

8銆傚疄鍙傚尮閰嶅拰杞崲錛堜亢鏉ョ湅閲嶈澆鎿嶄綔絎︾殑鍘熷洜鍟婏紝錛岋紝錛?/font>

杞崲鎿嶄綔絎︽槸涓縐嶇壒孌婄殑綾繪垚鍛樺嚱鏁般傚畠瀹氫箟灝嗙被綾誨瀷鍊艱漿鍙樹負鍏朵粬綾誨瀷鍊肩殑杞崲銆傝漿鎹㈡搷浣滅鍦ㄧ被瀹氫箟浣撳唴澹版槑錛屽湪淇濈暀瀛?operator 涔嬪悗璺熺潃杞崲鐨勭洰鏍囩被鍨嬶細

杞崲鍑芥暟閲囩敤濡備笅閫氱敤褰㈠紡錛?/font>

     operator type();

杞崲鍑芥暟蹇呴』鏄垚鍛樺嚱鏁幫紝涓嶈兘鎸囧畾榪斿洖綾誨瀷錛屽茍涓斿艦鍙傝〃蹇呴』涓虹┖銆?/font>

铏界劧杞崲鍑芥暟涓嶈兘鎸囧畾榪斿洖綾誨瀷錛屼絾鏄瘡涓漿鎹㈠嚱鏁板繀欏繪樉寮忚繑鍥炰竴涓寚瀹氱被鍨嬬殑鍊箋備緥濡傦紝operator int 榪斿洖涓涓?int 鍊鹼紱濡傛灉瀹氫箟 operator Sales_item錛屽畠灝嗚繑鍥炰竴涓?Sales_item 瀵硅薄錛岃濡傛綾匯?/font>

杞崲鍑芥暟涓鑸笉搴旇鏀瑰彉琚漿鎹㈢殑瀵硅薄銆傚洜姝わ紝杞崲鎿嶄綔絎﹂氬父搴斿畾涔変負 const 鎴愬憳銆?/font>

鍙瀛樺湪杞崲錛岀紪璇戝櫒灝嗗湪鍙互浣跨敤鍐呯疆杞崲鐨勫湴鏂硅嚜鍔ㄨ皟鐢ㄥ畠

  • In expressions:

    鍦ㄨ〃杈懼紡涓細

         SmallInt si;
         double dval;
         si >= dval          // si converted to int and then convert to double
  • In conditions:

    鍦ㄦ潯浠朵腑錛?/font>

         if (si)                // si converted to int and then convert to bool
  • When passing arguments to or returning values from a function:

    灝嗗疄鍙備紶緇欏嚱鏁版垨浠庡嚱鏁拌繑鍥炲鹼細

         int calc(int);
         SmallInt si;
         int i = calc(si);      // convert si to int and call calc
  • As operands to overloaded operators:

    浣滀負閲嶈澆鎿嶄綔絎︾殑鎿嶄綔鏁幫細

         // convert si to int then call opeator<< on the int value
         cout << si << endl;
  • In an explicit cast:

    鍦ㄦ樉寮忕被鍨嬭漿鎹腑錛?/font>

         int ival;
         SmallInt si = 3.541; //
         instruct compiler to cast si to int
         ival = static_cast<int>(si) + 3;
    

    綾葷被鍨嬭漿鎹箣鍚庝笉鑳藉啀璺熷彟涓涓被綾誨瀷杞崲銆傚鏋滈渶瑕佸涓被綾誨瀷杞崲錛屽垯浠g爜灝嗗嚭閿欍傦紙鎸囩殑鏄笉鑳借繛緇袱涓嚜瀹氫箟鐨勭被鍨嬭漿鎹紝浣嗘槸鍐呯疆綾誨瀷杞崲鍙互鐨勶級

  • 榪樻湁涓閮ㄥ垎鏄疄鍙傚尮閰嶅拰杞崲 錛屾病鏃墮棿浜?浠ュ悗鍐嶇湅~~~~

     

     

     

     

     

     

     

     

     

     

     



    rikisand 2010-03-15 16:40 鍙戣〃璇勮
    ]]>
    绱犳暟絳涙硶http://www.shnenglu.com/zqsand/archive/2010/03/12/109528.htmlrikisandrikisandFri, 12 Mar 2010 06:04:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/03/12/109528.htmlhttp://www.shnenglu.com/zqsand/comments/109528.htmlhttp://www.shnenglu.com/zqsand/archive/2010/03/12/109528.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/109528.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/109528.html

    #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--------------------------------------------------------------------



    rikisand 2010-03-12 14:04 鍙戣〃璇勮
    ]]>
    娣卞叆鎺㈢儲C++瀵硅薄妯″瀷璇諱功絎旇 (鍥?http://www.shnenglu.com/zqsand/archive/2010/03/09/109322.htmlrikisandrikisandTue, 09 Mar 2010 14:20:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/03/09/109322.htmlhttp://www.shnenglu.com/zqsand/comments/109322.htmlhttp://www.shnenglu.com/zqsand/archive/2010/03/09/109322.html#Feedback1http://www.shnenglu.com/zqsand/comments/commentRss/109322.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/109322.htmlFunction 璇箟瀛?/font>

    路路路路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>

    --------------------緇撴潫綰垮摝~~~~~~路路----------------------

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     



    rikisand 2010-03-09 22:20 鍙戣〃璇勮
    ]]>
    娣卞叆鎺㈢儲C++瀵硅薄妯″瀷璇諱功絎旇 (涓?http://www.shnenglu.com/zqsand/archive/2010/03/07/109118.htmlrikisandrikisandSun, 07 Mar 2010 08:39:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/03/07/109118.htmlhttp://www.shnenglu.com/zqsand/comments/109118.htmlhttp://www.shnenglu.com/zqsand/archive/2010/03/07/109118.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/109118.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/109118.htmlDATA 璇箟瀛?/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

    棰濆鐨勯棿鎺ユт細闄嶄綆鈥滄妸鎵鏈夋搷浣滈兘鎼Щ鍒扮紦瀛樺櫒涓墽琛屸濅紭鍖栬兘鍔涳紝涔熷氨鏄檷浣庝簡灞閮ㄦ

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     



    rikisand 2010-03-07 16:39 鍙戣〃璇勮
    ]]>
    娣卞叆鎺㈢儲C++瀵硅薄妯″瀷璇諱功絎旇 (浜?http://www.shnenglu.com/zqsand/archive/2010/03/03/108832.htmlrikisandrikisandWed, 03 Mar 2010 14:23:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/03/03/108832.htmlhttp://www.shnenglu.com/zqsand/comments/108832.htmlhttp://www.shnenglu.com/zqsand/archive/2010/03/03/108832.html#Feedback4http://www.shnenglu.com/zqsand/comments/commentRss/108832.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/108832.html鏋勯犲嚱鏁拌涔夊

    --浜嗚В緙栬瘧鍣ㄥ湪鏋勯犲璞℃椂鑳岀潃鎴戜滑騫蹭簡浠涔堝嬀褰?/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~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     



    rikisand 2010-03-03 22:23 鍙戣〃璇勮
    ]]>
    娣卞叆鎺㈢儲C++瀵硅薄妯″瀷璇諱功絎旇 (涓)http://www.shnenglu.com/zqsand/archive/2010/03/03/108780.htmlrikisandrikisandWed, 03 Mar 2010 05:58:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/03/03/108780.htmlhttp://www.shnenglu.com/zqsand/comments/108780.htmlhttp://www.shnenglu.com/zqsand/archive/2010/03/03/108780.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/108780.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/108780.html瀵掑亣鍩烘湰璇諱簡涓閬嶏紝鐜板湪鍐嶈涓閬嶏紝鍋氫笅絎旇銆?/font>

    絎旇褰撳仛鐨勭簿鐐艱屾湁鎰忎箟錛岃屽悗鍥為【鍙煡鍏舵剰錛屽洖鍏跺懗錛屾柟鏈夋垚鏁?/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鐩稿鏉ヨ寮規ц緝灝弤~

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     



    rikisand 2010-03-03 13:58 鍙戣〃璇勮
    ]]>
    More Effective C++ (1)http://www.shnenglu.com/zqsand/archive/2010/01/18/105931.htmlrikisandrikisandMon, 18 Jan 2010 06:16:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/01/18/105931.htmlhttp://www.shnenglu.com/zqsand/comments/105931.htmlhttp://www.shnenglu.com/zqsand/archive/2010/01/18/105931.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/105931.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/105931.html絎洓绔?nbsp; 鏁堢巼

    ······鏉℃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~------------------------------------------



    rikisand 2010-01-18 14:16 鍙戣〃璇勮
    ]]>
    鏂█鐨勪嬌鐢?/title><link>http://www.shnenglu.com/zqsand/archive/2010/01/17/105886.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Sun, 17 Jan 2010 11:36:00 GMT</pubDate><guid>http://www.shnenglu.com/zqsand/archive/2010/01/17/105886.html</guid><wfw:comment>http://www.shnenglu.com/zqsand/comments/105886.html</wfw:comment><comments>http://www.shnenglu.com/zqsand/archive/2010/01/17/105886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zqsand/comments/commentRss/105886.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zqsand/services/trackbacks/105886.html</trackback:ping><description><![CDATA[ <p>瑙e喅欏圭洰鐨勯棶棰橈紝鎰忚瘑鍒版柇璦鐨勯噸瑕佹с傚鏋滀竴涓▼搴忓湪鏌愬閬囧埌浜嗛潪娉曠殑鍊鹼紝閭d箞鏈濂界殑鎯呭喌渚挎槸鍦ㄦ鍒誨仠涓嬫姤閿欙紝鏈鍧忕殑鎯呭喌渚挎槸紼嬪簭涓嶅惌涓嶅搷鐨勬墽琛岀潃~~鐩村埌浣犲彂鐜頒粬鎵ц鐨勬柟寮忔瀬涓鴻寮傦紝姝ゆ椂錛屼綘瑕佽姳涔濈墰浜岃檸涔嬪姏鎵嶈兘鎵懼埌閿欒鎵鍦ㄤ箣澶剘~~~</p> <p>瀛︿範涓涓嬫柇璦鍚э細</p> <p><font size="3"><font face="YaHei Consolas Hybrid" color="#008000">·······浠涔堟槸鏂█</font></font></p> <p><font face="YaHei Consolas Hybrid" color="#008000" size="3">鍦ㄦ煇澶勫垽鏂煇涓涓〃杈懼紡鐨勫間負鐪熸垨鑰呭亣錛屽鏋滃亣鍒欒緭鍑洪敊璇秷鎭茍鍋滄紼嬪簭鐨勬墽琛寏</font></p> <p><font face="YaHei Consolas Hybrid" color="#008000" size="3">assert鏄畯錛岃屼笉鏄嚱鏁幫紝鍙湪debug鐗堟湰涓湁鏁堬紝鍥犳鏃犻渶鍦╮elease鐗堟湰鍒犻櫎銆?/font></p> <p><font face="YaHei Consolas Hybrid" color="#008000" size="3">·······鍝嚑縐嶆柇璦</font></p> <p><font face="YaHei Consolas Hybrid" color="#008000" size="3">MFC </font></p> <p><font face="YaHei Consolas Hybrid" color="#008000" size="3">ASSERT</font></p> <p>void foo(char* p,int size)<br>{<br>ASSERT(p != 0); // 楠岃瘉緙撳啿鍖烘寚閽?br>ASSERT((size >= 100); // 紜緙撳啿鍖哄ぇ灝忚嚦灝戜負100瀛楄妭<br>// foo 鍑芥暟鐨勫叾瀹冭綆楄繃紼?br>}<br>濡傛灉娌℃湁瀹氫箟_DEBUG棰勫鐞嗙錛屽垯璇ヨ鍙ヤ笉浼氱湡姝g敓鎴愪唬鐮併俈isual C++浼氬湪璋冭瘯妯″紡緙栬瘧鏃惰嚜鍔ㄥ畾涔塤DEBUG錛岃屽湪鍙戣妯″紡涓嬶紝璇ラ澶勭悊絎︽槸涓嶅瓨鍦ㄧ殑銆傚鏋滃畾涔変簡_DEBUG錛屽垯涓婅堪涓や釜鏂█鐢熸垚鐨勪唬鐮佺被濡傦細 <br>//ASSERT(p != 0);<br>do<br>{<br>if(!(p != 0) && AfxAssertFailedLine(__FILE__, __LINE__))<br>AfxDebugBreak();<br>} while(0);<br>//ASSERT((size >= 100);<br>do<br>{<br>if(!(size >= 100) && AfxAssertFailedLine(__FILE__,__LINE__))<br>AfxDebugBreak();<br>}while(0); </p><p><font face="YaHei Consolas Hybrid" color="#008080" size="3">ASSERT_KINDOF(classname,pObject); ASSERT_KINDOF(CDocument,pDocument);</font></p> <p><font face="YaHei Consolas Hybrid" color="#008080" size="3">媯楠宲Object鎸囧悜鐨勫璞℃槸classname綾葷殑涓涓璞℃垨鑰呭叾媧劇敓綾葷殑瀵硅薄</font></p> <p><font face="YaHei Consolas Hybrid" color="#008080" size="3">ASSERT_VALID(pObject); pObject 蹇呴』鏄竴涓淳鐢熶簬CObject綾葷殑綾誨璞★紝浼氳皟鐢ㄥ叾閲嶅啓鐨凙ssertValid鍑芥暟 錛屼緥濡?/font></p> <p>濡傛灉浣跨敤搴旂敤鍚戝鎴栫被鍚戝鐢熸垚鍩轟簬MFC鐨勭被錛岄氬父浼氬緱鍒癆ssertValid()鐨勯鏋訛紝鏈濂芥敼鍐欒繖浜涢鏋朵唬鐮佷互澧炲姞鏈鍩烘湰鐨勫畬鏁存ф鏌ャ備笅闈㈡槸涓涓吀鍨嬬殑渚嬪瓙錛岀被Sample浠嶤Object緇ф壙錛屽亣瀹氬畠鍚湁鑱屽憳鍚嶅瓧鍙婂叾钖按錛?<br>class Sample : public CObject<br>{<br>    protected:<br>    CString m_Name; // 鑱屽憳鍚嶅瓧<br>    double m_Salary; // 钖按<br>public:<br>    Sample(LPCTSTR name,double salary) : m_Name(name), m_Salary(salary) {}<br><em>   #ifdef _DEBUG<br>        virtual void AssertValid() const;<br>    #endif</em><br>};<br><em>#ifdef _DEBUG<br>void Sample::AssertValid() const<br>{<br>    CObject::AssertValid(); // 楠岃瘉鍩虹被<br>    ASSERT(!m_Name.IsEmpty()); // 楠岃瘉鑱屽憳鍚嶅瓧<br>    ASSERT(m_Salary > 0); // 楠岃瘉钖按<br>}<br>#endif</em> </p><p><font face="YaHei Consolas Hybrid" color="#408080" size="3">CRT assertion</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">_ASSERT 鍜?nbsp; _ASSERTE 鍚庝竴涓細鍦ㄥ嚭閿欐椂鍚屾椂鎵撳嵃鍑烘潯浠跺垽鏂彞</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">ANSI</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">assert()</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">娉ㄦ剰錛歛ssert鐢ㄤ簬媯嫻嬮潪娉曠殑杈撳叆錛屼絾鏄悎娉曠殑杈撳叆騫朵笉涓瀹氭槸姝g‘鐨勶紝渚嬪錛?/font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">int pB = (int*)malloc(sizeof(int)*1000);</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">assert(pB!=NULL) //閿欒鐨勪嬌鐢╝ssert 浠栦細鍦╮elease鐗堟湰澶辨晥~涔熷氨鏄assert涓嶅簲璇ュ紼嬪簭浜х敓鍓綔鐢?/font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">姝g‘鐨勫仛娉曪細</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">int pB = (int*) malloc(sizeof(int)*1000);</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">if(pB == NULL)</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">{<br>   //閿欒澶勭悊</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">}</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">else{</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">}</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">鍙︿竴涓緥瀛愶細</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">void draw(){</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">   CFigure* pF = getCF();</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">   assert(pf!=NULL);</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">   if(pf == NULL){}</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">   else{</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">   }</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">}</font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">姝ゅ錛屽浜巊etCF鏉ヨ榪斿洖鍊間負NULL鏄潪娉曠殑錛屽鏋滀粬鐨勮繑鍥炲煎彲鑳戒負null灝辨病蹇呰鍔犱笂assert璇彞銆?/font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">鑰屼笅闈㈢殑if璇彞鍒欐槸涓轟簡闃叉release鐗堟湰鍑虹幇null鎸囬拡鐨勬儏鍐點?</font></p> <p><font face="YaHei Consolas Hybrid" size="3"></font><font color="#408080"> </font></p> <p><font face="YaHei Consolas Hybrid" size="3"></font><font color="#408080"> </font></p> <p><font face="YaHei Consolas Hybrid" color="#408080" size="3">VERIFY()</font></p> <p><font color="#408080">鐢變簬ASSERT浠呭湪紼嬪簭鐨勮皟璇曠増璧蜂綔鐢紝嫻嬭瘯琛ㄨ揪寮忔繪槸琚姩鐨勩備篃灝辨槸璇達紝瀹冧滑涓嶈兘鍖呭惈璧嬪箋佸閲忋佸噺閲忕瓑鐪熸鏀瑰彉鏁版嵁鐨勬搷浣溿備絾鏈夋椂鍊欐垜浠渶瑕侀獙璇佷竴涓富鍔ㄨ〃杈懼紡錛屾瘮濡傝祴鍊艱鍙ャ傝繖鏃跺彲浠ヤ嬌鐢╒ERIFY浠f浛ASSERT銆備笅闈㈡槸涓涓緥瀛愶細 <br>void foo(char* p,int size)<br>{<br>char* q; // 鎸囬拡鐨勫壇鏈?br><em>VERIFY(q = p);</em> // 鎷瘋礉鎸囬拡騫舵墽琛岄獙璇?br>ASSERT((size >= 100); // 紜繚緙撳啿鍖哄ぇ灝忚嚦灝戜負100瀛楄妭<br>// 鎵ц foo 鐨勫叾瀹冩搷浣?br>}<br>鍦ㄨ皟璇曟ā寮忎笅ASSERT鍜孷ERIFY鏄浉鍚岀殑銆備絾鍦╮elease妯″紡涓嬶紝VERIFY鑳藉緇х畫瀵硅〃杈懼紡姹傚鹼紙浣嗕笉鍐嶈繘琛屾柇璦媯楠岋級錛岃孉SSERT璇彞鍦ㄦ晥鏋滀笂灝卞鍚屽凡緇忓垹闄や簡涓鏍楓?<br>灝界鍦∕FC婧愪唬鐮佷腑鍙互鎵懼埌涓浜涘簲鐢╒ERIFY鐨勪緥瀛愶紝浣咥SSERT鐢ㄥ緱鏇翠負鏅亶銆備竴浜涚▼搴忓憳鎬繪槸瀹屽叏閬垮厤浣跨敤VERIFY錛屽洜涓轟粬浠凡緇忎範鎯簬浣跨敤琚姩鏂█銆傝璁頒綇錛屽鏋滃湪ASSERT璇彞涓嬌鐢ㄤ簡涓誨姩琛ㄨ揪寮忥紝緙栬瘧鍣ㄤ笉浼氬彂鍑轟換浣曡鍛娿傚湪鍙戣妯″紡涓嬬紪璇戞椂璇ヨ〃杈懼紡浼氳鐩存帴鍒犻櫎錛屼粠鑰屽鑷寸▼搴忚繍琛岀殑閿欒銆傜敱浜庡彂琛岀増紼嬪簭涓嶅惈璋冭瘯淇℃伅錛岃繖縐嶇被鍨嬬殑閿欒鏄緢闅炬壘鍒板師鍥犵殑銆?</font> </p><p><font face="YaHei Consolas Hybrid" size="3"></font><font color="#408080"> </font></p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font> </p> <p><font face="YaHei Consolas Hybrid" color="#004080" size="3"></font></p><img src ="http://www.shnenglu.com/zqsand/aggbug/105886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zqsand/" target="_blank">rikisand</a> 2010-01-17 19:36 <a href="http://www.shnenglu.com/zqsand/archive/2010/01/17/105886.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>c++ RTTI (1)http://www.shnenglu.com/zqsand/archive/2010/01/03/104714.htmlrikisandrikisandSun, 03 Jan 2010 09:59:00 GMThttp://www.shnenglu.com/zqsand/archive/2010/01/03/104714.htmlhttp://www.shnenglu.com/zqsand/comments/104714.htmlhttp://www.shnenglu.com/zqsand/archive/2010/01/03/104714.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/104714.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/104714.html欏圭洰涓亣鍒頒簡 RTTI 鍏堝涓閮ㄥ垎 c++ primer鍐呭

    1. 榪愯鏃剁被鍨嬭瘑鍒細

    紼嬪簭鍙互浣跨敤鍩虹被鐨勬寚閽?/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);

    }

    榪欐牱鍙互澶勭悊鍩虹被瀛愮被娣峰悎鐨勭浉絳夊垽鏂簡



    rikisand 2010-01-03 17:59 鍙戣〃璇勮
    ]]>
    TC-Practice-Recordhttp://www.shnenglu.com/zqsand/archive/2009/12/26/104143.htmlrikisandrikisandSat, 26 Dec 2009 09:28:00 GMThttp://www.shnenglu.com/zqsand/archive/2009/12/26/104143.htmlhttp://www.shnenglu.com/zqsand/comments/104143.htmlhttp://www.shnenglu.com/zqsand/archive/2009/12/26/104143.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/104143.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/104143.htmltchs-1 none 1000pt DFS 鍒╃敤榪涘叆鐨勬柟鍚戝垝鍒嗗洓涓竟

    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>

    Code Snippet
         string wordSort(string s)
          {
                vector<string> SA,SB;
                string A="",B="";
                for(int i=0;i<s.size();i++)
                    if(s[i]>='A'&&s[i]<='Z'||(s[i]<='z'&&s[i]>='a')){
                        if(B!=""){
                          SB.push_back(B);B="";
                        }
                        A+=s[i];
                    }
                    else{
                        if(A!=""){
                          SA.push_back(A);A="";
                        }
                        B+=s[i];
                    }
                if(A!="")SA.push_back(A);if(B!="")SB.push_back(B);
                sort(SA.begin(),SA.end());string res="";
                int i=0;
                for(; i<SA.size()&&i<SB.size();i++)
                    if(s[0]>='A'&&s[0]<='Z'||(s[0]<='z'&&s[0]>='a'))
                        res=res+SA[i]+SB[i];
                    else
                        res=res+SB[i]+SA[i];
                for(;i<SA.size();i++)res+=SA[i];
                for(;i<SB.size();i++)res+=SB[i];
                return res;
          }

    鎬濊礬瑕佹竻鏅幫紝涓や釜杞浛璁板綍鍗沖彲

                    1000pt    鏄劇劧鐨凚FS 鍒╃敤闃熷垪 鍙槸棰樻剰涓嶅お濂界悊瑙o紝鏈濂芥妸鍒ゆ柇鍐欐垚灝忓嚱鏁幫紝涓葷▼搴忎細鐪嬭搗鏉ユ瘮杈冩竻鏅幫紝涓嶅鏄撳嚭閿檦 涓姝ヤ竴姝ユ潵



    rikisand 2009-12-26 17:28 鍙戣〃璇勮
    ]]>
    ALGORITHM IN C (1)http://www.shnenglu.com/zqsand/archive/2009/11/11/100725.htmlrikisandrikisandWed, 11 Nov 2009 12:18:00 GMThttp://www.shnenglu.com/zqsand/archive/2009/11/11/100725.htmlhttp://www.shnenglu.com/zqsand/comments/100725.htmlhttp://www.shnenglu.com/zqsand/archive/2009/11/11/100725.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/100725.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/100725.htmlSteps to developing a usable algorithm.
    • Define the problem.
    • Find an algorithm to solve it.
    • Fast enough?
    • If not, figure out why.
    • Find a way to address the problem.
    • Iterate until satisfied.

     

    涓昏鍐呭 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 璇曡瘯鏁堟灉鍝~

     

     

     

     

     

     

     

     



    rikisand 2009-11-11 20:18 鍙戣〃璇勮
    ]]>
    青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              欧美在现视频| 午夜精品福利一区二区蜜股av| 老司机午夜精品| 西西裸体人体做爰大胆久久久| 亚洲男人第一网站| 欧美一区二粉嫩精品国产一线天| 欧美一区二区三区四区高清| 久久九九精品| 欧美国产精品日韩| 国产精品高潮呻吟久久av黑人| 欧美视频一区二区三区四区| 国产精品一区二区三区久久久| 国产综合精品一区| 亚洲精品一区二区三区不| 亚洲五月六月| 美女被久久久| 一二三区精品| 久久国产婷婷国产香蕉| 欧美激情91| 国产欧美一区二区三区视频| 一区二区三区亚洲| 亚洲一区在线播放| 麻豆成人在线| 一本色道久久综合亚洲精品按摩| 亚洲淫片在线视频| 久久综合色88| 国产精品区一区二区三区| 亚洲第一在线视频| 欧美一区午夜精品| 亚洲伦理久久| 久久免费视频网| 国产精品日本| 一区二区三区成人精品| 麻豆成人综合网| 亚洲欧美日韩一区二区三区在线观看| 免费成人黄色av| 国模精品一区二区三区色天香| 国产精品99久久久久久有的能看| 久久阴道视频| 午夜视频在线观看一区| 欧美视频在线免费| 亚洲电影视频在线| 久久精品亚洲一区二区| 国产日韩欧美在线观看| 欧美成人69av| 国内成人精品2018免费看| 一区二区三区四区在线| 牛牛国产精品| 久久精品中文字幕一区| 国产精品有限公司| 亚洲午夜免费福利视频| 91久久国产综合久久蜜月精品| 亚洲一区二区不卡免费| 欧美日韩国产精品自在自线| 亚洲第一级黄色片| 欧美va亚洲va香蕉在线| 久久久久九九九九| 黄色小说综合网站| 久久免费黄色| 久久精品在线播放| 在线电影欧美日韩一区二区私密| 久久精品国产亚洲aⅴ| 午夜精品视频一区| 国产酒店精品激情| 久久精品国产综合精品| 亚洲欧美国产高清| 国产亚洲欧洲997久久综合| 欧美在线日韩精品| 久久国产精品久久国产精品| 韩国美女久久| 欧美国产大片| 欧美日韩精品免费观看视频| 亚洲一区二区精品| 欧美一级日韩一级| 在线观看国产日韩| 亚洲国产日韩在线| 欧美午夜视频在线| 午夜亚洲精品| 久久精品中文字幕一区二区三区| 在线免费观看欧美| 91久久精品久久国产性色也91| 蜜桃av综合| 亚洲视频免费在线| 欧美一区二区视频在线| 亚洲国产精品一区二区www在线| 欧美电影在线观看完整版| 欧美承认网站| 校园激情久久| 裸体一区二区三区| 亚洲午夜av| 久久精品男女| 99一区二区| 午夜精品国产精品大乳美女| 精品av久久707| 99精品欧美一区二区三区综合在线| 国产精品一二一区| 亚洲国产99| 国产精品网站在线观看| 美国成人毛片| 国产精品国产a级| 欧美国产日韩一区二区在线观看 | 国产乱码精品一区二区三区五月婷 | 久久久久国产精品人| 亚洲精品欧美日韩| 亚洲一区二区三区色| 亚洲国产日韩综合一区| 一本一本久久| 亚洲国产va精品久久久不卡综合| 一本色道久久综合一区| 亚洲欧洲一区二区三区| 欧美一区亚洲二区| 亚洲自拍偷拍网址| 欧美精品在线极品| 欧美不卡视频一区发布| 国产欧美日韩在线视频| 99视频一区二区| 最新精品在线| 麻豆精品国产91久久久久久| 久久精品1区| 国产精品网站在线| 亚洲图片欧美日产| 亚洲先锋成人| 欧美日韩在线一二三| 亚洲激情视频网站| 亚洲日本一区二区三区| 久久亚洲一区二区| 久久综合网色—综合色88| 国产视频一区二区在线观看| 亚洲午夜一区| 欧美一二三视频| 国产精品美女在线| 亚洲一区国产精品| 午夜久久电影网| 国产精品区一区二区三区| 一区二区三区日韩精品| 亚洲视频自拍偷拍| 国产精品video| 在线一区日本视频| 欧美有码视频| 国产一区二区三区观看| 午夜精品久久久久久久白皮肤| 性欧美xxxx视频在线观看| 国产精品色婷婷久久58| 亚洲一区二区少妇| 久久精品一区四区| 伊人春色精品| 欧美成人一二三| 亚洲乱码国产乱码精品精可以看| 国产精品99久久不卡二区| 国产精品成人aaaaa网站| 亚洲在线视频一区| 久久婷婷国产综合精品青草| 在线免费日韩片| 欧美片第一页| 亚洲欧美激情四射在线日 | 国产精品区一区二区三区| 亚洲一区在线直播| 裸体丰满少妇做受久久99精品| 在线观看一区欧美| 欧美激情一区三区| 亚洲女人av| 美女露胸一区二区三区| 一区二区三区精品视频| 国产乱码精品一区二区三区不卡| 久久国产高清| 亚洲精品少妇30p| 亚洲欧美日韩在线一区| 欧美国产免费| 亚洲综合精品自拍| 国产一区美女| 欧美久色视频| 久久国产精品免费一区| 91久久精品一区二区别| 欧美亚洲综合久久| 亚洲精品欧美| 国产自产高清不卡| 欧美日韩国产一区二区三区| 欧美一区二区网站| 日韩一级片网址| 六月婷婷一区| 午夜日本精品| 一区二区三区导航| 在线观看视频日韩| 国产欧美一区二区三区沐欲| 欧美极品在线播放| 久久久久久香蕉网| 亚洲欧美日韩综合aⅴ视频| 亚洲人成在线观看| 毛片基地黄久久久久久天堂| 小辣椒精品导航| 中日韩午夜理伦电影免费| 在线国产精品播放| 国产欧美日韩三区| 欧美午夜精品理论片a级按摩| 久久视频一区二区| 欧美在线播放高清精品| 亚洲性xxxx| 亚洲图片欧洲图片日韩av| 日韩视频一区二区三区| 亚洲国产精品va在线看黑人|