ফাংশন নামের সি ++ পরে প্যারামিটার বনাম কনস্টের আগে কনট করুন


90

পার্থক্য কি এই মত কিছু betweeen

friend Circle copy(const Circle &);

এবং এই মত কিছু

friend Circle copy(Circle&) const;

আমি জানি ফাংশনটি ব্যবহৃত হওয়ার পরে সংকলককে বলার জন্য যে এই ফাংশনটি যে বস্তুটির উপরে ডাকা হচ্ছে তাকে পরিবর্তিত করার চেষ্টা করবে না, অন্যটির কী হবে?


6
আপনি প্যারামিটার পরিবর্তন করবে না অন্য
চাদ

উত্তর:


199

প্রথম ফর্মটির অর্থ Circleহ'ল রেফারেন্সের সাথে আবদ্ধ বস্তুর (অবস্থার) যা copy()ফাংশনের প্যারামিটার copy()সে রেফারেন্সের মাধ্যমে পরিবর্তন করা হবে না । রেফারেন্সটি একটি রেফারেন্স const, সুতরাং Circleসেই রেফারেন্সের মাধ্যমে সদস্যদের ফাংশনগুলি আহ্বান করা সম্ভব হবে না যেগুলি নিজেরাই যোগ্য নয় const

অন্যদিকে, দ্বিতীয় ফর্মটি অবৈধ: কেবল সদস্য ফাংশনগুলিইconst যোগ্যতা অর্জন করতে পারে (আপনি যেখানে এটি ঘোষণা করছেন সেখানে একটি বিশ্বব্যাপী, friendকার্যকারিতা রয়েছে)।

যখন constকোনও সদস্যের কার্যের যোগ্যতা অর্জন করে, তখন যোগ্যতাটি অন্তর্নিহিত thisযুক্তিটিকে বোঝায় । অন্য কথায়, এই ফাংশনটি যে বস্তুটির উপরে প্রবেশ করা হয়েছে তার অবস্থার পরিবর্তন করতে দেওয়া হবে না (অন্তর্নিহিত thisপয়েন্টার দ্বারা চিহ্নিত বস্তুটি ) - mutableঅবজেক্টগুলি বাদ দিয়ে তবে এটি অন্য গল্প।

কোড সহ এটি বলতে:

struct X
{
    void foo() const // <== The implicit "this" pointer is const-qualified!
    {
        _x = 42; // ERROR! The "this" pointer is implicitly const
        _y = 42; // OK (_y is mutable)
    }

    void bar(X& obj) const // <== The implicit "this" pointer is const-qualified!
    {
        obj._x = 42; // OK! obj is a reference to non-const
        _x = 42; // ERROR! The "this" pointer is implicitly const
    }

    void bar(X const& obj) // <== The implicit "this" pointer is NOT const-qualified!
    {
        obj._x = 42; // ERROR! obj is a reference to const
        obj._y = 42; // OK! obj is a reference to const, but _y is mutable
        _x = 42; // OK! The "this" pointer is implicitly non-const
    }

    int _x;
    mutable int _y;
};

12
হেলুভা উত্তর! ধন্যবাদ!
সেক্সিবিস্ট

4
সুতরাং, দ্বিতীয় ক্ষেত্রে, আমার কাছে যদি ক্লাসের কোনও constবিষয় থাকে এবং আমি যেমন কল করি তবে কী হওয়ার কথা এবং কেন? ব্যর্থ হওয়া উচিত নয় , যেহেতু কলারে ঘোষণা করা হয়? objXbar()obj.bar(obj)obj._x = 42objconst
সেক্সিবিস্ট

4
আপনি পরবর্তী বার ফাংশনটি ( void bar(X const& obj) {...}) এর মতো দেখতে এমন ক্ষেত্রে কী করবেন ? void bar(const X& obj) {...}, constকীওয়ার্ডটি এই অবস্থানে নিয়ে যাওয়া কি কোনও পরিবর্তন করে? যদি তা হয় তবে আপনি কি দয়া করে এই উদাহরণটি যুক্ত করতে পারেন?
গ্যাব্রিয়েল স্ট্যাপলস

4
@ গ্যাব্রিয়েল স্ট্যাপলস তারা একই রকম; constবাম দিকে যা আছে বা বামদিকে কিছুই না থাকলে ডানদিকে যা রয়েছে তার জন্য প্রযোজ্য। আপনার ক্ষেত্রে আপনি দেখতে পাবেন যে উভয় সংস্করণের constজন্য প্রয়োগ করা হয়েছে X
Andreas ফ্লাট

70

সি ++ শ্রেণির পদ্ধতিগুলির একটি অন্তর্নিহিত thisপ্যারামিটার রয়েছে যা সমস্ত স্পষ্টতই আগে আসে। সুতরাং একটি ক্লাসের মধ্যে এই জাতীয় ঘোষিত একটি ফাংশন:

class C {
  void f(int x);

আপনি সত্যিই দেখতে দেখতে কল্পনা করতে পারেন:

  void f(C* this, int x);

এখন, আপনি যদি এটি এইভাবে ঘোষণা করেন:

  void f(int x) const;

এ যেন আপনি এই লিখেছেন:

  void f(const C* this, int x);

অর্থাৎ চিহ্ন constতোলে thisপ্যারামিটার const, যার অর্থ আপনি বর্গ ধরনের const বস্তুর উপর পদ্ধতি ডাকা করতে পারে, এবং পদ্ধতি বস্তুর উপর তা প্রার্থনা হয়েছিল (অন্তত, স্বাভাবিক চ্যানেল মাধ্যমে নয়) সংশোধন করতে পারবেন না যে।


4
পুরোপুরি সঠিকভাবে তবে এটি প্রশ্নের উত্তর দেয় না, যা আসলে কোনও শ্রেণি পদ্ধতি নয় বরং একটি বন্ধু ফাংশনকে উল্লেখ করে।
মাহ

4
হ্যাঁ, আমি এই friendঅংশটিকে উপেক্ষা করা বেছে নিয়েছিলাম কারণ আমি মনে করি এটি আসলে ওপি-র আসল প্রশ্নের (বা সমস্ত বিষয় প্রকাশ্যে আসার পরে আসল প্রশ্নটি কী হয়ে উঠবে) প্রকৃতই অপ্রাসঙ্গিক। তাই হোক।
জন জুইনক

আমি মনে করি এটি "বিভক্ত শ্রেণীর কনস্ট অবজেক্টগুলিতে পদ্ধতিটি আহ্বান করতে" বলতে কিছুটা বিভ্রান্তিকর বলে মনে হয় কারণ আপনি কনস্ট কনটাক্ট বা নন কনস্ট অবজেক্টগুলিতে কনস্ট মেথডের আবেদন করতে পারবেন, যখন নন-কনস্ট ফাংশনগুলি কেবল নন-কনস্টেট অবজেক্টস দ্বারা ডাকা যেতে পারে। অন্যথায় এটি আমার প্রিয় উত্তর
csguy

8
Circle copy(Circle&) const;

ফাংশন constনিজেই তোলে । এটি কেবল কোনও শ্রেণি / কাঠামোর সদস্য ফাংশনের জন্য ব্যবহার করা যেতে পারে।

সদস্য ফাংশন করা constমানে

  • এটি কোনও নন-কনস্ট্যান্ড সদস্য ফাংশন কল করতে পারে না
  • এটি কোনও সদস্যের ভেরিয়েবল পরিবর্তন করতে পারে না
  • এটি কোনও constবস্তু দ্বারা constকল করা যেতে পারে ( বস্তুগুলি কেবল constফাংশন কল করতে পারে)। নন-কনস্ট্যান্ট অবজেক্টগুলিও একটি constফাংশন কল করতে পারে ।
  • এটি অবশ্যই ' চেনাশোনা ' শ্রেণীর সদস্য ফাংশন হতে হবে

এখন পরেরটি বিবেচনা করুন:

Circle copy(const Circle &);

যদিও এর অর্থ হ'ল প্যারামিটারটি ফাংশনের মধ্যে পরিবর্তন করা যাবে না। এটি ক্লাসের সদস্য ফাংশন হতে পারে বা নাও থাকতে পারে।

দ্রষ্টব্য:const একই ফাংশনের একটি এবং অবিচ্ছিন্ন সংস্করণ রাখার জন্য কোনও ফাংশনটি এমনভাবে ওভারলোড করা সম্ভব ।


8

এর সাথে সম্পর্কিত সমস্ত ধারণা পরিষ্কার করুন const


constধ্রুবক থেকে এসেছে কিছু পরিবর্তনযোগ্য নয় তবে পঠনযোগ্য।

  1. আমরা যদি constকীওয়ার্ডের সাথে আমাদের ভেরিয়েবলকে যোগ্য করে তুলি তবে আমরা পরে এটি পরিবর্তন করতে পারি না।
    উদাহরণস্বরূপ কনস্ট ভেরিয়েবলটি এটির ঘোষণার সাথে সাথে শুরু করতে হবে।
    constint var =25;
    var =50; // gives error

  2. যদি আমরা আমাদের পয়েন্টার ভেরিয়েবলটির সাথে এর পরে যোগ্যতা অর্জন করি তবে আমরা পয়েন্টারটি নিজেই পরিবর্তন করতে পারি না তবে পয়েন্টারের সামগ্রী পরিবর্তনযোগ্য । যেমন // তবেconst *

    int *const ptr = new int;
    ptr = new int; //gives error

    *ptr=5445; //allowed

  3. আমরা যদি আমাদের পয়েন্টার ভেরিয়েবলের সাথে এর আগে যোগ্যতা অর্জন করি তবে আমরা পয়েন্টার নিজেই পরিবর্তন করতে পারি তবে পয়েন্টারের সামগ্রী পরিবর্তনযোগ্য নয় । যেমন // তবেconst *

    intconst* ptr = new int(85);
    //or
    constint * ptr = new int(85);
    ptr = new int; // allowed

    *ptr=5445; // gives error

  4. পয়েন্টার এবং সামগ্রী উভয় ধ্রুবক
    যেমন
    intconst*constptr = new int(85);
    //or
    constint *constptr = new int(85);
    ptr = new int; // not allowed
    *ptr=5445; // not allowed


  1. Circle copy(const Circle &);
    এখানে কনস্ট সার্কেল অর্থ সার্কেলের মান কেবল পঠনযোগ্য, যদি আমরা ফাংশনের অভ্যন্তরে সার্কেলের মান পরিবর্তন করার চেষ্টা করি তবে এটি ত্রুটি দেয়।
  2. friend Circle copy(Circle&) const;
    এই জাতীয় ফাংশন অ-সদস্য ভেরিয়েবলের জন্য নয় it এটি শ্রেণি বা কাঠামোর জন্য ব্যবহৃত হয়। এখানে পুরো ফাংশনটি কনস্ট কিওয়ার্ডের সাথে যোগ্যতা অর্জন করার অর্থ আমরা বস্তুর সদস্য ভেরিয়েবল পরিবর্তন করতে পারি না । যেমন
    class A{ public :
              int  var;
              void fun1()
                    { var = 50; // allowed
                    } 
              void fun2()const
                       { var=50; //not allowed
                       }
           }; 

4

একটি প্যারামিটারটিকে অন্যটিকে ফাংশন বোঝায়।

Circle copy(const Circle &);

এর অর্থ হল যে পাস করা প্যারামিটারটি ফাংশনের মধ্যে পরিবর্তন করা যাবে না

Circle copy(Circle&) const;

constযোগ্যতাসম্পন্ন ফাংশন সদস্য ফাংশন এবং এর মানে হল আপনি বস্তুর নিজেই ডেটা সদস্যদের পরিবর্তন করতে পারবেন না ব্যবহার করা হয়। আপনি যে উদাহরণটি পোস্ট করেছেন তা অযৌক্তিক ছিল।

ডান থেকে বামে পড়ুন

যদি আমরা প্রথম ফাংশনটি আবার একইভাবে লিখি Circle copy(Circle const&);যার অর্থ একই জিনিস, এটি স্পষ্ট হয়ে যায় যে ডান থেকে বামে পড়া দরকারী হয়ে ওঠে। copyএমন একটি ফাংশন যা constকোনও Circleঅবজেক্টের রেফারেন্স নেয় এবং Circleরেফারেন্স দ্বারা কোনও অবজেক্ট রিটার্ন করে।


0

friend Circle copy(const Circle &);// ফাংশনের ধ্রুবক প্যারামিটারকে বোঝায়। প্যারামিটার দ্বারা সঞ্চিত মান পরিবর্তন করতে পারবেন না।

আপনার উদাহরণে সার্কেল অনুলিপি (সার্কেল &) কনস্টে বন্ধুকে সরিয়ে ফেলতে হবে ; // কনস্ট্যান্ট সদস্য ফাংশন হিসাবে নামক এই পাইনিটার মানটি পরিবর্তন করতে পারে না


0
friend Circle copy(const Circle &);

ফাংশন কল করার সময় প্যারামিটারের মান পরিবর্তন করা হবে না।

friend Circle copy(const Circle &)const ; 

ফাংশনটি এমন একটি অ্যাক্সেসর যা শ্রেণীর সদস্যদের কোনও মান পরিবর্তন করে না। সাধারণত, বিভিন্ন ধরণের ফাংশন রয়েছে: অ্যাকসেসর এবং মিউটরগুলি। অ্যাক্সেসর: পরীক্ষা করে তবে তার বস্তুর অবস্থা পরিবর্তন করে না।

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