क्या सभी C ++ ऑपरेटर कुछ लौटाते हैं?


83

सभी C ++ ऑपरेटर जो मैंने कुछ रिटर्न के साथ काम किया है, उदाहरण के लिए +ऑपरेटर अतिरिक्त परिणाम देता है।

क्या सभी C ++ संचालक कुछ लौटाते हैं, या कुछ C ++ संचालक हैं जो कुछ भी नहीं लौटाते हैं?


7
यह निर्भर करता है कि आप "ऑपरेटर" शब्द को कितने संकीर्ण रूप से परिभाषित करते हैं।
मोलबडनीलो

12
यह मानक द्वारा मजबूर नहीं है - उदाहरण के लिए आप +=लौटने के लिए लागू कर सकते हैं void, लेकिन यह अनुशंसित नहीं है। फ़ंक्शन कॉल ऑपरेटर भी वापस आ सकते हैं voidऔर यह मान्य है
Mircea Ispas

हम्म। मेरे पास एक कूबड़ है कि गुंजाइश रिज़ॉल्यूशन ऑपरेटर ::कुछ भी नहीं लौटाता है, लेकिन मुझे यह सुनिश्चित करने के लिए मानक से परामर्श करना होगा।
यक्षिसारिवेन

2
क्या C ++ के लिए प्रश्न का संदर्भ केवल प्रकार प्रदान किया गया है, या इसमें उपयोगकर्ता-परिभाषित प्रकार भी शामिल हैं?
एलयज

@Eljay केवल C ++ प्रकार प्रदान करता है।
user8240761

जवाबों:


112

नहीं, सभी ऑपरेटर कुछ वापस नहीं करते हैं।

हालाँकि वे शायद आप के बारे में सोच रहे हैं कि वास्तव में नहीं कर रहे हैं, ध्यान दें कि deleteऔर delete[]सी + + 'कीवर्ड' वास्तव में ऑपरेटरों रहे हैं ; और वे होने के रूप में परिभाषित कर रहे हैं voidजिसका अर्थ है कि वे - वापसी प्रकार का मूल्यांकन कुछ भी नहीं करने के लिए (जो नहीं 'कुछ')।

से cppreference :

void operator delete  ( void* ptr ) noexcept;
void operator delete[]( void* ptr ) noexcept;

13
मुझे आपका उत्तर पसंद है, इसने मुझे प्रश्न को अलग तरीके से सोचने पर मजबूर कर दिया। delete, delete[], throw, (void)x;कलाकारों, के बाईं ओर ,के ऑपरेटर, दाईं ओर ,ऑपरेटर पैदावार एक है कि void, एक ?:त्रिगुट एक का उपयोग करता है throwहथियारों में से एक के लिए, dfri के operator void()(उपयोगकर्ता होगा जो परिभाषित),眠りネロクके void operator()()(उपयोगकर्ता होगा जो परिभाषित)।
एलजेन

10
यह भी भ्रामक है कि deleteऑपरेटर ऑब्जेक्ट को नष्ट कर देता है और फिर कॉल करता है operator delete। एर्गो, deleteऑपरेटर और operator deleteअलग चीजें हैं :( stackoverflow.com/a/8918942/845092
Mooing Duck

7
डिलीट-ऑपरेटर के बारे में बात करने पर आप यह नहीं जानते कि आप डिलीट-फंक्शन का हवाला क्यों देते हैं। जो कुछ भी लेकिन।
डेडुप्लिकेटर

4
@MooDDuck डिलीट एक्सप्रेशन ऑब्जेक्ट को नष्ट कर देता है, और फिर कॉल करता है operator delete
नाथनऑलिवर

क्या डिलीट की गिनती एक ऑपरेटर के रूप में होती है, मुझे लगा कि एक वस्तु एक ऐसी चीज है जो पारित की गई वस्तु पर काम करती है ?? डिलीट करने के लिए किसी ऑब्जेक्ट को पास करने या काम करने के लिए इसे बनाने की जरूरत नहीं है ..... बस
प्रिंटफ की

82

कस्टम प्रकार के ऑपरेटरों को सबसे अजीब चीजें करने के लिए अतिभारित किया जा सकता है।

उदाहरण के लिए + ऑपरेटर जोड़ का परिणाम देता है।

जरुरी नहीं:

#include <iostream>
struct foo {
    int value = 0;
    void operator+(int x) {
        value += x;
    }
};

int main () {
    foo f;
    f + 3;
}

यहां operator+बाएं हाथ को valueसदस्य में जोड़ा जाता है , और इसका रिटर्न प्रकार शून्य है। यह एक बना-बनाया उदाहरण है, लेकिन, सामान्य तौर पर, कस्टम ऑपरेटर से कुछ वापस नहीं करना असामान्य नहीं है।

एकमात्र ऑपरेटर जिसे ओवरलोड किया जा सकता है और जिसे कुछ वापस करने की आवश्यकता है, जिसे मैं जानता हूं, वह है operator->। इसे या तो एक कच्चा पॉइंटर या एक ऑब्जेक्ट वापस करना होगा जिसमें ए है operator->


मजेदार रूप से पर्याप्त है, वास्तव में ओवरलोडेड ऑपरेटरों पर कोई अड़चन नहीं है। इसलिए, ऑपरेटर जो चाहें वापस कर सकते हैं। en.cppreference.com/w/cpp/language/operators
bracco23

5
@ braccor23 operator->थोड़ा खास है और इसे एक पॉइंटर या एक ऐसी वस्तु को वापस करने की ज़रूरत है operator->, जो अन्य के अपवाद होने पर निश्चित नहीं है
बड़ी_prime_is_463035818

1
हां, बस यही अड़चन है। तुलना ऑपरेटरों के लिए बूल भी नहीं। यह वास्तव में अजीब लग रहा है।
bracco23

9
@ idclev463035818: एक और अधिक उपयोगी उदाहरण अभिव्यक्ति के टेम्पलेट हो सकते हैं। उदाहरण के लिए, आप एक मैट्रिक्स लाइब्रेरी बना सकते हैं जहां operator*(Matrix const& left, Matrix const& right)रिटर्न नहीं Matrixबल्कि इसके बजाय MatrixMul, ताकि यदि इसे फिर operator+(Matrix const& left, MatrixMul const& right)से ऑपरेशन में खिलाया जाए तो एक फ्यूजेड मल्टी-ऐड हो सकता है जो पहले गुणा करने की तुलना में अधिक कुशल है फिर जोड़ना।
मैथ्यू एम।

1
@DarrelHoffman कब <<और >>I / O संचालन के लिए अतिभारित हैं, उन्हें स्ट्रीम वापस करने की उम्मीद है ताकि आप उन्हें कैस्केड कर सकें:stream << foo << bar;
Barmar

34

नाइटपिक के लिए, ऑपरेटर कुछ भी वापस नहीं करते हैं। वे सिर्फ शाब्दिक तत्व हैं जो हम भाषा में अभिव्यक्ति बनाने के लिए उपयोग करते हैं। अब, भावों के प्रकार होते हैं और वे मूल्यों का मूल्यांकन कर सकते हैं, और मुझे लगता है कि आप संचालकों द्वारा "चीजों को लौटाने" का मतलब है।

और, ठीक है, हाँ। प्रकार के साथ C ++ अभिव्यक्तियाँ हैं void(और परिणामस्वरूप किसी भी मूल्य का मूल्यांकन नहीं करते हैं)। कुछ स्पष्ट हैं, दूसरों को कम। एक अच्छा उदाहरण होगा

throw std::runtime_error()

throwC ++ व्याकरण के तहत एक अभिव्यक्ति है। आप इसे अन्य अभिव्यक्तियों में उपयोग कर सकते हैं, उदाहरण के लिए सशर्त अभिव्यक्ति में

return goodStatus() ? getValue() : throw std::runtime_error();

और फेंक अभिव्यक्ति का प्रकार है, है void। जाहिर है कि यह सिर्फ तेजी से कहीं और जाने के लिए निष्पादन का कारण बनता है, अभिव्यक्ति का कोई मूल्य नहीं है।


21

अंतर्निहित C ++ ऑपरेटरों में से कोई भी कुछ वापस नहीं करता है। ओवरलोडेड C ++ ऑपरेटर्स कुछ इंसोफर लौटाते हैं कि ऑपरेटर नोटेशन एक फंक्शन कॉल के लिए एक सिंटैक्टिक शुगर है।

बल्कि, ऑपरेटर सभी कुछ का मूल्यांकन करते हैं। यही कारण है कि कुछ एक अच्छी तरह से परिभाषित किया गया है मूल्य के साथ ही एक प्रकार । यहां तक ​​कि फ़ंक्शन कॉल ऑपरेटर void operator()(/*params*/)भी एक voidप्रकार है।

उदाहरण के लिए, आपके प्लेटफ़ॉर्म पर एन्कोड किए गए मान के साथ +'a'एक intप्रकार 'a'है।

यदि आपका प्रश्न "क्या C ++ ऑपरेटरों के पास voidरिटर्न प्रकार हो सकता है?" तो जवाब सबसे निश्चित रूप से हाँ है।


14
@ idclev463035818: यह टर्म रिटर्न है जिसमें मेरे पास एक मुद्दा है। C ++ की एकमात्र चीज़ जो कुछ लौटाती है वह एक फ़ंक्शन है। भाव किसी चीज का मूल्यांकन करते हैं।
बाथशीबा

7
क्लास प्रकार के ऑपरेटर वे विधियाँ हैं जो कुछ
लौटाती हैं

4
यह एक महत्वपूर्ण मुद्दा है। मैला शब्दावली से भ्रम पैदा होता है। +1।
पीट बेकर

3
@supercat - आपकी टिप्पणी मेरे सहित मेहनती लोगों का एक समूह है। हममें से जिन्होंने मानक लिखे, उन्होंने कभी भी संकलनकर्ता लेखकों से अपेक्षा नहीं की थी कि वे अन्य संकलक, वर्तमान या अतीत को ध्यान में रखते हुए विवरण भरें। मानक का लक्ष्य था और सी ++ प्रोग्रामिंग भाषा के वाक्यविन्यास और शब्दार्थ को स्पष्ट रूप से परिभाषित करना है। हां, परिणाम सही नहीं है; नवीनतम मानक में कई समस्याएँ हैं जिन्हें पहले के संस्करणों में संबोधित नहीं किया गया था। यह अनुभव से आता है, जटिलताओं को पहचानना जो उस समय नहीं देखी गई थीं।
पीट बेकर

3
@ पीटर-रिइंस्टोमोनिका - यहाँ एक मजबूत संस्करण है। अभिव्यक्ति I++एक मान नहीं लौटाती है। यदि प्रकार iएक उपयोगकर्ता-परिभाषित प्रकार है, तो उस अभिव्यक्ति को इस प्रकार लागू किया जाता है operator++, जो एक ऐसा फ़ंक्शन है जो मान लौटाता है। आप कहते हैं कि "सिंटैक्टिक शुगर"; मैं उस अंतर को कहता हूं जिसके महत्वपूर्ण परिणाम हैं।
पीट बेकर

12

आप वास्तव में एक फ़ंक्शन कॉल ऑपरेटर को कुछ भी नहीं लौटने के लिए परिभाषित कर सकते हैं । उदाहरण के लिए:

struct Task {
   void operator()() const;
};

17
आप कुछ भी नहीं लौटाने के लिए लगभग किसी भी ऑपरेटर को परिभाषित कर सकते हैं (और उस भीड़ के क्रोध का सामना कर सकते हैं जिसे उस कोड को बनाए रखना होगा)
युकिसार्विनन

7
@Yisisarvinen लेकिन कम से कम यह एक संभावित रूप से उपयोगी है।
मार्क रैनसम

11

ऑपरेटर शून्य (): उपयोगकर्ता परिभाषित रूपांतरण फ़ंक्शन शून्य करने के लिए

आप अजीब परिभाषित कर सकते हैं 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- योग्य) आधार वर्ग के लिए उस प्रकार (या इसके लिए एक संदर्भ) की, या करने के लिए (संभवतः सीवी-योग्य) void117

( 117 ) इन रूपांतरणों को अधिभार संकल्प ([over.best.ics], [over.ics.ref]) और इसलिए आरंभीकरण ([dcl.init]) और स्पष्ट जातियों के प्रयोजनों के लिए मानक रूपांतरण माना जाता है। रूपांतरण voidकिसी भी रूपांतरण फ़ंक्शन ([expr.static.cast]) को लागू नहीं करता है। भले ही कभी भी सीधे रूपांतरण करने के लिए नहीं कहा जाता है, ऐसे रूपांतरण कार्यों को घोषित किया जा सकता है और संभावित रूप से कॉल के माध्यम से एक बेस क्लास में वर्चुअल रूपांतरण फ़ंक्शन तक पहुंचा जा सकता है।

हालांकि, जैसा कि ऊपर दिखाया गया है, आप अभी भी स्पष्ट .operator void()वाक्य रचना का उपयोग करके इसे लागू कर सकते हैं ।


4

विभिन्न प्रकार की संगणनाओं को निष्पादित करने के लिए भाषा द्वारा परिभाषित (निर्मित) परिचालकों का उपयोग किया जाता है:

  • अंकगणित (+, -, *, /)
  • वेतन वृद्धि / वृद्धि (++, -)
  • असाइनमेंट (=, + =, - =, * =, / =,% =, >> =, << =, और =, ^ =, | = =) |
  • तर्क (, और, &, ||)
  • संबंधवाचक (==; =!,>, <,> =, <=)
  • सशर्त?
  • अल्पविराम

और इसी तरह। सूची बहुत व्यापक हो सकती है।

इस एक या इस एक जैसे भाषा के संदर्भ में , ये जरूरी नहीं कि कुछ लौटाने के रूप में संदर्भित किया जाता है, बस एक अंकगणितीय या तर्क संचालन , एक तुलना जिसके द्वारा एक चर संशोधित किया जा सकता है, आदि।

चूंकि यह ऑपरेशन कुछ मूल्य में परिणाम करता है, इसलिए इसे ऑपरेटर द्वारा "वापस" के रूप में व्याख्या की जा सकती है, लेकिन यह फ़ंक्शन रिटर्न मान से अलग है।

दूसरी ओर, अतिभारित ऑपरेटरों को कुछ प्रकार के रिटर्न मान के साथ परिभाषित किया जा सकता है, यहां तक ​​कि शून्य भी हो सकता है, इसलिए, नहीं, नहीं, सभी ऑपरेटर C ++ में कुछ मूल्य वापस नहीं करते हैं।


3

मैं मान रहा हूं कि आप ऑपरेटर के कार्यों के बारे में बात कर रहे हैं न कि ऑपरेटरों को भाषा की वाक्य-रचना इकाई के रूप में।

यदि आप किसी भी प्रकार के ऑपरेटरों को अधिभारित करते हैं, तो आप वास्तव में जो चाहें वापस कर सकते हैं।

यह भी बहुत मायने रखता है, क्योंकि * या () जैसे ऑपरेशन कभी-कभी बहुत सहज रूप से अपने इनपुट प्रकार को वापस नहीं कर सकते हैं। एक वास्तविक संख्या प्रकार के साथ एक जटिल संख्या प्रकार को गुणा करने की कल्पना करें। या एक ऑपरेटर जो एक संग्रह से एक तत्व लौटाता है।

आप ++ और - ऑपरेटर्स को कुछ भी वापस नहीं कर सकते हैं, इस प्रकार मानक संस्करण में साइड-इफेक्ट और अभिव्यक्ति मूल्य के अत्यंत त्रुटि-प्रवण मिश्रण को हटाने के लिए कुछ भी वापस नहीं करना है।


2

नहीं, यहां इन दो उदाहरणों पर विचार करें:

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 वास्तविक मान नहीं लौटाता है।


0

सभी ऑपरेटर कुछ लौटाते हैं। उन्हें ऑपरेटर कहा जाता है क्योंकि वे कुछ संचालित करते हैं, इसलिए वे कुछ वापस करेंगे। जो संचालक कुछ कैंट नहीं लौटाते हैं उन्हें ऑपरेटर कहा जाता है। या तो वे कुछ मूल्य वापस करेंगे या स्थिति के आधार पर ट्रू या गलत लौटाएंगे।


0

ऑपरेटर अपने दम पर जरूरी कुछ भी नहीं लौटाते हैं। फ़ंक्शन कॉल मान लौटाता है। ऑपरेटर मूल्यों में परिणाम कर सकते हैं। ऑपरेटर कभी-कभी फ़ंक्शन को लागू कर सकते हैं। उदाहरणों में शामिल:

• फ़ंक्शन कॉल ऑपरेटर।

• एक अतिभारित ऑपरेटर जो एक फ़ंक्शन कॉल में परिवर्तित हो जाता है।

• ऑपरेटर नया, जिसे एक नई-अभिव्यक्ति के भाग के रूप में लागू किया जाता है , एक फ़ंक्शन कॉल है।

फ़ंक्शन कॉल का उल्लेख करने में मेरा एकमात्र उद्देश्य परिणाम बनाम वापसी को स्पष्ट करना है। "वापसी" के सभी 126 उदाहरणों और [expr] में इससे निकले शब्दों को देखने के आधार पर , इस खंड का उपयोग करने के लिए संदर्भित करने के लिए शब्द का सावधानीपूर्वक उपयोग करें:

• एक फ़ंक्शन कॉल का परिणाम

• नियंत्रण के पहलू कोरटाइन से संबंधित हैं

ठीक है, कि परिणाम बनाम वापसी पर पर्याप्त पैदल सेना है।


0

C ++ ऑपरेटर्स कुछ लौटाते हैं या नहीं यह इस बात पर निर्भर करता है कि आपने उनका उपयोग कैसे किया। अंतर्निहित C ++ ऑपरेटर्स कुछ मान तब तक लौटाते हैं जब तक कि शून्य वापस करने के लिए लागू नहीं किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.