অপারেটরটি কীভাবে ++ এবং উপসর্গ ++ এ পোস্টফিক্সের জন্য দুটি ভিন্ন উপায়ে ওভারলোড করবেন?


110

অপারেটরটি কীভাবে পোস্টফিক্স a++এবং উপসর্গের জন্য দুটি ভিন্ন উপায়ে ওভারলোড করবেন ++a?


1
প্রাসঙ্গিক: stackoverflow.com/questions/3181211/...
kennytm

একটি "কেন যে সিনট্যাক্স" সংস্করণ: stackoverflow.com/questions/3574831/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


165

এর মতো দেখতে হবে:

class Number 
{
    public:
        Number& operator++ ()     // prefix ++
        {
           // Do work on this.   (increment your object here)
           return *this;
        }

        // You want to make the ++ operator work like the standard operators
        // The simple way to do this is to implement postfix in terms of prefix.
        //
        Number  operator++ (int)  // postfix ++
        {
           Number result(*this);   // make a copy for result
           ++(*this);              // Now use the prefix version to do the work
           return result;          // return the copy (the old) value.
        }
}; 

15
এই কোডটি উপ-বনাম পোস্টফিক্সের পারফরম্যান্সের পার্থক্যটিও দেখায়। আপনি যে জিনিসটি ফিরে আসছেন তা যদি কোনও সিপিইউ নিবন্ধের সাথে ফিট না হয় তবে আপনি একটি ব্যয়বহুল অনুলিপি অপারেশন করছেন। আপনার প্রাক-বর্ধিত মানটি ব্যবহার করার প্রয়োজন থাকলে এটি ঠিক আছে, তবে আপনি যদি না করেন তবে পোস্টফিক্স আরও ভাল। উদাহরণস্বরূপ এমন একটি পুনরাবৃত্তি হবে যেখানে আপনি সাধারণত ব্যবহার করেন: (pos = c.begin (); ...; ++ পোষ্ট) জন্য pos pos পজ ++ এর পরিবর্তে
এরিক

22
@ এরিক: আপনি যেখানে মাঝখানে মিশ্রণ করছেন সেখানে বাক্যটি বাদ দিয়ে আপনার সমস্ত পথটি সংশোধন করতে হবে। এর উপসর্গটি আরও ভাল।
মার্টিন ইয়র্ক 19

6
আপনি এটি ব্যবহার না করে কেন পরামিতি হিসাবে Number operator++ (int)গ্রহণ করেন int?
শান লেটেন্ডারে

10
@ সানলিটেন্ড্রে: এটি আসলে কোনও প্যারামিটার নেয় না। এটি একটি নকল প্যারামিটার। তবে সি ++ ভাষার ডিজাইনারদের উপসর্গ এবং পোস্টফিক্স ফাংশন সংজ্ঞাগুলির মধ্যে পার্থক্য করার একটি উপায় নির্ধারণ করতে হয়েছিল। এটি তাদের তৈরি নকশার সিদ্ধান্ত।
মার্টিন ইয়র্ক

2
@ এনারিকোমারিয়াডে অ্যাঞ্জেলিস: সিনট্যাক্স দুটিকে আলাদা করে। ++xপ্রিফিক্স এবং এইভাবে কল operator++() যখন x++পোস্টসাফিক্স এবং এইভাবে কলoperator++(int)
মার্টিন ইয়র্ক

34

পার্থক্যটি আপনার ওভারলোড (গুলি) এর জন্য আপনি স্বাক্ষরটি বেছে নেবেন operator ++

সি ++ এফএকিউ এ এই বিষয়ে সম্পর্কিত নিবন্ধ থেকে উদ্ধৃত (আরও তথ্যের জন্য সেখানে যান):

class Number {
  public:
    Number& operator++ ();     // prefix ++: no parameter, returns a reference
    Number  operator++ (int);  // postfix ++: dummy parameter, returns a value
};

পিএস: আমি যখন এ সম্পর্কে জানতে পেরেছিলাম, প্রথম দিকে আমি যা দেখেছি তা ডামি প্যারামিটার ছিল, তবে বিভিন্ন রিটার্নের ধরণগুলি আসলে আরও আকর্ষণীয়; তারা ব্যাখ্যা করতে পারে কেন সাধারণের++x চেয়ে বেশি দক্ষ হিসাবে বিবেচিত হয় ।x++


17

আপনার কাছে টাইপ টির জন্য দুটি (উপসর্গ / পোস্টফিক্স) ++ অপারেটরগুলি ওভারলোড করার দুটি উপায় রয়েছে:

অবজেক্ট পদ্ধতি:

"সাধারণ" ওওপি আইডিয়ামটি ব্যবহার করে এটি সবচেয়ে সহজ উপায়।

class T
{
    public :
        T & operator++() // ++A
        {
            // Do increment of "this" value
            return *this ;
        }

        T operator++(int) // A++
        {
           T temp = *this ;
           // Do increment of "this" value
           return temp ;
        }
} ;

অবজেক্ট অ-সদস্য ফাংশন:

এটি করার আরেকটি উপায়: ফাংশনগুলি যতক্ষণ তারা খুব উল্লেখ করছে সেই বস্তুর সাথে একই নামস্থানে থাকবে, তখনই সংকলক হ্যান্ডেল ++t ;বা t++ ;কোডের জন্য কোনও ফন্টন অনুসন্ধান করবে তখন তাদের বিবেচনা করা হবে :

class T
{
    // etc.
} ;


T & operator++(T & p_oRight) // ++A
{
   // Do increment of p_oRight value
   return p_oRight ;
}

T operator++(T & p_oRight, int) // A++
{
   T oCopy ;
   // Copy p_oRight into oCopy
   // Do increment of p_oRight value
   return oCopy ;
}

এটি মনে রাখা জরুরী যে, একটি সি ++ ভিউপয়েন্ট (একটি সি ++ সংকলক দৃষ্টিভঙ্গি সহ) থেকে, সেই সদস্যবিহীন ফাংশনগুলি এখনও টি এর ইন্টারফেসের অংশ (যতক্ষণ তারা একই নামস্থানে থাকে)।

সদস্যবিহীন ফাংশন স্বরলিপিটির দুটি সম্ভাব্য সুবিধা রয়েছে:

  • আপনি যদি তাদের টি-তে বন্ধু না করে তাদের কোড করার ব্যবস্থা করেন তবে আপনি টি এর এনক্যাপসুলেশন বাড়িয়েছেন
  • আপনি এমনকি এমন ক্লাস বা স্ট্রাকচারের ক্ষেত্রেও এটি প্রয়োগ করতে পারেন যার কোড আপনি নেই don't এটি কোনও ঘোষণাকে সংশোধন না করেই কোনও ইন্টারফেসের ইন্টারফেস বাড়ানোর জন্য অ-অনুপ্রবেশমূলক উপায়।

1

এর মতো ঘোষণা করুন:

class A
{
public:
    A& operator++();    //Prefix (++a)
    A operator++(int); //Postfix (a++)

};

যথাযথভাবে প্রয়োগ করুন - প্রত্যেকে যা জানেন তারা কী করে তা নিয়ে গণ্ডগোল করবেন না (বর্ধিতকরণ তারপর ব্যবহার করুন, ব্যবহার করুন তারপর ইনক্রিমেন্ট)।


-2

আমি জানি যে দেরি হয়ে গেছে, তবে আমার একই সমস্যা ছিল এবং একটি সহজ সমাধান আমি খুঁজে পেয়েছি। আমাকে ভুল করবেন না, এটি শীর্ষ সমাধানের মতো একই সমাধান (মার্টিন ইয়র্ক পোস্ট করেছেন)। এটি কিছুটা সহজ। আর একটু. এটা এখানে:

class Number
{
        public:

              /*prefix*/  
        Number& operator++ ()
        {
            /*Do stuff */
            return *this;
        }

            /*postfix*/
        Number& operator++ (int) 
        {
            ++(*this); //using the prefix operator from before
            return *this;
        }
};

উপরের সমাধানটি কিছুটা সহজ কারণ এটি পোস্টফিক্স পদ্ধতিতে কোনও অস্থায়ী বস্তু ব্যবহার করে না।


6
এটি মানক নয়। পোস্টফিক্স অপারেটর ++ এর মান বাড়ানোর আগে কী হবে তা ফিরিয়ে দেওয়া উচিত after
কুয়েলিন লি

এই উত্তরটি ভুল। অস্থায়ী প্রয়োজন হয়।
রিয়ান কুইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.