2009-06-22 17 views
10

मैं एक क्यूटी tutorial देख रहा हूं जो एक निर्माण का उपयोग करता है जिसे मैंने पहले नहीं देखा है:सी ++ में "(शून्य) नया" क्या मतलब है?

 (void) new QShortcut(Qt::Key_Enter, this, SLOT(fire())); 
(void) new QShortcut(Qt::Key_Return, this, SLOT(fire())); 
(void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close())); 

मैंने (void) के बिना यह कोशिश की है और यह अभी भी संकलित और काम करता है, तो इसका उद्देश्य क्या है (void)?

+1

अधिकतम तक अपने कंपाइलर चेतावनी स्तर को चालू करें। बिना शून्य (संकलित) संकलित करें और देखें कि क्या होता है। –

+0

लेकिन अधिकांश समय मैं इसे देखता हूं क्योंकि ऐसा कोई है क्योंकि कोई सी लिख रहा है और यह महसूस नहीं करता है कि आप अब रूपांतरण को _need_ नहीं करते हैं। –

उत्तर

21

एक अभिव्यक्ति कास्टिंग (शून्य) मूल रूप से संकलक को उस अभिव्यक्ति के परिणाम को अनदेखा करने के लिए कहता है (इसे कंप्यूटिंग के बाद)।

आपके उदाहरण में, प्रत्येक अभिव्यक्ति (प्रति कथन/रेखा) गतिशील रूप से नए ऑपरेटर के माध्यम से स्मृति आवंटित कर रही है - और चूंकि नया स्मृति में एक सूचक (पता) देता है, सामान्य अभ्यास उस पॉइंटर को स्टोर करना है परिवर्तनीय है कि आप अंततः वस्तु को हटाने और स्मृति को हटाने के लिए उपयोग कर सकते हैं। आपके उदाहरण में, चूंकि पॉइंटर को त्याग दिया जा रहा है, इसलिए एक स्पष्ट कलाकार (शून्य) प्रोग्रामर के इरादे को स्पष्ट करता है: "मुझे पता है कि मैं वास्तव में क्या कर रहा हूं - कृपया नए द्वारा लौटाए गए मान को छोड़ दें"

यदि आप हैं तकनीकीताओं में रुचि रखते हैं (सी ++ मानक, खंड 5 से उद्धरण):

किसी भी अभिव्यक्ति को स्पष्ट रूप से प्रकार के सीवी शून्य में परिवर्तित किया जा सकता है। अभिव्यक्ति मान को त्याग दिया जाता है। [नोट: हालांकि, यदि मान एक अस्थायी चर (12.2) में है, तो उस चर के लिए विनाशक सामान्य समय तक निष्पादित नहीं होता है, और चर के मूल्य को विनाशक को निष्पादित करने के उद्देश्य से संरक्षित किया जाता है। -जेंड नोट]
लवली-टू-रावल्यू (4.1), सरणी-टू-पॉइंटर (4.2), और फ़ंक्शन-टू-पॉइंटर (4.3) मानक रूपांतरण अभिव्यक्ति पर लागू नहीं होते हैं।

और आप सोच रहे हैं कि कैसे उन वस्तुओं को नष्ट कर दिया जा रहा है (यदि वास्तव में वे नष्ट कर दिया जा रहा है), जवाब है कि 'इस' QShortcut के निर्माता के भीतर सूचक एक ही मूल्य है कि के रूप में नई द्वारा वापस होना चाहिए , और इसे शॉर्टकट प्रबंधक को पास किया जा सकता है। ध्यान दें, कन्स्ट्रक्टर के भीतर 'यह' क्यूशॉर्टकट के निर्माता को पास किया जा रहा है 'यह' सूचक के समान नहीं है।

7

कुछ सी ++ कंपाइलर्स चेतावनी देंगे यदि आप इस तरह के फ़ंक्शन के रिटर्न वैल्यू को फेंक देते हैं। इस मामले में, कोड दिखता है जैसे यह स्मृति को रिसाव करता है, इसलिए आपको चेतावनी मिलती है। (void) संकलक को चेतावनी को उत्सर्जित करने के लिए कहता है: "इस फ़ंक्शन का इलाज करें जैसे कि यह void लौटा"।

0

मुझे लगता है कि new कथन से लौटा गया संदर्भ एक सूचक को असाइन नहीं किया गया है। मुझे लगता है कि this पारित किया जा रहा है इसलिए क्यूटी को उस संदर्भ के साथ कुछ करना होगा।

संबंधित मुद्दे