C++-এ অবজেক্ট ইনিশিয়ালাইজেশনের দুটি মূল পদ্ধতি: কপি ইনিশিয়ালাইজেশন এবং ডায়রেক্ট ইনিশিয়ালাইজেশন। তাদের আচরণে পার্থক্য রয়েছে।
সিনট্যাক্স
// Copy initialization
Type obj = other_obj; // কনভার্সন কনস্ট্রাক্টর/কপি কনস্ট্রাক্টর কল
Type obj = value; // ইমপ্লিসিট কনভার্সন + কপি/মুভ
// Direct initialization
Type obj(value); // কনস্ট্রাক্টর ডিরেক্ট কল
Type obj{value}; // লিস্ট ইনিশিয়ালাইজেশন (C++11, narrowing conversion বাধা দেয়)
Type obj = {value}; // কপি লিস্ট ইনিশিয়ালাইজেশন
প্রধান পার্থক্য
| বিষয় | Copy Initialization | Direct Initialization |
|---|---|---|
| সিনট্যাক্স | T obj = expr; | T obj(expr); বা T obj{expr}; |
| Explicit কনস্ট্রাক্টর | কল করতে পারে না | কল করতে পারে হ্যাঁ |
| ন্যারোইং কনভার্সন | অনুমোদিত (C++11-এ লিস্টে নয়) | অনুমোদিত (লিস্ট ইনিশিয়ালাইজেশনে নয়) |
| টেমপরি অবজেক্ট | বनाয় (C++17 copy elision-এ অপ্টিমাইজ) | সিরাসরি কনস্ট্রাক্ট |
| অ্যাসাইনমেন্ট অপারেটর | নয় (কনস্ট্রাক্টর কল হয়) | নয় (কনস্ট্রাক্টর কল হয়) |
উদাহরণ
class MyClass {
public:
explicit MyClass(int x) : val(x) {}
MyClass(const MyClass&) { cout << "Copy ctor\n"; }
MyClass(MyClass&&) { cout << "Move ctor\n"; }
int val;
};
int main() {
MyClass a = 10; // Error: explicit constructor
MyClass b(10); // OK: direct init
MyClass c = MyClass(10); // OK: direct init of temporary, then move (elided)
MyClass d = b; // Copy init: copy ctor
MyClass e = std::move(b); // Copy init: move ctor
return 0;
}
সেরা অনুশীলন
- Direct initialization (parentheses বা braces) পছন্দ করুন - এটি স্পষ্ট, explicit কনস্ট্রাক্টর সাপোর্ট করে, narrowing conversion বাধা দেয় (braces)।
- C++17-এ copy elision গ্যারান্টিড, তাই `T obj = T(args)`-এ এক্সট্রা কপি/মুভ নেই।
auto x = expr;কপি ইনিশিয়ালাইজেশন (টাইপ ডেডাকশন सह)।