1।
int Add (int a, int b = 3);
int Add (int a, int b)
{
}
2।
int Add (int a, int b);
int Add (int a, int b = 3)
{
}
উভয় কাজ; কোনটি স্ট্যান্ডার্ড উপায় এবং কেন ?
1।
int Add (int a, int b = 3);
int Add (int a, int b)
{
}
2।
int Add (int a, int b);
int Add (int a, int b = 3)
{
}
উভয় কাজ; কোনটি স্ট্যান্ডার্ড উপায় এবং কেন ?
উত্তর:
আপনি যদি একটি শিরোনাম ফাইলে ঘোষণাটি এবং একটি পৃথক .cpp
ফাইলে সংজ্ঞা এবং আলাদা ফাইল #include
থেকে শিরোনাম রাখেন তবে আপনি পার্থক্যটি .cpp
দেখতে সক্ষম হবেন।
বিশেষত, ধরুন:
int Add(int a, int b);
int Add(int a, int b = 3) {
...
}
#include "lib.h"
int main() {
Add(4);
}
সংকলন test.cpp
ডিফল্ট প্যারামিটার ঘোষণাটি দেখতে পাবে না এবং ত্রুটিযুক্ত হয়ে ব্যর্থ হবে।
এই কারণে ডিফল্ট প্যারামিটার সংজ্ঞা সাধারণত ফাংশন ঘোষণায় নির্দিষ্ট করা হয় :
int Add(int a, int b = 3);
b
জন্য ডিফল্ট মান একবারে সংজ্ঞায়িত করা হয় । তবে এটি ঠিক আছে, কারণ আপনি কেবলমাত্র ফাংশনটির একটি ঘোষণা পেয়েছেন । .cpp
Add
সি ++ এ প্যারামিটার তালিকায় তাদের অবস্থান সম্পর্কিত ডিফল্ট আর্গুমেন্টগুলির উপর আরোপিত প্রয়োজনীয়তা নিম্নরূপ:
প্রদত্ত প্যারামিটারের জন্য ডিফল্ট যুক্তিটি একবারের বেশি নির্দিষ্ট করতে হবে না। এটি একাধিকবার নির্দিষ্ট করা (এমনকি একই ডিফল্ট মান সহ) অবৈধ।
ডিফল্ট যুক্তিযুক্ত প্যারামিটারগুলিকে প্যারামিটার তালিকার শেষে একটি সুসংগত গ্রুপ গঠন করতে হবে।
এখন, এই বিষয়টি মাথায় রেখে, সি ++ এ আপনাকে ফাংশনটির একটি ঘোষণা থেকে পরের দিকে ডিফল্ট আর্গুমেন্ট রয়েছে এমন পরামিতিগুলির সেটকে "বৃদ্ধি" করার অনুমতি দেওয়া হচ্ছে, যতক্ষণ না উপরের প্রয়োজনীয়তা অবিচ্ছিন্নভাবে তত্ক্ষণিত হয়।
উদাহরণস্বরূপ, আপনি কোনও ডিফল্ট তর্ক ছাড়াই একটি ফাংশন ঘোষণা করতে পারেন
void foo(int a, int b);
এই জাতীয় ঘোষণার পরে সেই ফাংশনটি কল করার জন্য আপনাকে উভয় যুক্তি সুস্পষ্টভাবে উল্লেখ করতে হবে।
পরে (আরও নীচে) একই অনুবাদ ইউনিটে, আপনি এটি আবার ঘোষণা করতে পারেন, তবে এবার একটি ডিফল্ট যুক্তি দিয়ে
void foo(int a, int b = 5);
এবং এই মুহুর্ত থেকে আপনি এটিকে কেবল একটি স্পষ্ট যুক্তি দিয়ে কল করতে পারেন।
আরও নীচে আপনি এটি আবার ঘোষণা করতে পারেন আবার একটি ডিফল্ট যুক্তি যুক্ত করে
void foo(int a = 1, int b);
এবং এই মুহুর্ত থেকে আপনি এটিকে কোনও স্পষ্ট যুক্তি ছাড়াই কল করতে পারেন।
পুরো উদাহরণটি নীচের মত দেখতে পারে
void foo(int a, int b);
int main()
{
foo(2, 3);
void foo(int a, int b = 5); // redeclare
foo(8); // OK, calls `foo(8, 5)`
void foo(int a = 1, int b); // redeclare again
foo(); // OK, calls `foo(1, 5)`
}
void foo(int a, int b)
{
// ...
}
আপনার প্রশ্নের কোড হিসাবে, উভয় রূপগুলি পুরোপুরি বৈধ, তবে তাদের অর্থ ভিন্ন জিনিস। প্রথম রূপটি এখনই দ্বিতীয় প্যারামিটারের জন্য একটি ডিফল্ট যুক্তি ঘোষণা করে। দ্বিতীয় বৈকল্পিকটি প্রাথমিকভাবে কোনও ডিফল্ট তর্ক ছাড়াই আপনার ফাংশনটি ঘোষণা করে এবং তারপরে দ্বিতীয় প্যারামিটারের জন্য একটি যুক্ত করে।
আপনার ঘোষণার উভয়েরই নেট এফেক্ট (যেমন এটি দ্বিতীয় ঘোষণার পরে কোড দ্বারা দেখা যায়) হুবহু এক রকম: ফাংশনটির দ্বিতীয় প্যারামিটারের জন্য ডিফল্ট যুক্তি রয়েছে। তবে, আপনি যদি প্রথম এবং দ্বিতীয় ঘোষণার মধ্যে কিছু কোড স্কেচ করতে পরিচালনা করেন তবে এই দুটি বৈকল্পিক ভিন্ন আচরণ করবে। দ্বিতীয় ভেরিয়েন্টে ফাংশনটির ঘোষণার মধ্যে কোনও ডিফল্ট আর্গুমেন্ট নেই, সুতরাং আপনাকে উভয় যুক্তি সুস্পষ্টভাবে উল্লেখ করতে হবে।
void foo(int a = 1, int b)
এটি পরে ঘোষণা করতে হবে void foo(int a, int b = 5)
। হ্যাঁ, এটি কাজ করবে। এবং না এটি কোনও সিনট্যাক্স ত্রুটি নয়। g ++ 4.5.3 একেবারে সূক্ষ্মভাবে সংকলন করবে।
int foo(int)
। আমি দেখতে পেলাম যে আমি int foo(int=5)
আবার লিখতে পারি , প্যারামিটারের নামগুলি রেখে। কেউ এখনও তা উল্লেখ করেনি বলে মনে হয়।
প্রথম উপায় দ্বিতীয় পছন্দ করা হবে।
এর কারণ হ্যাডার ফাইলটি দেখায় যে প্যারামিটারটি alচ্ছিক এবং এর ডিফল্ট মানটি কী হবে। তদ্ব্যতীত, এটি নিশ্চিত করবে যে ডিফল্ট মানটি একই হবে, সংশ্লিষ্ট .cpp ফাইলটির প্রয়োগ কোনও বিষয় নয়।
দ্বিতীয় উপায়ে, দ্বিতীয় প্যারামিটারের জন্য কোনও ডিফল্ট মানের কোনও গ্যারান্টি নেই। ডিফল্ট মান পরিবর্তন করতে পারে, কীভাবে সম্পর্কিত .cpp ফাইল বাস্তবায়িত হয় তার উপর নির্ভর করে।
b
একাধিকবার সংজ্ঞায়িত করা হবে, প্রতিটি সংকলনের ইউনিটের জন্য একবার অন্তর্ভুক্ত রয়েছেlib.h
, তা কি ঠিক?