锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美婷婷久久,亚洲欧美日韩视频二区,欧美日韩影院http://www.shnenglu.com/zqsand/category/12249.html鍟ユ槸瀛愭爣棰?/description>zh-cnFri, 22 Jan 2010 12:27:00 GMTFri, 22 Jan 2010 12:27:00 GMT60More 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 鍙戣〃璇勮
]]>
State 妯″紡http://www.shnenglu.com/zqsand/archive/2009/12/29/104405.htmlrikisandrikisandTue, 29 Dec 2009 13:25:00 GMThttp://www.shnenglu.com/zqsand/archive/2009/12/29/104405.htmlhttp://www.shnenglu.com/zqsand/comments/104405.htmlhttp://www.shnenglu.com/zqsand/archive/2009/12/29/104405.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/104405.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/104405.htmlSTATE 妯″紡錛?/font>

涓涓璞$殑琛屼負鍙栧喅浜庝粬鐨勭姸鎬侊紝鑰屼笖瀹冨繀欏誨湪榪愯鏃舵牴鎹姸鎬佹敼鍙樹粬鐨勮涓恒傚父瑙勫疄鐜頒腑錛屼竴涓搷浣滃惈鏈夊簽澶х殑澶氬垎鏀殑鏉′歡璇彞錛屼笖榪欎簺鍒嗘敮渚濊禆浜庤瀵硅薄鐨勭姸鎬併傝繖涓姸鎬侀氬父浣跨敤涓涓垨鑰呭涓灇涓懼父閲忚〃紺恒係Tate妯″紡鎶婅繖浜涚姸鎬佹椂鍊欑殑瀵硅薄鐪嬪仛涓涓嫭绔嬬殑瀵硅薄錛屼篃灝辨槸灝嗕笉鍚岀姸鎬佹椂鐨勮涓哄垎鏁e埌鐩稿簲鐨勭姸鎬佺被涓傝杈懼埌榪欐牱鐨勬晥鏋滐紝闇瑕乧ontext錛屼篃灝辨槸鐘舵佺殑鎸佹湁鑰咃紝鍗沖師鍏堢殑綾伙紱鎶借薄鐘舵佺被錛屼粬灝佽浜嗕笌context浜や簰鐨勬帴鍙o紱鍏蜂綋鐘舵佺被錛屼篃灝辨槸涓涓釜鐨勫叿浣撶姸鎬併俢ontext涓繚瀛樹竴涓娊璞$姸鎬佺被瀵硅薄涓烘垚鍛橈紝騫禿elegate瀵硅薄琛屼負緇欎粬錛屼粠鑰屼嬌鐩稿簲鐘舵佷笅鐨勮涓轟唬鐮佺敓鏁堛傚鏋滅姸鎬佹敼鍙樼殑鍑嗗垯涓嶆槸鍥哄畾鐨勫垯state鐘舵佺被鍚屾椂搴旇閲嶅啓changestate綾諱互鎺у埗鐘舵佺殑鏀瑰彉錛屽惁鍒欏彲浠ュ湪context涓疄鐜般?/font>

鍏蜂綋鍒版垜浠殑欏圭洰錛?/font>

姣忎竴涓猟evice鍗充負context錛屼粬鎷ユ湁涓涓猻tate瀵硅薄錛宒evice涓殑鍑芥暟processMsg(){state->processMSg();} 鐢變簬鐘舵佹敼鍙樼殑瑙勫垯渚濊禆浜庢敹鍒扮殑娑堟伅錛屼篃灝辨槸璇翠竴涓姸鎬佸彲鑳借漿鎹㈠埌澶氫釜鐘舵乨evice鐨勬瘡涓姸鎬侀渶瑕侀噸鍐檚tatechange鏂規硶錛宻tateChange(){state->stateChange(this錛宮sg);} 榪欐牱錛屼笉鍚岀殑鐘舵佷笅鐨勮涓哄疄鐜板湪鍏蜂綋鐘舵佺殑綾諱腑錛屾瘮鍘熷厛鐨勭増鏈竻鏅版槑浜嗭紝鍙鎬ф洿寮恒?/font>



rikisand 2009-12-29 21:25 鍙戣〃璇勮
]]>
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 鍙戣〃璇勮
]]>
11.7http://www.shnenglu.com/zqsand/archive/2009/11/07/100354.htmlrikisandrikisandSat, 07 Nov 2009 13:18:00 GMThttp://www.shnenglu.com/zqsand/archive/2009/11/07/100354.htmlhttp://www.shnenglu.com/zqsand/comments/100354.htmlhttp://www.shnenglu.com/zqsand/archive/2009/11/07/100354.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/100354.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/100354.html
what's this
and ...
鎭?錛屽仛瀹屼簡灝辮鍐欎笅鏉?鐪佺殑涔嬪悗蹇樹簡
鏄ㄥぉ鐪嬬殑misof鐨勬暀紼?鍏充簬鏁皛 浠婂ぉ鍋氫簡鍏朵腑鐨勬彁鍒扮殑渚嬮錛?/div>
BorelSe:
simple鐨勯~絎竴嬈℃病鎼炲錛屾悶瀹屽悗鍙戠幇榪樻槸鍐欓夯鐑︿簡銆傞鐩腑鏄庣‘璇存槑錛屼篃鏄捐屾槗瑙佺殑鏄┖闆嗗拰鍏ㄩ泦涓瀹氭槸B闆嗛噷鐨?錛屾垜榪樿垂蹇冨幓澶勭悊絀洪泦銆傘傘?/div>
鍏舵錛岄噸澶嶇殑鏁板瓧涓嶇敤澶勭悊錛屽洜涓虹敤鐨勬槸鎴栨搷浣溿?/div>
鍓╀笅鐨勫氨鏄敤涓涓暟緇勫拰涓涓猻et涓嶆柇寰幆浜嗭紝鍏跺疄鐢ㄩ槦鍒楁晥鏋滃緢濂界殑錛屾仼···

 1         int howMany(int size, vector <string> sub)
 2         {
 3                  set<int> q;q.clear();string str;
 4                  int mask=(1<<size)-1;
 5                  VI C;
 6                  REPV(sub,i){
 7                      if(sub[i]=="")C.push_back(0),q.insert(0);
 8                      else{
 9                       set<int> vec;
10                       stringstream ss(sub[i]);str="";
11                       while(ss>>str) {
12                                     if(str=="")vec.insert(0);
13                                     else vec.insert(atoi(str.c_str())-1); 
14                                     } 
15                      
16                     int now=0;
17                     for(set<int>::iterator it=vec.begin();it!=vec.end();it++){
18                         now|=(1<<(*it));
19                     }
20                     if(q.count(now)==0) C.push_back(now),q.insert(now);
21                     } 
22                 }
23                 int last=q.size();
24                 while(true){
25                     REPV(C,i) 
26                     {
27                         int s=C[i]^mask;if(q.count(s)==0)C.push_back(s),q.insert(s);
28                         REP(j,i)
29                         {
30                         int k= C[i]|C[j];
31                         if(q.count(k)==0)C.push_back(k),q.insert(k);
32                         }
33                     }
34                     if(last==q.size())return last;
35                     else last=q.size();
36                 }
37         }
鍏充簬鏁板瓧錛?/div>
2鐨刵嬈℃柟 鎹㈢畻鎴?10鐨勬鏂?澶ф鏄?n/3 鏁伴噺綰х殑 涔熷氨鏄 鍙?n/3+1 澶у皬灝卞彲浠ヤ簡
榪欎釜鏄痙ouble 鐨勬暟鎹?/div>
 signexponentmantissa
single precision1823
double precision11152

     


rikisand 2009-11-07 21:18 鍙戣〃璇勮
]]>Hello Blog World~~ http://www.shnenglu.com/zqsand/archive/2009/11/07/100348.htmlrikisandrikisandSat, 07 Nov 2009 11:27:00 GMThttp://www.shnenglu.com/zqsand/archive/2009/11/07/100348.htmlhttp://www.shnenglu.com/zqsand/comments/100348.htmlhttp://www.shnenglu.com/zqsand/archive/2009/11/07/100348.html#Feedback0http://www.shnenglu.com/zqsand/comments/commentRss/100348.htmlhttp://www.shnenglu.com/zqsand/services/trackbacks/100348.html鍛靛懙~~ just test

#include<iostream>
using namespace std;
int main()
{
   cout
<<"hello world~"<<endl;
   
return 0;
}


rikisand 2009-11-07 19:27 鍙戣〃璇勮
]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲欧洲日夜超级视频| 美女主播精品视频一二三四| 久久aⅴ国产欧美74aaa| 午夜精品99久久免费| 欧美一区二区三区四区夜夜大片 | 欧美人与禽猛交乱配| 麻豆av福利av久久av| 欧美黄色免费| 国产精品久久一级| 国产精品永久免费视频| 黄色av日韩| 欧美在线3区| 久久久久久亚洲综合影院红桃 | 久久一区中文字幕| 女人天堂亚洲aⅴ在线观看| 亚洲国产日韩欧美在线动漫| 亚洲激情不卡| 午夜视频在线观看一区二区三区 | 国产精品卡一卡二| 在线欧美一区| 亚洲免费一在线| 美女网站久久| 亚洲午夜高清视频| 老司机午夜免费精品视频| 欧美日韩免费一区二区三区| 国产午夜精品一区二区三区欧美| 亚洲国产99精品国自产| 性欧美大战久久久久久久久| 欧美激情精品久久久久久久变态| 一区二区三区国产精品| 久久综合影音| 国产精品盗摄久久久| 欧美日韩日日夜夜| 激情丁香综合| 午夜视频在线观看一区二区三区| 欧美96在线丨欧| 亚洲小说欧美另类社区| 牛牛影视久久网| 国产毛片一区二区| 亚洲一区影音先锋| 亚洲人成在线播放| 蜜桃久久av一区| 狠狠v欧美v日韩v亚洲ⅴ| 午夜精品久久久久久久| 亚洲精品乱码久久久久久久久| 久久国产乱子精品免费女| 国产精品区一区| 亚洲一区二区视频| 99国产精品久久久久久久久久| 久久综合九色99| 好看不卡的中文字幕| 欧美有码视频| 香蕉久久夜色精品国产使用方法| 国产精品magnet| 亚洲天堂黄色| 一区二区av在线| 欧美性猛交一区二区三区精品| 一区二区三区久久网| 亚洲日本中文字幕区| 久久这里只有| 久久精品官网| 在线观看欧美成人| 老司机精品视频网站| 久久精品国产欧美激情| 国内综合精品午夜久久资源| 久久人人爽人人| 久久一日本道色综合久久| 亚洲电影毛片| 亚洲国产日韩一区| 欧美日韩在线视频一区| 亚洲男人天堂2024| 亚洲一区精品电影| 国产亚洲视频在线| 免费成人你懂的| 牛牛国产精品| 亚洲在线免费| 欧美在线观看视频一区二区| 伊人精品久久久久7777| 欧美激情网友自拍| 欧美午夜精品一区二区三区| 欧美一区二区成人| 老司机精品导航| 亚洲视频在线视频| 欧美一站二站| 一本一本久久a久久精品综合妖精| 日韩写真视频在线观看| 国产精品亚洲产品| 亚洲高清成人| 国产精品美女久久久浪潮软件 | 欧美一级视频精品观看| 久久av一区二区三区| 亚洲福利视频免费观看| 亚洲精品免费观看| 国产女精品视频网站免费| 美女亚洲精品| 欧美日韩亚洲一区二区三区| 久久国产色av| 欧美激情综合色综合啪啪| 香蕉久久夜色精品国产使用方法| 久久久精品一区| 亚洲先锋成人| 裸体女人亚洲精品一区| 亚洲欧美日韩电影| 久久亚洲精选| 久久国内精品自在自线400部| 美女图片一区二区| 欧美在线影院| 欧美色道久久88综合亚洲精品| 国产精品视频一区二区三区| 榴莲视频成人在线观看| 国产精品mm| 亚洲福利免费| 激情欧美日韩| 亚洲中字黄色| 99精品99久久久久久宅男| 欧美在线视频在线播放完整版免费观看 | 91久久久精品| 欧美有码视频| 午夜精品亚洲一区二区三区嫩草| 久久阴道视频| 久久久亚洲精品一区二区三区| 欧美日韩一区二区三区四区五区| 蜜桃av噜噜一区二区三区| 国产精品亚洲аv天堂网| 99在线精品视频| 99视频精品| 欧美大片免费久久精品三p | 在线综合视频| 一区二区三区欧美在线| 欧美国产日韩亚洲一区| 欧美韩日一区二区| 亚洲丶国产丶欧美一区二区三区 | 欧美激情一区二区三区全黄| 欧美黄色一区| 亚洲第一视频| 男人的天堂亚洲在线| 欧美成人小视频| 亚洲国产日韩一区二区| 美女精品在线观看| 亚洲国产导航| 99视频超级精品| 欧美日韩在线视频观看| 一区二区久久| 久久国产福利国产秒拍| 国产一区二区三区直播精品电影| 午夜欧美不卡精品aaaaa| 欧美在线免费视频| 亚洲国产欧美一区二区三区久久 | 亚洲欧美国产精品专区久久| 欧美理论电影在线播放| 亚洲精品日本| 亚洲一区二区三| 国产九色精品成人porny| 亚洲欧美在线网| 国产欧美高清| 久久精品一二三区| 亚洲第一区在线| 亚洲视频狠狠| 国产亚洲午夜高清国产拍精品| 久久精品99国产精品酒店日本| 欧美电影免费| 9色精品在线| 国产视频精品xxxx| 欧美高清视频一区| 亚洲欧美日本日韩| 亚洲福利国产| 久久成人精品| 亚洲精品国产品国语在线app| 欧美日韩一区二区三区在线看 | 久久一区视频| 一本色道久久综合亚洲精品按摩 | 亚洲一区国产视频| 葵司免费一区二区三区四区五区| 亚洲国产精品久久久久婷婷884 | 午夜精品福利电影| 欧美成人a∨高清免费观看| 亚洲视频在线免费观看| 一区在线影院| 国产精品久久久久一区二区| 久久综合给合久久狠狠狠97色69| 99成人在线| 欧美大片在线看| 久久国内精品视频| 中国成人亚色综合网站| 一区二区三区在线视频观看| 欧美日韩亚洲高清| 免费成人高清视频| 亚洲欧美日韩天堂| 日韩视频在线观看| 亚洲第一中文字幕| 久久久美女艺术照精彩视频福利播放| 99re热精品| 亚洲黄色毛片| 国产一区二区三区久久久久久久久| 欧美连裤袜在线视频| 久久视频这里只有精品| 午夜精品久久久久久久99水蜜桃 | 欧美日韩国产一中文字不卡| 午夜视频精品| 一区二区三区蜜桃网|