tutorial - the c++ programming language




টাইপ নাম পরে বন্ধনী নতুন সঙ্গে একটি পার্থক্য করতে না? (4)

আসুন পেড্যান্টিক হব, কারণ পার্থক্যগুলি আসলে আপনার কোডের আচরণকে প্রভাবিত করতে পারে। নিচের বেশিরভাগটি একটি "ওল্ড নিউ থিং" নিবন্ধে মন্তব্য করা হয়েছে।

কখনও কখনও নতুন অপারেটর দ্বারা ফেরত আসা মেমরিটি শুরু করা হবে এবং কখনও কখনও এটি কোনও পড (প্লেইন পুরাতন ডেটা) বা এটি POD সদস্যদের রয়েছে এমন কোনও শ্রেণির সাথে সম্পর্কিত হয় কিনা তা নির্ভর করে এবং এটি ব্যবহার করে কম্পাইলার উত্পন্ন ডিফল্ট কন্সট্রাকটর।

  • সি ++ 1998 তে প্রাথমিকভাবে 2 ধরণের প্রকার: শূন্য এবং ডিফল্ট
  • সি ++ ২003 সালে তৃতীয় প্রকারের সূচনা, মূল্য প্রারম্ভিকতা যোগ করা হয়েছে।

ধরে:

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

একটি সি ++ 98 কম্পাইলারের মধ্যে নিম্নলিখিতগুলি ঘটতে হবে:

  • new A - অনিশ্চিত মান
  • new A() - শূন্য-প্রাথমিক

  • new B - ডিফল্ট গঠন (B :: m অনিয়মিত)

  • new B() - ডিফল্ট গঠন (B :: m অনিয়মিত)

  • new C - ডিফল্ট গঠন (C :: m শূন্য-প্রাথমিক)

  • new C() - ডিফল্ট গঠন (C :: m শূন্য-প্রাথমিক)

একটি সি ++ 03 কনফরম্যান্ট কম্পাইলারে, জিনিসগুলি এমনভাবে কাজ করা উচিত:

  • new A - অনিশ্চিত মান
  • new A() - মূল্য-প্রাথমিক A, এটি একটি পড থেকে শূন্য-সূচনা হয়।

  • new B - ডিফল্ট-ইনিশিয়ালাইজেসস (পাতাগুলি B :: m uninitialized)

  • new B() - ভ্যালু-ই আরম্ভ করে যা তার ডিফল্ট ctor থেকে সমস্ত ক্ষেত্র শূন্য-প্রাথমিক করে ব্যবহারকারীর সংজ্ঞায়িত-বিরোধী হিসাবে কম্পাইলার তৈরি হয়।

  • new C - ডিফল্ট-প্রাথমিক C, যা ডিফল্ট ctor কল করে।

  • new C() - মূল্য-প্রাথমিক C, যা ডিফল্ট ctor কল করে।

সুতরাং সি ++ এর সমস্ত সংস্করণে new A এবং new A() মধ্যে একটি পার্থক্য রয়েছে কারণ A একটি POD।

এবং new B() ক্ষেত্রে C ++ 98 এবং C ++ 03 এর মধ্যে আচরণের মধ্যে একটি পার্থক্য রয়েছে।

এটি C ++ এর ধুলো কোণগুলির মধ্যে একটি যা আপনাকে পাগল করে তুলতে পারে। কোন বস্তু তৈরি করার সময়, কখনও কখনও আপনি পিতামাতাদের চান / প্রয়োজন বোধ করেন, কখনও কখনও আপনি একেবারে তাদের পেতে পারেন না, এবং কখনও কখনও এটি কোন ব্যাপার না।

যদি 'টেস্ট' একটি সাধারণ শ্রেণী হয় তবে এর মধ্যে কোন পার্থক্য রয়েছে:

Test* test = new Test;

এবং

Test* test = new Test();

টেস্ট একটি সংজ্ঞায়িত কনস্ট্রাক্টর সঙ্গে একটি বর্গ অনুমান, কোন পার্থক্য আছে। পরের ফর্মটি পরিষ্কার করে তোলে যে টেস্টের কন্সট্রাকটর চলছে, কিন্তু এটিই এটি সম্পর্কে।


সাধারণত আমরা প্রথম ক্ষেত্রে ডিফল্ট-প্রাথমিককরণ এবং দ্বিতীয় ক্ষেত্রে মান-প্রাথমিককরণ আছে।

উদাহরণস্বরূপ: int (POD টাইপ) সহ ক্ষেত্রে:

  • int* test = new int - আমরা যেকোন প্রারম্ভিকতা এবং মান * পরীক্ষা হতে পারে।

  • int* test = new int() - * পরীক্ষা 0 মান থাকবে।

পরবর্তী আচরণ আপনার টাইপ পরীক্ষা থেকে নির্ভরশীল। আমরা defferent ক্ষেত্রে আছে: টেস্ট deflector def defor, টেস্ট ডিফল্ট কন্সট্রাকটর তৈরি করেছে, টেস্ট POD সদস্য, অ পড সদস্য রয়েছে ...


new Thing(); স্পষ্ট যে আপনি একটি কন্সট্রাকটর বলা হয় যখন new Thing; নির্মাতা বলা হয় না যদি আপনি মনে করেন না বোঝানো হয়।

একটি ব্যবহারকারী-সংজ্ঞায়িত কনস্ট্রাক্টর সঙ্গে একটি কাঠামো / বর্গ ব্যবহৃত হলে, কোন পার্থক্য নেই। যদি একটি তুচ্ছ কাঠামো / বর্গের উপর বলা হয় (উদাহরণস্বরূপ struct Thing { int i; }; ) তাহলে new Thing; malloc(sizeof(Thing)); মত malloc(sizeof(Thing)); new Thing(); calloc(sizeof(Thing)); মত calloc(sizeof(Thing)); - এটা শূন্য শুরু হয়।

গোটচা মাঝে মধ্যে রয়েছে:

struct Thingy {
  ~Thingy(); // No-longer a trivial class
  virtual WaxOn();
  int i;
};

new Thingy; আচরণ new Thingy; বনাম new Thingy(); এই ক্ষেত্রে C ++ 98 এবং C ++ 2003 এর মধ্যে পরিবর্তিত হয়েছে। কিভাবে এবং কেন জন্য মাইকেল Burr এর ব্যাখ্যা দেখুন।





c++-faq