কিছু ব্যবহার সংগ্রহ করার চেষ্টা করছেন:
কিছুটা অস্থায়ীকে রেফারেন্স-টু-কনস্টেটিংয়ের জন্য বেঁধে দেওয়া, এর জীবনকাল দীর্ঘায়িত করতে। রেফারেন্সটি বেস হতে পারে - এবং এটির ডেস্ট্রাক্টরকে ভার্চুয়াল হওয়ার দরকার নেই - ডান ডাস্ট্রাস্টরকে এখনও বলা হয়:
ScopeGuard const& guard = MakeGuard(&cleanUpFunction);
কোড ব্যবহার করে ব্যাখ্যা :
struct ScopeGuard {
~ScopeGuard() { } // not virtual
};
template<typename T> struct Derived : ScopeGuard {
T t;
Derived(T t):t(t) { }
~Derived() {
t(); // call function
}
};
template<typename T> Derived<T> MakeGuard(T t) { return Derived<T>(t); }
এই কৌশলটি আলেকজান্দ্রেস্কুর স্কোপগার্ড ইউটিলিটি ক্লাসে ব্যবহৃত হয়। অস্থায়ী সুযোগের বাইরে চলে গেলে ডেরাইভের ডেস্ট্রাক্টরকে সঠিকভাবে ডাকা হয়। উপরের কোডটি কিছু ছোট বিবরণ মিস করে তবে এটির সাথে এটিই বড় চুক্তি।
অন্যদের বলার জন্য কনড ব্যবহার করুন পদ্ধতিগুলি এই বস্তুর লজিকাল অবস্থার পরিবর্তন করবে না।
struct SmartPtr {
int getCopies() const { return mCopiesMade; }
};
কপিরাইট অন লেখার ক্লাসগুলির জন্য কনস্ট ব্যবহার করুন, সংকলক আপনাকে কখন এবং কখন অনুলিপি করতে হবে না তা সিদ্ধান্ত নিতে সহায়তা করে।
struct MyString {
char * getData() { /* copy: caller might write */ return mData; }
char const* getData() const { return mData; }
};
ব্যাখ্যা : আপনি যখন কোনও কিছু অনুলিপি করতে পারবেন ততক্ষণ আপনি ডেটা ভাগ করতে চাইবেন যতক্ষণ না মূল এবং ডেপুটি অবজেক্টের ডেটা একই থাকে। একবার অবজেক্টের একটিতে ডেটা পরিবর্তন হয়ে গেলে আপনার এখন দুটি সংস্করণ দরকার: একটি মূলটির জন্য এবং একটি অনুলিপিটির জন্য। এটি হ'ল আপনি যে কোনও একটি বস্তুর লেখার অনুলিপি করেছেন , যাতে এখন তাদের উভয়েরই নিজস্ব সংস্করণ রয়েছে।
কোড ব্যবহার :
int main() {
string const a = "1234";
string const b = a;
// outputs the same address for COW strings
cout << (void*)&a[0] << ", " << (void*)&b[0];
}
উপরের স্নিপেটটি আমার জিসিসিতে একই ঠিকানাটি মুদ্রণ করে, কারণ ব্যবহৃত সি ++ গ্রন্থাগার একটি অনুলিপি অনুলিপি প্রয়োগ করে std::string
। উভয় স্ট্রিং, যদিও তারা স্বতন্ত্র বস্তু, তাদের স্ট্রিং ডেটার জন্য একই মেমরি ভাগ করে। b
নন-কনস্ট্যান্ট তৈরি করা নন-কনস্ট্যান্ট সংস্করণটিকে পছন্দ করবে operator[]
এবং জিসিসি ব্যাকিং মেমোরি বাফারের একটি অনুলিপি তৈরি করবে, কারণ আমরা এটি পরিবর্তন করতে পারি এবং এটির ডেটা প্রভাবিত করতে হবে না a
!
int main() {
string const a = "1234";
string b = a;
// outputs different addresses!
cout << (void*)&a[0] << ", " << (void*)&b[0];
}
অনুলিপি বস্তু এবং টেম্পোরারিগুলি থেকে অনুলিপি তৈরির জন্য অনুলিপি-নির্মাতার জন্য :
struct MyClass {
MyClass(MyClass const& that) { /* make copy of that */ }
};
ধ্রুবকভাবে পরিবর্তন করতে পারে না এমন ধ্রুবক তৈরির জন্য
double const PI = 3.1415;
মান ব্যতীত রেফারেন্সের মাধ্যমে স্বেচ্ছাচারিত বস্তুগুলি পাস করার জন্য - সম্ভবত ব্যয়বহুল বা অসম্ভবকে বাই-মান পাস করা রোধ করতে
void PrintIt(Object const& obj) {
// ...
}