কম্পিউটার টিউটোরিয়াল

C++-এ কপি ইনিশিয়ালাইজেশন vs ডায়রেক্ট ইনিশিয়ালাইজেশন পার্থক্য

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 InitializationDirect 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; কপি ইনিশিয়ালাইজেশন (টাইপ ডেডাকশন सह)।
  1. C++-এ struct এবং typedef struct-এর পার্থক্য

  2. C++-এ new অপারেটর এবং operator new-এর পার্থক্য কী?

  3. C++-এ 'struct' এবং 'typedef struct'-এর পার্থক্য

  4. C++ স্ট্রিং কনস্ট্যান্ট এবং ক্যারেক্টার কনস্ট্যান্টের পার্থক্য