সি / সি ++ তে, আমি কি সম্ভব হলে পরামিতিগুলিতে এবং স্থানীয় ভেরিয়েবলগুলিতে 'কনস্ট' ব্যবহার করব?


13

এই প্রশ্নটি জাভা সম্পর্কে একটি প্রশ্নfinal দ্বারা অনুপ্রাণিত হয় ।

সি / সি ++ এ, constযখনই সম্ভব আমার ব্যবহার করা উচিত ?

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

এছাড়াও, এই প্রশ্নের প্রায় সমস্ত উত্তর বলে যে আমাদের ব্যবহার করা উচিত constকারণ এতে ভেরিয়েবলের অ্যাক্সেসযোগ্যতা সম্পর্কে দরকারী তথ্য রয়েছে। তবে জাভাতে চূড়ান্ত ব্যবহার সম্পর্কে এমন একটি উত্তরের সাথে এই মতবিরোধ বলে মনে হচ্ছে যা জানিয়েছে finalযে এতে অতিরিক্ত তথ্য না থাকলে এটি অতিমাত্রায় হতে পারে এবং তাই কোডটি সংক্ষিপ্ত এবং পরিষ্কার রাখতে বাদ দেওয়া উচিত।

সুতরাং, আমি constযখনই সম্ভব ব্যবহার করা উচিত ? যদি তা হয় তবে constসি ++ এর জন্য পরামর্শ finalজাভাতে দেওয়া পরামর্শের থেকে আলাদা কেন ?

উত্তর:


18

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

হ্যাঁ, যখনই সম্ভব আপনার কনস্ট ব্যবহার করা উচিত। এটি একটি চুক্তি করে যে আপনার কোড কিছু পরিবর্তন করবে না। মনে রাখবেন, একটি কনস্ট্যান্ট প্যারামিটার গ্রহণ করে এমন একটি ফাংশনে একটি নন-কনস্টের ভেরিয়েবলটি পাঠানো যেতে পারে। আপনি সর্বদা কনস্ট যুক্ত করতে পারেন, তবে এটি সরিয়ে ফেলবেন না (কনস্ট কাস্ট ব্যতীত যা সত্যিই খারাপ ধারণা নয়)।

সংশোধন-সঠিকতা সময়ে সময়ে ক্লান্তিকর হতে পারে, তবে এটি অপরিবর্তনীয়তা গ্যারান্টি সাহায্য করে। এটি বহু-থ্রেডযুক্ত কোডে গুরুত্বপূর্ণ যেখানে থ্রেডগুলি বস্তুগুলি ভাগ করে share এটি নির্দিষ্ট কাজগুলিকে আরও দক্ষ করে তোলে: অনুলিপি রাষ্ট্রের পরিবর্তে একই অচল অবজেক্টটিকে পুনরায় ব্যবহার করুন। গ্রন্থাগারগুলি প্রোগ্রামারকে গ্যারান্টি দেওয়ার জন্য কনস্ট প্যারামিটারগুলি গ্রহণ করতে পারে যে না, আপনার বস্তুটি ব্ল্যাকহোলের একটি অনাকাঙ্ক্ষিত উপায়ে পরিবর্তন করবে না যা গ্রন্থাগারের সাহস's


1
ভোট আপ করুন কারণ আপনি এটি ব্যাখ্যা করেছেন finalএবং constএকই গ্যারান্টি নেই।
বিল ডোর

2
দৃ Const়তা লিখনযোগ্যতা সম্পর্কে হয়, পরিবর্তনের বিষয়ে নয়।
বেসিলিভস

@ বাসিলিভস আপনি যদি কোনও বস্তুতে লিখেন তবে কী হবে? এটি রূপান্তরিত হয়। আপনি কীভাবে কোনও বস্তুর রূপান্তর করবেন? এটি লিখুন।

4
আপনি যদি কোনও কনস্টেন্ট রেফারেন্স লিখেন তবে কী হবে? একটি সংকলন সময় ত্রুটি। আপনি যদি অন্য কোনও অ-কনস্ট্যান্ট রেফারেন্সের মাধ্যমে কনস্ট্যান্ট রেফারেন্সের মাধ্যমে কোথাও রেফারেন্সযুক্ত অবজেক্টটিতে লিখেন তবে কী হবে? এটি রূপান্তরিত হয়। অপরিবর্তনীয় বস্তু পরিবর্তন করতে পারে না, সুতরাং কনস্ট রেফারেন্স অপরিবর্তনীয় বস্তুর রেফারেন্স দেয় না।
বেসিলিভস

@ বাসিলভ আপনার পর্যবেক্ষণ কেবল কনস্ট রেফার সাথে প্রযোজ্য। যদি কোনও বস্তু নিজেই কনস্ট হিসাবে ঘোষিত হয় (কেবলমাত্র রেফারেন্স নয়) তবে তা আরও-বা-কম অপরিবর্তনীয় (যদি না কেউ নিরপেক্ষভাবে দৃ away়তাটিকে দূরে সরিয়ে দেয়)।
ম্যাথু জেমস ব্রিগেস

4

ব্যক্তিগতভাবে, constআমাকে লেখার জন্য খুব অল্প সময় লাগে, এবং পড়ার জন্য খুব অল্প সময় লাগে, সাধারণত কোনও কোড ভেরিয়েবলকে রূপান্তরিত করে কিনা তা যাচাই করার জন্য এটির তুলনায় অনেক কম সময় লাগে এবং এটি আসলে আমাকে বাগ লিখতে বাধা দেয় (যে কেউ দুর্ঘটনাক্রমে কখনও তাদের শেষ পুনরাবৃত্ত বৃদ্ধি করেছে? ইত্যাদি)

আমি আরও দেখতে পেলাম যে কনস্টের ব্যবহার সম্পর্কে কঠোর হওয়া আমাকে অন্যভাবে উন্নত কোডের দিকে পরিচালিত করে, যেমন অ-তুচ্ছ প্রাথমিককরণের জন্য সহায়ক ফাংশন তৈরি করা।


4

আমি অন্যান্য পোস্টারগুলির সাথে একমত নই এবং আপনাকে স্থানীয় ভেরিয়েবল এবং পরামিতিগুলিতে শীর্ষ স্তরের ব্যবহার না করার পরামর্শ দিচ্ছি const। (কনস্টের রেফারেন্স এবং পয়েন্টারগুলি, অর্থাত্ const T&পৃথক and

শীর্ষ স্তরের সুবিধাগুলি হ'ল const:

  • এটি পরিষ্কার করে দেয় যে স্থানীয় ভেরিয়েবলগুলি রূপান্তরিত করার জন্য নয়।
  • আপনি যদি দুর্ঘটনাক্রমে তাদের পরিবর্তনের চেষ্টা করেন তবে একটি সংকলক ত্রুটি দেয়।

অসুবিধাগুলি হ'ল:

  • ভিজ্যুয়াল গন্ডগোল।
  • "সিউডো-কনস্ট" ভেরিয়েবল, অর্থাৎ ভেরিয়েবলগুলি ব্যবহার করা যাবে না যা সরাসরি নির্মাণের চেয়ে কিছু জটিলভাবে শুরু করা হয়েছিল, তবে পরে পরিবর্তিত হয়নি, যেমন getline:

    std::string line; // cannot be const
    std::getline(std::cin, line);
    // line should be const from here on out
    
  • ফাংশন কল এবং রিটার্নে মুভ-আউট অপ্টিমাইজেশন প্রতিরোধ করে:

    std::string f1();
    std::string f2(std::string s);
    std::string f3() {
      const std::string s = f1(); // s is not meant to be modified
      // but I still want the move optimization here:
      const std::string result = f2(std::move(s)); // this doesn't move
      // and I want the compiler to move out here:
      return result; // this will probably RVO, but if not, the move
                     // constructor will not be used due to the const
    }
    

আমি এমন একটি কোডবেসে কাজ করেছি যেখানে স্থানীয় constব্যবহার প্রচুর ব্যবহৃত হয়েছিল এবং আমি এটিকে মোটেই সহায়ক মনে করি নি, তবুও এটি কোডটি উপরের মতো সূক্ষ্ম হতাশায় পূর্ণ করেছে। আমি ব্যক্তিগতভাবে ভেরিয়েবলগুলিকে যথাসম্ভব কম সংশোধন করার একটি সাধারণ নীতি গ্রহণ করতে পছন্দ করি এবং ভেরিয়েবলের ব্যবহার সুস্পষ্টভাবে যথেষ্ট পরিমাণে ফাংশন তৈরি করে এবং এটি পরিবর্তন করেও ফাংশনটির জটিলতা এটিকে অযোগ্য করার পক্ষে যথেষ্ট কম -সমস্যা.



1
@ ক্যালথ না, এটাই কথা। আমি এটি পরিবর্তন করার ইচ্ছা করি না don't আমি কেবল মানটি পাস করতে, বা এটি ফিরিয়ে দিতে চাই এবং আমি এটি দক্ষ হতে চাই। ধারণামূলকভাবে, পরিবর্তনটি কেবলমাত্র একটি অপ্টিমাইজেশন, যা পর্যবেক্ষণযোগ্য হতে বোঝানো হয় না (যেহেতু ভেরিয়েবলগুলি পরে ব্যবহার করা হয় না)। ব্যবহারিকভাবে, হ্যাঁ, একটি পরিবর্তন রয়েছে, যেহেতু সি ++ এর সত্যিকারের ধ্বংসাত্মক পদক্ষেপ নেই (যেমন জং রয়েছে)। ঠিক এই কারণেই আমি constস্থানীয়দের কাছে চাই না : কারণ এটি প্রযুক্তিগত পরিবর্তনগুলি প্রতিরোধ করে, কেবল ধারণাগত পরিবর্তনগুলি নয়।
সেবাস্তিয়ান রেডল

2
আপনি পরিবর্তন করতে চাই না মান , কিন্তু আপনি পরিবর্তন করতে চান না পরিবর্তনশীল । আপনি পরিবর্তে
কনস্ট

2

constশব্দ মাত্র পরামিতি মত, স্থানীয় ভেরিয়েবল জন্য ব্যবহার করা উচিত। এটি দরকারী কারণ:

  • কোডটি পড়া সহজ। যখন কেউ পরিবর্তনশীল ঘোষণাটি পড়েন, তিনি জানেন যে এটি পরিবর্তন হবে না। আপনার কোডটি পড়ার সময় আরও একটি বিষয় চিন্তা করতে হবে।
  • দুর্ঘটনাক্রমে ভেরিয়েবলটি সংশোধন করা থেকে বিরত রাখুন
  • কোনও রানটাইম পেনাল্টি নেই, সবকিছু স্থিতিশীলভাবে পরীক্ষা করা হয়। এটি নিখরচায় দুপুরের খাবারের মতো, constলেখার জন্য মাত্র এক সেকেন্ড সময় নেওয়া উচিত, তাই এটি কোনও বড় বিষয় নয়।
  • আপনার বহু-থ্রেড অ্যাপ্লিকেশনগুলিতে আপনার ভেরিয়েবলগুলি / পরামিতিগুলি তৈরি করা সর্বদা একটি ভাল ধারণা। এমনকি আপনার অ্যাপ্লিকেশনটি মাল্টি-থ্রেডড নয়, এটি এখনও একটি ভাল অভ্যাস।
  • আপনি আপনার কোডটি অনুকূলিত করার জন্য আপনার সি ++ সংকলককে একটি সুযোগ দিন।

মনে রাখবেন এখানে সঠিক / ভুল উত্তর নেই। আপনার লিঙ্কে, যে উত্তরদাতা সবচেয়ে বেশি বিতর্ক করেছিলেন তাদের finalস্থানীয়ভাবে ব্যবহার করা উচিত নয়। তবে পরবর্তী উত্তরদাতা দৃ strongly়ভাবে এটির সুপারিশ করেছিলেন।

যদি আপনার ফাংশনটি সহজ এবং তুচ্ছ হয় , আপনার যুক্ত করা উচিত নয় constকারণ প্রত্যেকে আপনার উদ্দেশ্য বোঝে। তবে, যদি আপনার ফাংশনে যুক্তি অ-তুচ্ছ হয়, আপনার কীওয়ার্ডটি ব্যবহার করা উচিত। মনে রাখবেন, হারাতে হবে খুব কমই।

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