正在阅读:C++和C#构造函数的区别C++和C#构造函数的区别

2004-08-06 10:06 出处:CSDN 作者:classfactory 责任编辑:linjixiong

  (1)C++ 不允许在一个构造函数中调用另外一个构造函数(称为委派构造函数调用),而 C# 则允许。例如:

  C++:



  struct Point {
  public:
  int X, Y;
  Point(int x, int y);
  Point(Point pt) : Point(pt.X, pt.Y) { } // 错误,C++ 不允许
  };

  C#:


  struct Point {
  public int X, Y;
  public Point(int x, int y);
  public Point(Point pt) : Point(pt.X, pt.Y) { } // 可以,C# 允许
  };

  委派构造函数调用语法上非常自然和易懂,因此你也许会质疑 C++ 不提供它是不是故意给程序员添麻烦。事实上,C++ 不提供这一特性并不是出于语法上的考虑,而是出于资源管理的考虑(噢,这样的事情对 C++ 来说还有很多很多)。

  我们知道,C++ 的构造函数用于分配资源,而析构函数用于释放资源,构造函数和析构函数调用必须匹配,否则就打破了 C++ 的基本规则。

  如果允许委派构造函数调用,则显然会打破这一规则——构造函数被执行两次,而析构函数只执行一次。当然,对一些类,例如前面的那个 Point 来说这不是个问题,但是从语言机制的角度讲这个特性可能属于“危险”的特性。注:在最新的 C++ 标准提议草案中,Herb 等人有一个关于允许委派构造函数调用的提案,当然这很大程度上是为了方便 C++/CLI 绑定。

  (2)在 C++ 构造函数中,虚函数调用会被编译器自动转为普通函数调用,而在 C# 构造函数中允许进行虚函数调用。C++ 这样处理自然有它的原因——在 C++ 中,构造函数执行完成后对象才初始化好,对于多态对象来说,也就意味着构造函数在背后执行了很重要的一件事情——初始化对象的虚函数表。

  如果我们在基类的构造函数中调用了虚函数,则因为此时对象的虚函数表仍旧是基类的虚函数表,所以无法进行正确的虚函数调用。也就是这个原因,通常我们应该避免在构造函数中调用虚函数,因为它违背了虚函数的语义。而在 C# 中,在对象的构造函数执行之前对象的类型信息就已经初始化好了,所以可以进行正常的虚函数调用。


察看评论详细内容 我要发表评论
作者笔名 简短内容 发表时间
:

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劌銈搁弻鐔兼儌閸濄儳袦闂佸搫鐭夌紞渚€銆佸鈧幃娆撳箹椤撶噥妫ч梻鍌氬€稿ú銈壦囬悽绋胯摕闁靛ǹ鍎弨浠嬫煕閳╁啰鎳冩い銈傚亾濠碉紕鍋戦崐鏇犳崲閹烘挻鍙忓瀣椤洟鏌熼悜姗嗘當闁绘帒鐏氶妵鍕箳瀹ュ牆鍘$紓浣叉閸嬫捇姊绘担鍛靛綊寮甸鍕┾偓鍐幢濞戞ɑ顥濋梺閫炲苯澧存慨濠勭帛閹峰懘鎼归悷鎵偧闂佽棄鍟虫禍顒勫箟閹间礁绾ч柛顭戝枟濞堝姊虹化鏇熸澒闁稿鎸搁—鍐Χ閸℃娼戦梺绋款儐閹稿濡甸崟顖氬嵆闁靛ǹ鍎辩粻璇测攽閳ュ啿绾ч柛鏃€鐟╅悰顔碱潨閳ь剟鐛崶銊﹀闁荤喐婢橀崢鐐烘⒒娴e憡鎯堟い锔诲灦閹囧礋椤栨氨顦悗鍏夊亾闁告洦鍋勯崵鎴︽⒑绾懏褰ч梻鍕閸╂盯骞嬮敂鐣屽幈濠电娀娼уΛ妤咁敂閳哄懏鐓涢柛鈩冡缚閹冲洭鏌″畝瀣埌閾绘牠鏌嶈閸撴盯鍩€椤掍胶鐓柛妤€鍟块悾宄懊洪鍕姦濡炪倖甯婇梽宥嗙濠婂牊鐓欓弶鍫濆⒔缁嬭崵鐥鐐差暢缂佽鲸甯¢獮鍥敇閻斿弶瀚介梻渚€鈧偛鑻晶顖涖亜閺冣偓閻楃姴鐣锋导鏉戝嵆闁绘ɑ褰冮悘濠傗攽閻愬弶顥為柟绋跨埣閸┾偓妞ゆ垼娉曢ˇ锔姐亜椤愶絿鐭掗柛鈹惧亾濡炪倖甯掔€氼剛绮婚弽銊х闁糕剝蓱鐏忎即鏌涢妶鍡楃伌闁哄本鐩俊鎼佹晜闁款垱顫嶅┑鐐茬摠缁挾绮婚弽顓炶摕婵炴垟鎳囬埀顒婄畵楠炲鈹戦崶鈺€绨梻鍌欐祰閵嗏偓闁稿鎸搁湁闁绘ê妯婇崕鎰版煟閹惧崬鍔滅紒缁樼洴楠炲鎮樺ú璁抽偗妞ゃ垺妫冮崺鈩冨閸楃偟绉洪柟顔规櫅閳诲氦绠涢弬鎸庮仱缂備胶鍋撻崕鎶藉触鐎n喖桅闁告洦鍨伴崡鎶芥煟閹邦厽缍戞繛鍜冪秮濮婅櫣鎷犻弻銉у椽婵犵鈧櫕鍠橀柛鈹惧亾濡炪倖甯婄欢锟犲疮韫囨稒鐓曢柨婵嗛濞呭秶鈧娲橀崹鍓佹崲濠靛鐐婄憸蹇涙偩濞差亝鈷戦柛鎰级閹牓鏌涢悢绋款棆濠㈣娲熷畷妤呮⒒鐎靛摜鐣炬俊鐐€栭悧婊堝磻閻愬搫鏋侀梺顒€绉甸崐鍨叏濮楀棗鍘甸柛瀣ㄥ灪閹便劍绻濋崒銈囧悑閻庤娲樼敮鎺楀煝鎼淬劌绠i柨婵嗘川瀹曞爼姊婚崒娆掑厡閺嬵亝銇勯幋婵囧櫣閾荤偞绻濋棃娑欘棤闁哄棴绠撻弻鐔衡偓娑欋缚婵″洦淇婇幓鎺斿ⅵ闁哄本娲濈粻娑欑箾閹傚闂佹儳娴氶崑鎺楀触閸涱厸鏀介柨娑樺娴滃ジ鏌涙繝鍐⒌闁诡啫鍏炬棃宕橀鍡欏幆闂備礁婀遍崕銈夊垂閻旂厧鍑犵€广儱顦伴悡鐔镐繆椤栨繂浜归悽顖涚洴閺岋綁骞樼€靛憡鍣紓浣介哺閹稿骞忛崨瀛橆棃婵炴垶鐭幃锝夋⒒娴e憡鎯堟い鎴濇喘瀹曚即寮介鐐舵憰闂佹寧绻傞ˇ顖滅不婵犳碍鍊甸梻鍫熺⊕閸熺偤鏌涢敐搴″籍婵﹥妞藉Λ鍐ㄢ槈濞嗘劖鍊烽梺璇插绾板秴顭垮鈧、姘舵晲婢舵ɑ鏅梺閫炲苯澧寸€规洘妞介崺鈧い鎺嶉檷娴滄粓鏌熼悜妯虹仴妞ゅ繑鎸抽弻鈩冩媴缁嬫浠剧紓浣虹帛閻╊垰鐣烽崡鐐嶆棃宕橀鍡樻瘔缂傚倸鍊搁崐鎼佸磹閻熸壆鏆嗛柟闂寸閽冪喖鏌i弮鍌氬付缂佺姰鍎查妵鍕籍閸屾瀚涢梺鍝勬-閸欏啫顫忛搹鍦<婵☆垵顕ч棄宥夋⒑閼姐倕鏆€闁搞儜鍛Е婵$偑鍊栫敮鎺楀磹瑜版帒鍚归柍褜鍓熼弻锝嗘償閵忕姴姣堥梺鍝ュУ椤ㄥ﹤顕i懠顒佸磯濞达絾娲樺Λ鍐ㄧ暦閵娾晩鏁囬柣鎰綑閸旀帡姊婚崒娆戝妽闁诡喖鐖煎畷鏇㈩敋閳ь剙顕i浣虹懝闁逞屽墮閻g兘骞嬮敃鈧粻濠氭煠閹间焦娑ч柡瀣€垮娲川婵犲啫顦╅梺鍛婃尰閻╊垶寮鍜佹建闁逞屽墮椤繐煤椤忓嫬绐涙繝鐢靛Т閸熶即宕i崱娆戠=濞达絽澹婂Σ鎼佹煟閺嵮佸仮闁绘侗鍣i獮瀣晝閳ь剟锝為崨瀛樼厽婵妫楁禍婵嬫煛閸屾浜鹃梻鍌欐祰椤曆囧礄閻e瞼绀婇柛鈩冡缚椤╂煡鏌i幇顔煎妺闁哄拋鍓氱换婵囩節閸屾碍娈滈梺琛″亾濞寸姴顑嗛悡鐔兼煙闁箑澧紒鐙欏嫨浜滈柕澹啩妲愰梺鍝勬湰閻╊垰顕i鈧崺鈧い鎺戝閸嬪鏌eΟ娆惧殭闁哄嫨鍎甸弻鏇$疀鐎n亖鍋撻弴銏犵闁规儼濮ら悡鐔兼煛閸愩劍澶勬い蹇曞█閺岋綁鏁冮埀顒勬偋閹炬剚娼栭柛婵嗗珔瑜斿畷鎯邦槾濞寸厧鐗嗛埞鎴︽倷閺夊灝鐨熼梺鍛婂姀閺呮粓鎯佹惔銏㈢瘈缁炬澘顦辩壕鍧楁煕鐎n偄鐏寸€规洘鍔橀ˇ瀵哥磼鏉堚晛浠遍柛鈹惧亾濡炪倖甯婂鎺旀崲閸℃ǜ浜滈柟鎵虫櫅閻忊晜銇勮箛濠冩珖闁逞屽墲椤骞愰崫銉㈠亾濮橆厽绶叉い顐㈢箰鐓ゆい蹇撳缁愭稒绻濋悽闈浶㈤悗姘€鍕弿闁搞儜鈧弨浠嬫煟閹邦厼绲婚柟顔藉灴閺岋綁鎮㈠┑鍡楊伀闁绘繂鐖奸弻锟犲炊閳轰焦鐏佺紓浣叉閸嬫挻绻濆▓鍨灍闁挎洍鏅犲畷銏°偅閸愩劌鍋嶉梺姹囧灩閹诧繝鍩涢幋鐘垫/妞ゆ挾鍋炴刊鍏肩箾閸忕厧濮嶉柡灞剧洴瀵噣骞橀崜浣规闁诲氦顫夊ú鐔丰缚瑜旈崺銏℃償閵娿儳顓洪梺缁樶缚椤n喚妲愰弻銉︹拻濞达綀娅g敮娑㈡煟閻旀潙鐏茬€规洘鍨块獮妯肩磼濡厧骞堥梻渚€娼ф灙闁稿孩濞婂畷娲晲閸ワ絽浜炬繛鍫濈仢閺嬫稒銇勯銏℃暠濞e洤锕獮鏍ㄦ媴閸濄儱骞愰梻浣呵归張顒勬儗椤旀崘濮冲ù鐘差儐閳锋帒霉閿濆懏鍤堢憸鐗堝笒鐎氬銇勯幒鎴濃偓濠氭儗濞嗘挻鐓欓弶鍫熷劤閻︽粓鏌℃担绋库偓鍧楀蓟閵娾晜鍋嗛柛灞剧☉椤忥拷闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽弫鎰緞婵犲嫷鍚呴梻浣瑰缁诲倿骞夊☉銏犵缂備焦岣块崢杈ㄧ節閻㈤潧孝闁稿﹤缍婂畷鎴﹀Ψ閳哄倻鍘搁柣蹇曞仩椤曆勬叏閸屾壕鍋撳▓鍨灍闁瑰憡濞婇獮鍐ㄢ枎瀵版繂婀遍埀顒婄秵娴滄瑦绔熼弴銏♀拺闁告稑锕︾紓姘舵煕鎼淬倖鐝紒瀣槸椤撳吋寰勭€n剙骞愰柣搴$畭閸庤鲸顨ラ幖浣哄祦婵°倕鎳忛悡鐔兼煙閹呮憼缂佲偓閸愵喗鐓忛柛銉戝喚浼冨Δ鐘靛仜濞差厼鐣峰⿰鍕闁间粙鏀遍崹鍦閹惧瓨濯撮柟缁樺笂婢规洟姊绘笟鈧埀顒傚仜閼活垱鏅堕幍顔剧<閺夊牄鍔屽ù顕€鏌熼鐣屾噰妞ゃ垺顨婇崺鈧い鎺戝缁€澶愭煏閸繃顥犵紒鐘插⒔閻ヮ亪顢橀姀鈺傤棖缂備讲妾ч崑鎾绘煟鎼淬埄鍟忛柛鐘崇墵閳ワ箓鎮滈挊澶岀暫闂侀潧绻堥崐鏍磻閸岀偛绠归弶鍫濆⒔閹ジ鏌¢崱鏇炲祮婵﹦绮幏鍛存惞閻熸壆顐兼俊鐐€戦崝宀勫箠濮椻偓楠炲啳顦叉顏冨嵆瀹曟鎮欓鍌涘垱閻庤娲滈崰鏍€佸鈧幃鈺冨枈婢跺苯绨ラ梻鍌氬€峰ù鍥敋閺嶎厼鍨傞幖娣妼缁€鍐煥濠靛棙顥滈柣锕佷含缁辨捇宕掑顑藉亾妞嬪孩顐介柨鐔哄Т闂傤垱銇勯弴妤€浜鹃悗瑙勬礀缂嶅﹪鐛惔銊﹀癄濠㈣泛鐭堥崬褰掓⒒娓氣偓濞佳呮崲閹烘挻鍙忔い鎾跺€i敐澶婇唶闁靛濡囬崢顏堟椤愩垺澶勬繛鍙夌墪閺嗏晜淇婇悙顏勨偓鏍箰閹间礁绠规い鎰剁畱閻撴﹢鏌熸潏楣冩闁稿﹦鍏橀弻娑樷枎韫囷絾鈻撳┑鈽嗗亞閸嬬喓妲愰幘瀛樺闁惧繒鎳撶粭锟犳煟閵忊晛鐏℃い銊ョ墢閸掓帞鈧綆鍠栫粻鎶芥煙閹呭煟婵$虎鍣e娲川婵犲嫧妲堥柤鐟扮焸閺岀喖鏌ㄧ€n偁浠㈠┑顔硷攻濡炶棄鐣烽妸锔剧瘈闁告洦鍘鹃弳銈夋⒑鐠囨彃顒㈤柛鎴濈秺瀹曟粓鎮㈢粭琛″亾娓氣偓瀵噣宕煎顏傚姂閺屽秹宕崟顐熷亾婵犳艾鍌ㄩ梺顒€绉甸悡娆撴煠閸︻厼顣肩憸鎶婂懐纾奸柡灞诲劤閻h櫣鈧鍠楁繛濠囥€佸Δ浣虹懝闁搞儺鐓堥崯宥夋⒒娴h櫣甯涢柛鏃€鐗為妵鎰板礃椤斿吋杈堝┑鐐叉閸旀垶绂嶅⿰鍕╀簻闁规澘澧庨幃濂告煟椤撶喎娴柡灞剧洴閸╃偤骞嗚婢规洖鈹戦敍鍕杭闁稿﹥鐗滈弫顕€骞掗弬鍝勪壕婵ḿ鍘ф晶鎵磼椤旂⒈鐓肩€殿喕绮欐俊姝岊槾妞ゆ梹娲熷铏瑰寲閺囩偛鈷夐柦鍐憾閹ǹ绠涢敐鍛缂備浇椴哥敮锟犲箖椤忓嫧鏋庨煫鍥ㄦ煥椤︹晠姊虹紒妯诲鞍婵炲弶锕㈡俊鐢稿礋椤栵絾鏅i梺缁樻椤ユ挻绂掗幘顔解拺闁告繂瀚烽崕宥夋煕婵犲喚娈滄鐐差樀楠炴牗鎷呴悷棰佺綍闂備礁澹婇崑鍛崲閸曨剛顩烽柟缁㈠枟閳锋垿鎮楅崷顓烆€屾繛鍏煎姍閺屾盯濡搁妷锕€浠村Δ鐘靛仜閸燁偊鍩㈡惔銊ョ闁哄鍨堕缁樹繆閻愵亜鈧牜鏁繝鍥ㄥ€块柨鏇炲€哥粣妤呮煛瀹ュ骸浜炵痪鍙ョ矙閺屾稓浠﹂崜褎鍣柣鐘冲姃閸楁娊寮诲☉銏″亹鐎规洖娲ら埛鍫㈢磽娓氬洤鏋熸俊顐㈠暙閻i攱绺界粙鍨祮闂佺粯鍔栭鏍i幘顔解拻濞达絽鎲$拹锟犳煕鎼存稑鈧繈濡撮崘顔煎窛妞ゆ牗绮堢粭澶嬬節閻㈤潧校缁炬澘绉瑰畷鎴︽晲婢跺鍘遍梺闈涱樈閸犳洜鑺辨繝姘參闁告洦鍋侀崑銏ゆ煛瀹€鈧崰鏍箠閻愬搫唯闁挎梻铏庡Σ顒勬⒒娴e摜鏋冩い顐㈩樀瀹曞綊宕稿Δ鈧粻鏍ㄧ箾閸℃ɑ灏紒鐙欏洦鐓欓悗鐢登瑰皬闂佺懓顕崗妯侯潖缂佹ɑ濯撮柧蹇撶畭閳ь剙锕弻锟犲川椤斾勘鈧帡鏌嶈閸撴氨鍠婂鍜佺唵婵せ鍋撴い銏″哺閺佹劖寰勫Ο缁樻珖闂備焦瀵уú宥夊磻閹惧墎纾奸柍褜鍓熷畷姗€鍩炴径鍝ョ泿闂備礁鎼崯顐﹀磹閻熸壋鏋嶉柡鍥ュ灪閻撴洘绻涢崱妤冪妞ゃ儲绮撻弻宥囨喆閸曨偆浼岄梺璇″枓閺呮繄妲愰幒鎳崇喐绻濆顓熸婵犵數濮烽。钘壩i崨鏉戠;闁告稑鐡ㄩ崑锟犳煃閸濆嫬顏柨娑樺€垮缁樻媴閾忕懓绗$€光偓閿濆懏鍋ョ€规洘鍨挎俊鎼佹晜缂併垺閿ゆ繝鐢靛Т閿曘倝鎮ф繝鍥ㄥ亗闁靛鏅滈悡娑㈡煕鐏炲墽鈽夋い鏇熺矒閺岀喖顢涘鍗炩叺闂佸搫鏈惄顖氼嚕椤曗偓楠炴ḿ绱掑鍡忓亾瀹ュ鈷戦梺顐g〒閳规帡鏌涢弬璺ㄐら柟骞垮灩閳规垹鈧綆浜為ˇ銊╂⒑瀹曞洦鍤€闁靛洦锕㈤幖瑙勬償閵婏妇鍘介柟鍏肩暘閸娿倕岣块幇顓犵闁圭粯甯炵粻鑽も偓瑙勬礃缁诲倿顢樻總绋跨倞闁靛ǹ鍎辩花銉︾節閻㈤潧鈻堟繛浣冲浂鏁勯柛娑卞灣閻棝鏌涢幇闈涙灍闁绘挾鍠栭弻鐔稿鐎涙ɑ閿繝鈷€鍛笡濞e洤锕、鏇㈡晲閸モ晝鏉芥繝娈垮枛閿曘倝鈥﹀畡鎵殾闁圭儤鍨熼弸搴ㄦ煙閻戞ê鐏ラ悽顖e灦濮婄粯鎷呮笟顖涙暞濠电偛鎳忓ú鐔肩嵁閹达箑鐐婄憸蹇涘汲閿曞倹鐓熼柕蹇婃嚉瑜版帒绀冮柍褜鍓欓—鍐Χ閸℃ê鏆楅梺绋款儑閸犳牠銆佸▎鎾冲耿婵炴垶鐟㈤幏娲煟閻樺厖鑸柛鏂胯嫰閳诲秹骞囬悧鍫㈠幍闂佸憡鍨崐鏍偓姘炬嫹