?? 1712342601.txt
字號:
化境編程界-
初始化類成員和在你的MFC應用中加入位置欄(1)
化境編程界首頁| 化境軟件庫 | 化境教程庫 | 其它資源 | 化境討論區
| 化境留言板
showTop();
歡迎訪問《化境編程界》| * Email:5xsoft@21cn.com | < 留言板
化境編程界 -> 技術文章 -> C/C++/VC
初始化類成員和在你的MFC應用中加入位置欄(1)
[ 作者: Paul DiLascia
添加時間: 2001-5-17 12:37:39
]
問題
我的問題是關于初始化C++類成員的。我見過許多這樣的代碼(包括在你的欄目中也見到過):
CSomeClass::CSomeClass()
{
x=0;
y=1;
}
而在別的什么地方則寫成下面的樣子:
CSomeClass::CSomeClass() : x(0), y(1)
{
}
我的一些程序員朋友說第二種方法比較好,但他們都不知道為什么是這樣。你能告訴我這兩種類成員初始化方法的區別嗎?
回答
從技術上說,你的程序員朋友是對的,但是在大多數情況下,兩者實際上沒有區別。有兩個原因使得我們選擇第二種語法,它被稱為成員初始化列表:一個原因是必須的,另一個只是出于效率考慮。
讓我們先看一下第一個原因——必要性。設想你有一個類成員,它本身是一個類或者結構,而且只有一個帶一個參數的構造函數。
class CMember {
public:
CMember(int x) { ... }
};
因為Cmember有一個顯式聲明的構造函數,編譯器不產生一個缺省構造函數(不帶參數),所以沒有一個整數就無法創建Cmember的一個實例。
CMember* pm = new CMember; // Error!!
CMember* pm = new CMember(2); // OK
如果Cmember是另一個類的成員,你怎樣初始化它呢?你必須使用成員初始化列表。
class CMyClass {
CMember m_member;
public:
CMyClass();
};
//必須使用成員初始化列表
CMyClass::CMyClass() : m_member(2)
{
&#8226;&#8226;&#8226;
}
沒有其它辦法將參數傳遞給m_member,如果成員是一個常量對象或者引用也是一樣。根據C++的規則,常量對象和引用不能被賦值,它們只能被初始化。
第二個原因是出于效率考慮,當成員類具有一個缺省的構造函數和一個賦值操作符時。MFC的Cstring提供了一個完美的例子。假定你有一個類CmyClass具有一個Cstring類型的成員m_str,你想把它初始化為"yada yada."。你有兩種選擇:
CMyClass::CMyClass() {
// 使用賦值操作符
// CString::operator=(LPCTSTR);
m_str = _T("yada yada");
}
//使用類成員列表
// and constructor CString::CString(LPCTSTR)
CMyClass::CMyClass() : m_str(_T("yada yada"))
{
}
在它們之間有什么不同嗎?是的。編譯器總是確保所有成員對象在構造函數體執行之前初始化,因此在第一個例子中編譯的代碼將調用CString::Cstring來初始化m_str,這在控制到達賦值語句前完成。在第二個例子中編譯器產生一個對CString:: CString(LPCTSTR)的調用并將"yada yada"傳遞給這個函數。結果是在第一個例子中調用了兩個Cstring函數(構造函數和賦值操作符),而在第二個例子中只調用了一個函數。在Cstring的例子里這是無所謂的,因為缺省構造函數是內聯的,Cstring只是在需要時為字符串分配內存(即,當你實際賦值時)。但是,一般而言,重復的函數調用是浪費資源的,尤其是當構造函數和賦值操作符分配內存的時候。在一些大的類里面,你可能擁有一個構造函數和一個賦值操作符都要調用同一個負責分配大量內存空間的Init函數。在這種情況下,你必須使用初始化列表,以避免不要的分配兩次內存。在內部類型如ints或者longs或者其它沒有構造函數的類型下,在初始化列表和在構造函數體內賦值這兩種方法沒有性能上的差別。不管用那一種方法,都只會有一次賦值發生。有些程序員說你應該總是用初始化列表以保持良好習慣,但我從沒有發現根據需要在這兩種方法之間轉換有什么困難。在編程風格上,我傾向于在主體中使用賦值,因為有更多的空間用來格式化和添加注釋,你可以寫出這樣的語句:x=y=z=0;
或者memset(this,0,sizeof(this));
注意第二個片斷絕對是非面向對象的。
當我考慮初始化列表的問題時,有一個奇怪的特性我應該警告你,它是關于C++初始化類成員的,它們是按照聲明的順序初始化的,而不是按照出現在初始化列表中的順序。
class CMyClass {
CMyClass(int x, int y);
int m_x;
int m_y;
};
CMyClass::CMyClass(int i) : m_y(i), m_x(m_y)
{
}
你可能以為上面的代碼將會首先做m_y=I,然后做m_x=m_y,最后它們有相同的值。但是編譯器先初始化m_x,然后是m_y,,因為它們是按這樣的順序聲明的。結果是m_x將有一個不可預測的值。我的例子設計來說明這一點,然而這種bug會更加自然的出現。有兩種方法避免它,一個是總是按照你希望它們被初始化的順序聲明成員,第二個是,如果你決定使用初始化列表,總是按照它們聲明的順序羅列這些成員。這將有助于消除混淆。
問題
我剛剛在幾臺機器上安裝了Windows&reg; 2000 Release Candidate 1,不知道怎樣在我的MFC應用中得到具有新的Outlook風格欄目的Open對話框(見圖1)。
Figure 1 The New Open Dialog
我能否只設置一個標志,或者我是否需要一個新的頭文件和一個新的公共對話框的DDL?我注意到一些舊的應用程序如Notepad好像可以得到新的Open對話框而無須重新編譯,但它們不是MFC應用。理想情況,我希望在Windows 9x 和Windows NT&reg;下得到一個使用舊對話框的應用,而在Windows 2000下使用新的對話框。
Warren Stevens
回答
這個問題恐怕沒有令你高興的答復。Windows 2000新的Open對話框是用一個新版本的commdlg.dll實現的,它在邊上包含“Places”欄目。顯示它的函數是GetOpenFileName,與在Windows 9x 和Windows NT&reg;下使用的相同。然而,GetOpenFileName現在使用一個新版本的OPENFILENAME,這是一個在你的應用和對話框之間傳遞信息的結構。新的結構有一些額外的成員:
typedef struct tagOFN {
DWORD lStructSize; // 很重要!
&#8226;&#8226;&#8226;
// 正想你總是知道并且喜歡的那樣
#if (_WIN32_WINNT >= 0x0500)
void* pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;
對,是這樣。Windows 2000是Windows的第5個版本,用16進制表示是0x500。如果你用_WIN32_WINNT = 0x0500編譯程序,OPENFILENAME就會得到3個新成員。前兩個是保留的,第三個標志域,FlagsEx,有一個新的OFN_EX_NOPLACESBAR欄目,它屏蔽了Places欄目。Windows——或者更準確的說,commdlg.dll——使用OPENFILENAME第一個成員lStructSize來決定顯示那個對話框,如果lStructSize是76(舊的大小),Windows就運行舊的對話框;如果是76+3&acute;4=88(新的大小),它就運行新的對話框——這是友好的Redmondtonians最初告訴我的。在我的研究中間,我發現這并不是完整的圖畫。
但是在我詳細說明之前,先讓我們走馬觀花的看一下MFC,討論另外一個問題。在MFC應用中,你并不經常直接調用GetOpenFileName,而是使用CfileDialog——或者,框架使用CfileDialog。當用戶調用File | Open,控制稀里嘩啦的一路經過CWinApp::OnFileOpen和幾個其它的函數,最終到達CDocManager::DoPromptFileName,這個函數創建一個CfileDialog。CfileDialog具有一個OPENFILENAME結構的數據成員:
class CFileDialog : public CCommonDialog {
OPENFILENAME m_ofn;
&#8226;&#8226;&#8226;
下一頁 8
相關內容:
- 討論: windows程序設計方式爭論
- ATL和MFC來,應該使用哪個?
- 利用MFC的CFileDialog生成Windows2000文件對話框
- MFC中多線程的應用
- 關于對于VC/MFC/ATL的評論問題
showBottom();
申明: 本站
所有內容均是從網上收集,若有侵范你版權的請指出,本站馬上刪除。
© Copyright By 稻香老農 2000.3 - Now | 站務聯系: 5xsoft@21cn.com | OICQ:593737 (只用于站務聯系,不做它用)
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩午夜在线影院|
蜜桃91丨九色丨蝌蚪91桃色|
欧美国产欧美综合|
久久精品欧美一区二区三区麻豆|
欧美成人aa大片|
日韩欧美中文字幕制服|
日韩欧美国产综合|
26uuu色噜噜精品一区二区|
欧美成人r级一区二区三区|
精品sm捆绑视频|
中文字幕av一区二区三区高|
国产精品精品国产色婷婷|
日韩理论在线观看|
亚洲一区精品在线|
人人精品人人爱|
国产专区综合网|
成人免费av资源|
91视频免费看|
欧美日韩电影在线播放|
日韩欧美一二三|
久久精品一区八戒影视|
亚洲私人黄色宅男|
日日噜噜夜夜狠狠视频欧美人|
蜜桃久久久久久久|
国产成人啪免费观看软件|
色综合网站在线|
在线成人午夜影院|
久久免费偷拍视频|
亚洲色图视频免费播放|
午夜久久久久久|
国产一区二区看久久|
成人精品一区二区三区中文字幕|
一本色道久久综合狠狠躁的推荐|
欧美日韩久久一区|
日韩欧美国产三级|
中文字幕综合网|
美女被吸乳得到大胸91|
99久久99久久精品免费看蜜桃
|
欧美日韩免费观看一区三区|
777xxx欧美|
国产日韩欧美高清在线|
亚洲永久精品大片|
久久99热99|
日本高清不卡视频|
精品美女被调教视频大全网站|
国产精品久久久久久久久晋中|
亚洲第一精品在线|
粉嫩绯色av一区二区在线观看|
在线精品亚洲一区二区不卡|
欧美sm美女调教|
亚洲精品视频自拍|
美脚の诱脚舐め脚责91|
色偷偷成人一区二区三区91|
日韩一区国产二区欧美三区|
日韩一区中文字幕|
黑人巨大精品欧美一区|
在线亚洲人成电影网站色www|
精品福利av导航|
亚洲mv大片欧洲mv大片精品|
国产高清无密码一区二区三区|
欧美午夜影院一区|
国产精品久久久久久久久果冻传媒|
免费精品99久久国产综合精品|
91小视频在线免费看|
欧美精品一区二区蜜臀亚洲|
亚洲资源中文字幕|
99国产精品国产精品久久|
精品国产91洋老外米糕|
午夜视黄欧洲亚洲|
91玉足脚交白嫩脚丫在线播放|
日日摸夜夜添夜夜添精品视频|
成人午夜视频免费看|
日韩欧美国产午夜精品|
性欧美疯狂xxxxbbbb|
99这里只有久久精品视频|
久久亚洲影视婷婷|
日本中文字幕一区二区视频
|
欧美大尺度电影在线|
亚洲成人动漫在线免费观看|
成人av在线一区二区三区|
久久丝袜美腿综合|
美国一区二区三区在线播放|
欧美日韩一区二区三区免费看
|
麻豆一区二区在线|
欧美日韩在线电影|
一区二区三区久久|
91在线你懂得|
中文字幕日韩一区二区|
成人激情开心网|
国产女人水真多18毛片18精品视频|
久久国产尿小便嘘嘘|
日韩一级视频免费观看在线|
婷婷久久综合九色国产成人|
欧美色区777第一页|
一区二区三区中文在线观看|
99精品国产视频|
最近中文字幕一区二区三区|
91丨九色丨黑人外教|
中文字幕在线免费不卡|
不卡欧美aaaaa|
中文字幕一区二区三区四区不卡|
懂色av一区二区三区免费看|
久久久久久久久久久电影|
国产精品亚洲一区二区三区妖精|
欧美精品一区二区三区很污很色的
|
欧美mv日韩mv国产网站app|
麻豆一区二区三|
欧美r级在线观看|
国产高清精品在线|
亚洲国产成人一区二区三区|
成人av动漫在线|
亚洲欧美成人一区二区三区|
色欧美片视频在线观看|
亚洲国产成人tv|
91精品国产综合久久蜜臀|
蜜桃久久av一区|
日本一区免费视频|
av成人免费在线|
一级女性全黄久久生活片免费|
欧美日韩精品一二三区|
免费观看日韩av|
久久蜜臀精品av|
色哟哟欧美精品|
日韩电影在线观看网站|
久久久www免费人成精品|
波多野结衣91|
在线观看视频一区|
人人爽香蕉精品|
国产欧美精品国产国产专区
|
2024国产精品视频|
国产91富婆露脸刺激对白|
中文字幕一区二区三区在线观看|
在线免费观看一区|
欧美aⅴ一区二区三区视频|
337p粉嫩大胆噜噜噜噜噜91av|
成人一级片在线观看|
亚洲一区在线视频观看|
精品伦理精品一区|
99在线视频精品|
蜜桃一区二区三区在线|
中文字幕第一页久久|
欧美四级电影网|
国产主播一区二区|
亚洲免费三区一区二区|
日韩午夜中文字幕|
99re视频精品|
麻豆91免费看|
亚洲精品国产a久久久久久|
日韩欧美国产不卡|
色综合久久综合网欧美综合网|
蜜桃一区二区三区在线|
亚洲啪啪综合av一区二区三区|
日韩欧美在线一区二区三区|
www.色综合.com|
另类小说视频一区二区|
伊人一区二区三区|
26uuu精品一区二区三区四区在线|
色天天综合久久久久综合片|
韩国成人精品a∨在线观看|
一区二区三区在线视频观看|
欧美精品一区视频|
欧美日韩一区二区电影|
成人99免费视频|
久久99精品国产麻豆不卡|
最新不卡av在线|
国产亚洲福利社区一区|
91麻豆精品国产自产在线观看一区
|
亚洲国产精品成人综合|
制服丝袜一区二区三区|
91久久久免费一区二区|
国产高清不卡二三区|
日韩和欧美一区二区三区|
亚洲欧洲在线观看av|
久久中文娱乐网|
91精品欧美综合在线观看最新
|
欧美精品少妇一区二区三区|
成人性视频网站|
国产专区综合网|
美女国产一区二区三区|
午夜精品久久久久久久蜜桃app|
国产精品伦理在线|
久久青草欧美一区二区三区|
欧美一区二区精美|
欧美三级乱人伦电影|
色婷婷综合久久久久中文
|
久久久久久日产精品|
678五月天丁香亚洲综合网|
亚洲欧美另类小说|
国产精品美女久久久久久久久
|
蜜臀久久99精品久久久久久9|
洋洋av久久久久久久一区|
中文字幕综合网|
一色桃子久久精品亚洲|
国产精品美女视频|
中文字幕国产精品一区二区|
国产欧美综合在线|
国产午夜精品一区二区三区四区|
欧美sm极限捆绑bd|
久久一日本道色综合|
欧美v国产在线一区二区三区|