सभी C ++ ऑपरेटर जो मैंने कुछ रिटर्न के साथ काम किया है, उदाहरण के लिए +
ऑपरेटर अतिरिक्त परिणाम देता है।
क्या सभी C ++ संचालक कुछ लौटाते हैं, या कुछ C ++ संचालक हैं जो कुछ भी नहीं लौटाते हैं?
सभी C ++ ऑपरेटर जो मैंने कुछ रिटर्न के साथ काम किया है, उदाहरण के लिए +
ऑपरेटर अतिरिक्त परिणाम देता है।
क्या सभी C ++ संचालक कुछ लौटाते हैं, या कुछ C ++ संचालक हैं जो कुछ भी नहीं लौटाते हैं?
+=
लौटने के लिए लागू कर सकते हैं void
, लेकिन यह अनुशंसित नहीं है। फ़ंक्शन कॉल ऑपरेटर भी वापस आ सकते हैं void
और यह मान्य है
::
कुछ भी नहीं लौटाता है, लेकिन मुझे यह सुनिश्चित करने के लिए मानक से परामर्श करना होगा।
जवाबों:
हालाँकि वे शायद आप के बारे में सोच रहे हैं कि वास्तव में नहीं कर रहे हैं, ध्यान दें कि delete
और delete[]
सी + + 'कीवर्ड' वास्तव में ऑपरेटरों रहे हैं ; और वे होने के रूप में परिभाषित कर रहे हैं void
जिसका अर्थ है कि वे - वापसी प्रकार का मूल्यांकन कुछ भी नहीं करने के लिए (जो नहीं 'कुछ')।
से cppreference :
void operator delete ( void* ptr ) noexcept;
void operator delete[]( void* ptr ) noexcept;
delete
, delete[]
, throw
, (void)x;
कलाकारों, के बाईं ओर ,
के ऑपरेटर, दाईं ओर ,
ऑपरेटर पैदावार एक है कि void
, एक ?:
त्रिगुट एक का उपयोग करता है throw
हथियारों में से एक के लिए, dfri के operator void()
(उपयोगकर्ता होगा जो परिभाषित),眠りネロクके void operator()()
(उपयोगकर्ता होगा जो परिभाषित)।
delete
ऑपरेटर ऑब्जेक्ट को नष्ट कर देता है और फिर कॉल करता है operator delete
। एर्गो, delete
ऑपरेटर और operator delete
अलग चीजें हैं :( stackoverflow.com/a/8918942/845092
operator delete
।
कस्टम प्रकार के ऑपरेटरों को सबसे अजीब चीजें करने के लिए अतिभारित किया जा सकता है।
उदाहरण के लिए + ऑपरेटर जोड़ का परिणाम देता है।
जरुरी नहीं:
#include <iostream>
struct foo {
int value = 0;
void operator+(int x) {
value += x;
}
};
int main () {
foo f;
f + 3;
}
यहां operator+
बाएं हाथ को value
सदस्य में जोड़ा जाता है , और इसका रिटर्न प्रकार शून्य है। यह एक बना-बनाया उदाहरण है, लेकिन, सामान्य तौर पर, कस्टम ऑपरेटर से कुछ वापस नहीं करना असामान्य नहीं है।
एकमात्र ऑपरेटर जिसे ओवरलोड किया जा सकता है और जिसे कुछ वापस करने की आवश्यकता है, जिसे मैं जानता हूं, वह है operator->
। इसे या तो एक कच्चा पॉइंटर या एक ऑब्जेक्ट वापस करना होगा जिसमें ए है operator->
।
operator->
थोड़ा खास है और इसे एक पॉइंटर या एक ऐसी वस्तु को वापस करने की ज़रूरत है operator->
, जो अन्य के अपवाद होने पर निश्चित नहीं है
operator*(Matrix const& left, Matrix const& right)
रिटर्न नहीं Matrix
बल्कि इसके बजाय MatrixMul
, ताकि यदि इसे फिर operator+(Matrix const& left, MatrixMul const& right)
से ऑपरेशन में खिलाया जाए तो एक फ्यूजेड मल्टी-ऐड हो सकता है जो पहले गुणा करने की तुलना में अधिक कुशल है फिर जोड़ना।
<<
और >>
I / O संचालन के लिए अतिभारित हैं, उन्हें स्ट्रीम वापस करने की उम्मीद है ताकि आप उन्हें कैस्केड कर सकें:stream << foo << bar;
नाइटपिक के लिए, ऑपरेटर कुछ भी वापस नहीं करते हैं। वे सिर्फ शाब्दिक तत्व हैं जो हम भाषा में अभिव्यक्ति बनाने के लिए उपयोग करते हैं। अब, भावों के प्रकार होते हैं और वे मूल्यों का मूल्यांकन कर सकते हैं, और मुझे लगता है कि आप संचालकों द्वारा "चीजों को लौटाने" का मतलब है।
और, ठीक है, हाँ। प्रकार के साथ C ++ अभिव्यक्तियाँ हैं void
(और परिणामस्वरूप किसी भी मूल्य का मूल्यांकन नहीं करते हैं)। कुछ स्पष्ट हैं, दूसरों को कम। एक अच्छा उदाहरण होगा
throw std::runtime_error()
throw
C ++ व्याकरण के तहत एक अभिव्यक्ति है। आप इसे अन्य अभिव्यक्तियों में उपयोग कर सकते हैं, उदाहरण के लिए सशर्त अभिव्यक्ति में
return goodStatus() ? getValue() : throw std::runtime_error();
और फेंक अभिव्यक्ति का प्रकार है, है void
। जाहिर है कि यह सिर्फ तेजी से कहीं और जाने के लिए निष्पादन का कारण बनता है, अभिव्यक्ति का कोई मूल्य नहीं है।
अंतर्निहित C ++ ऑपरेटरों में से कोई भी कुछ वापस नहीं करता है। ओवरलोडेड C ++ ऑपरेटर्स कुछ इंसोफर लौटाते हैं कि ऑपरेटर नोटेशन एक फंक्शन कॉल के लिए एक सिंटैक्टिक शुगर है।
बल्कि, ऑपरेटर सभी कुछ का मूल्यांकन करते हैं। यही कारण है कि कुछ एक अच्छी तरह से परिभाषित किया गया है मूल्य के साथ ही एक प्रकार । यहां तक कि फ़ंक्शन कॉल ऑपरेटर void operator()(/*params*/)
भी एक void
प्रकार है।
उदाहरण के लिए, आपके प्लेटफ़ॉर्म पर एन्कोड किए गए मान के साथ +'a'
एक int
प्रकार 'a'
है।
यदि आपका प्रश्न "क्या C ++ ऑपरेटरों के पास void
रिटर्न प्रकार हो सकता है?" तो जवाब सबसे निश्चित रूप से हाँ है।
I++
एक मान नहीं लौटाती है। यदि प्रकार i
एक उपयोगकर्ता-परिभाषित प्रकार है, तो उस अभिव्यक्ति को इस प्रकार लागू किया जाता है operator++
, जो एक ऐसा फ़ंक्शन है जो मान लौटाता है। आप कहते हैं कि "सिंटैक्टिक शुगर"; मैं उस अंतर को कहता हूं जिसके महत्वपूर्ण परिणाम हैं।
आप वास्तव में एक फ़ंक्शन कॉल ऑपरेटर को कुछ भी नहीं लौटने के लिए परिभाषित कर सकते हैं । उदाहरण के लिए:
struct Task {
void operator()() const;
};
आप अजीब परिभाषित कर सकते हैं operator void()
रूपांतरण समारोह, जहां संकलक तुम भी चेतावनी देगा कि T
करने के लिए void
रूपांतरण समारोह में इस्तेमाल किया जा कभी नहीं होगा :
#include <iostream>
struct Foo {
operator void() { std::cout << "Foo::operator void()!"; }
// warning: conversion function converting 'Foo' to
// 'void' will never be used
};
int main() {
Foo f;
(void)f; // nothing
f.operator void(); // Foo::operator void()!
}
जैसा कि [class.conv.fct] / 1 द्वारा शासित है
[...] रूपांतरण रूपांतरण का उपयोग कभी भी (संभवतः cv- योग्य) ऑब्जेक्ट को (संभवतः cv-योग्य) समान ऑब्जेक्ट प्रकार (या इसके लिए संदर्भ) में परिवर्तित करने के लिए नहीं किया जाता है , (संभवतः cv- योग्य) आधार वर्ग के लिए उस प्रकार (या इसके लिए एक संदर्भ) की, या करने के लिए (संभवतः सीवी-योग्य)
void
। 117( 117 ) इन रूपांतरणों को अधिभार संकल्प ([over.best.ics], [over.ics.ref]) और इसलिए आरंभीकरण ([dcl.init]) और स्पष्ट जातियों के प्रयोजनों के लिए मानक रूपांतरण माना जाता है। रूपांतरण
void
किसी भी रूपांतरण फ़ंक्शन ([expr.static.cast]) को लागू नहीं करता है। भले ही कभी भी सीधे रूपांतरण करने के लिए नहीं कहा जाता है, ऐसे रूपांतरण कार्यों को घोषित किया जा सकता है और संभावित रूप से कॉल के माध्यम से एक बेस क्लास में वर्चुअल रूपांतरण फ़ंक्शन तक पहुंचा जा सकता है।
हालांकि, जैसा कि ऊपर दिखाया गया है, आप अभी भी स्पष्ट .operator void()
वाक्य रचना का उपयोग करके इसे लागू कर सकते हैं ।
विभिन्न प्रकार की संगणनाओं को निष्पादित करने के लिए भाषा द्वारा परिभाषित (निर्मित) परिचालकों का उपयोग किया जाता है:
और इसी तरह। सूची बहुत व्यापक हो सकती है।
इस एक या इस एक जैसे भाषा के संदर्भ में , ये जरूरी नहीं कि कुछ लौटाने के रूप में संदर्भित किया जाता है, बस एक अंकगणितीय या तर्क संचालन , एक तुलना जिसके द्वारा एक चर संशोधित किया जा सकता है, आदि।
चूंकि यह ऑपरेशन कुछ मूल्य में परिणाम करता है, इसलिए इसे ऑपरेटर द्वारा "वापस" के रूप में व्याख्या की जा सकती है, लेकिन यह फ़ंक्शन रिटर्न मान से अलग है।
दूसरी ओर, अतिभारित ऑपरेटरों को कुछ प्रकार के रिटर्न मान के साथ परिभाषित किया जा सकता है, यहां तक कि शून्य भी हो सकता है, इसलिए, नहीं, नहीं, सभी ऑपरेटर C ++ में कुछ मूल्य वापस नहीं करते हैं।
मैं मान रहा हूं कि आप ऑपरेटर के कार्यों के बारे में बात कर रहे हैं न कि ऑपरेटरों को भाषा की वाक्य-रचना इकाई के रूप में।
यदि आप किसी भी प्रकार के ऑपरेटरों को अधिभारित करते हैं, तो आप वास्तव में जो चाहें वापस कर सकते हैं।
यह भी बहुत मायने रखता है, क्योंकि * या () जैसे ऑपरेशन कभी-कभी बहुत सहज रूप से अपने इनपुट प्रकार को वापस नहीं कर सकते हैं। एक वास्तविक संख्या प्रकार के साथ एक जटिल संख्या प्रकार को गुणा करने की कल्पना करें। या एक ऑपरेटर जो एक संग्रह से एक तत्व लौटाता है।
आप ++ और - ऑपरेटर्स को कुछ भी वापस नहीं कर सकते हैं, इस प्रकार मानक संस्करण में साइड-इफेक्ट और अभिव्यक्ति मूल्य के अत्यंत त्रुटि-प्रवण मिश्रण को हटाने के लिए कुछ भी वापस नहीं करना है।
नहीं, यहां इन दो उदाहरणों पर विचार करें:
int multiply (int a, int b) {
return a*b;
}
void multiply_void(int a, int b) {
cout << a*b;
//or cout << multiply(a,b);
}
पहला फ़ंक्शन एक पूर्णांक मान लौटाएगा जिसका उपयोग किसी अन्य फ़ंक्शन द्वारा किया जा सकता है। आवश्यक होने पर उपयोग किए जाने वाले स्मृति में मान लौटाया और संग्रहीत किया जाता है। यदि नहीं, तो यह मानव के लिए दृश्यमान नहीं है और सिर्फ स्मृति में खुशी से बैठता है।
दूसरा फ़ंक्शन डिफ़ॉल्ट आउटपुट डिवाइस (आमतौर पर कंसोल) पर आउटपुट करेगा। गुणन ऑपरेटर द्वारा लौटाया गया मान आउटपुट डिवाइस पर जाता है। फ़ंक्शन multiply_void वास्तविक मान नहीं लौटाता है।
ऑपरेटर अपने दम पर जरूरी कुछ भी नहीं लौटाते हैं। फ़ंक्शन कॉल मान लौटाता है। ऑपरेटर मूल्यों में परिणाम कर सकते हैं। ऑपरेटर कभी-कभी फ़ंक्शन को लागू कर सकते हैं। उदाहरणों में शामिल:
• फ़ंक्शन कॉल ऑपरेटर।
• एक अतिभारित ऑपरेटर जो एक फ़ंक्शन कॉल में परिवर्तित हो जाता है।
• ऑपरेटर नया, जिसे एक नई-अभिव्यक्ति के भाग के रूप में लागू किया जाता है , एक फ़ंक्शन कॉल है।
फ़ंक्शन कॉल का उल्लेख करने में मेरा एकमात्र उद्देश्य परिणाम बनाम वापसी को स्पष्ट करना है। "वापसी" के सभी 126 उदाहरणों और [expr] में इससे निकले शब्दों को देखने के आधार पर , इस खंड का उपयोग करने के लिए संदर्भित करने के लिए शब्द का सावधानीपूर्वक उपयोग करें:
• एक फ़ंक्शन कॉल का परिणाम
• नियंत्रण के पहलू कोरटाइन से संबंधित हैं
ठीक है, कि परिणाम बनाम वापसी पर पर्याप्त पैदल सेना है।
C ++ ऑपरेटर्स कुछ लौटाते हैं या नहीं यह इस बात पर निर्भर करता है कि आपने उनका उपयोग कैसे किया। अंतर्निहित C ++ ऑपरेटर्स कुछ मान तब तक लौटाते हैं जब तक कि शून्य वापस करने के लिए लागू नहीं किया जाता है।