software - c++ tutorial pdf




একটি সি++ ডিফল্ট আর্গুমেন্ট অন্য যুক্তি দিয়ে শুরু করা যেতে পারে? (4)

কেন এটি অনুমোদিত নয় তা নিয়ে আমি একটি যৌক্তিক ব্যাখ্যা খুঁজছিলাম

এটি আসলে একটি ভাল প্রশ্ন। কারণটি হ'ল সি ++ আর্গুমেন্টগুলির মূল্যায়নের আদেশকে আদেশ দেয় না।

তাহলে আসুন আমরা আরও কিছু জটিল পরিস্থিতি কল্পনা করি:

int f(int a, int b = ++a);

... followed by ...

int a = 1;
f(a);

সি ++ আর্গুমেন্ট মূল্যায়নের আদেশ জারি করে না, মনে আছে?

তাহলে খ এর মান কত হওয়া উচিত?

f(a) উভয়ই মূল্যায়ন করতে পারে:

f(1, 2) , বা f(2, 2) , যুক্তিগুলির মূল্যায়নের ক্রমের উপর নির্ভর করে।

সুতরাং আচরণটি অপরিজ্ঞাত হবে (এবং এমনকি অপরিজ্ঞাতও)।

আরও বিবেচনা করুন, যখন ক এবং বি জটিল বিষয় ছিল যাগুলির নির্মাণকারী এবং অনুলিপি অপারেটরগুলির পার্শ্ব প্রতিক্রিয়া ছিল তখন কী ঘটতে পারে তা বিবেচনা করুন।

এই পার্শ্ব প্রতিক্রিয়াগুলির ক্রম সংজ্ঞায়িত হবে।

এই প্রশ্নের ইতিমধ্যে এখানে একটি উত্তর আছে:

সি ++ এ ডিফল্ট আর্গুমেন্টের জন্য, মানটির কি ধ্রুবক হওয়া দরকার বা অন্য কোনও যুক্তিটি করবে?

অর্থাৎ, নিম্নলিখিত কাজ করতে পারেন?

RateLimiter(unsigned double rateInPermitsPerSecond, 
            unsigned int maxAccumulatedPermits = rateInPermitsPerSecond);

বর্তমানে আমি একটি ত্রুটি পাচ্ছি:

রেটলিমিটার এইচ: 13: ত্রুটি: 'রেটইনপার্মিটস পারসেকেন্ড' এই সুযোগে ঘোষণা করা হয়নি


সি ++ এ ডিফল্ট আর্গুমেন্টের জন্য, মানটির কি ধ্রুবক হওয়া দরকার বা অন্য কোনও যুক্তিটি করবে?

একটি আর্গুমেন্টের ডিফল্ট মান অন্য যুক্তি হতে পারে না। তবে এর অর্থ এই নয় যে এটি একটি ধ্রুবক হতে হবে। এটি কোনও ফাংশন কলের রিটার্ন মান হতে পারে।

int getNextDefaultID()
{
   static int id = 0;
   return ++id;
}

struct Foo
{
   Foo(int data, int id = getNextDefaultID()) : data_(data), id_(id) {}
   int data_;
   int id_;
};

int main()
{
    Foo f1(10);      // Gets the next default ID.
    Foo f2(20, 999); // ID is specified.
}

আর একটি যুক্তি ডিফল্ট মান হিসাবে ব্যবহার করা যায় না। মানকটি বলে:

8.3.6 ডিফল্ট যুক্তি
...
9 প্রতিটি ফাংশনটি সংশ্লিষ্ট প্যারামিটারের জন্য কোনও যুক্তি ছাড়াই ডাকা হলে প্রত্যেকবার একটি ডিফল্ট আর্গুমেন্ট মূল্যায়ন করা হয়। ফাংশন আর্গুমেন্টগুলির মূল্যায়নের ক্রমটি অনির্দিষ্ট। ফলস্বরূপ, কোনও ক্রমের প্যারামিটারগুলি ডিফল্ট আর্গুমেন্টে ব্যবহৃত হবে না, এমনকি যদি সেগুলি মূল্যায়ন না করা হয়।

এবং নিম্নলিখিত নমুনা দিয়ে এটি চিত্রিত:

int f(int a, int b = a); // error: parameter a
                         // used as default argument

না, এটি কাজ করতে পারে না কারণ ফাংশন আর্গুমেন্টগুলির মূল্যায়ন ক্রমযুক্ত নয়। এটি কাজ করে না কারণ মানক এটির অনুমতি দেয় না, তবে আমার ধারণা এটি সুস্পষ্ট ছিল।

পরিবর্তে একটি ওভারলোড ব্যবহার করুন:

void fun(int, int) {}

void fun(int i) {
    fun(i, i);
}






c++