সম্পাদনা করুন। প্রকৃতপক্ষে, আমি আমার প্রথম উত্তরে যা বলি তা বৈধ, তবে এটিই আসল কারণ .:
শুরুতে সি ছিল বস্তু-ভিত্তিক নয় (আপনি একটি ওও পদ্ধতির গ্রহণ করতে পারেন তবে এটি আপনাকে কোনও কিছু কার্যকর করতে বা প্রয়োগ করতে পারে না)।
তারপরে সি উইথ ক্লাসিস ছিল, পরে এটির নামকরণ করা হয়েছিল সি ++। সি ++ হ'ল অবজেক্ট-ওরিয়েন্টড, এবং তাই এনক্যাপসুলেশনকে উত্সাহ দেয় এবং কোনও বস্তুর আক্রমণকারীকে নিশ্চিত করে - নির্মাণের পরে এবং কোনও পদ্ধতির শুরু এবং শেষে, অবজেক্টটি বৈধ অবস্থায় থাকে।
এটির সাথে প্রাকৃতিক জিনিসটি হ'ল এটি কার্যকর করা যে কোনও শ্রেণীর সর্বদা কোনও কনস্ট্রাক্টর থাকতে হবে এটি নিশ্চিত করার জন্য এটি একটি বৈধ অবস্থায় শুরু হয় - যদি কনস্ট্রাক্টরকে এটি নিশ্চিত করার জন্য কিছু করতে না হয় তবে খালি নির্মাণকারীর এই বিষয়টিকে নথিভুক্ত করবেন ।
তবে সি ++ এর সাথে একটি লক্ষ্য সিটির সাথে সামঞ্জস্যপূর্ণ হওয়া যে যতটা সম্ভব, সমস্ত বৈধ সি প্রোগ্রামগুলিও বৈধ সি ++ প্রোগ্রাম ছিল (আর লক্ষ্য হিসাবে তত সক্রিয় নয়, এবং সি + এর সাথে বি বিবর্তনের অর্থ এটি আর ধারণ করে না )।
এর একটা প্রভাব মধ্যে কার্যকারিতা অনুলিপি ছিল struct
এবং class
। পূর্বের কাজগুলি সি ওয়ে (ডিফল্টরূপে সর্বজনীন সর্বজনীন) এবং পরবর্তীকর্মগুলি ভাল ওও উপায়ে কাজগুলি করে (ডিফল্টরূপে ব্যক্তিগতভাবে সমস্ত কিছু, বিকাশকারী সক্রিয়ভাবে তারা কী প্রকাশ্যে চায় তা প্রকাশ করে)।
আর একটি হ'ল সি এর জন্য যাতে struct
কোন কনস্ট্রাক্টর থাকতে পারে না কারণ সি'তে কনস্ট্রাক্টর নেই, সি ++ তে বৈধ হতে পারে, তারপরে এটি দেখার উপায়টির জন্য এখানে সি ++ এর অর্থ থাকা দরকার। এবং সুতরাং, কোনও কনস্ট্রাক্টর না থাকাকালীন একটি আক্রমণকারীকে সক্রিয়ভাবে নিশ্চিত করার ওও অনুশীলনের বিরুদ্ধে যাবে, সি ++ এর অর্থ এই হয়েছিল যে কোনও ডিফল্ট প্যারামিটারলেস কনস্ট্রাক্টর ছিল যে এটির মতো শূন্য শরীর রয়েছে ac
সমস্ত সি structs
এখন বৈধ সি ++ structs
, (যার অর্থ তারা সি ++ এর মতো classes
সমস্ত কিছুর সাথে একই ছিল - সদস্য এবং উত্তরাধিকার - পাবলিক) বাইরে থেকে চিকিত্সা করা হয়েছিল যেন এটিতে একটি একক, প্যারামিটারলেস কনস্ট্রাক্টর রয়েছে।
তবে আপনি যদি কোনও class
বা struct
একটিতে কনস্ট্রাক্টর রেখেছিলেন তবে আপনি সি উপায়ের পরিবর্তে সি ++ / ওও পদ্ধতিতে কাজ করছিলেন এবং কোনও ডিফল্ট কনস্ট্রাক্টরের প্রয়োজন ছিল না।
যেহেতু এটি একটি শর্টহ্যান্ড হিসাবে পরিবেশন করেছে, সামঞ্জস্যতা অন্যথায় সম্ভব না হলেও এমনকি লোকেরা এটি ব্যবহার করে চলেছে (এটি অন্যান্য সি ++ বৈশিষ্ট্যগুলি সি তে নয়) ব্যবহার করে।
সুতরাং জাভা যখন বিভিন্ন উপায়ে সি ++ এর উপর ভিত্তি করে এসেছিল এবং পরে সি # (বিভিন্ন উপায়ে সি ++ এবং জাভা ভিত্তিক) তখন তারা এই পদ্ধতির এমন কিছু রেখেছিল যেহেতু কোডার ইতিমধ্যে অভ্যস্ত হতে পারে।
স্ট্রাস্ট্রাপ তাঁর সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজে আরও লিখেছেন এবং আরও অনেক কিছু রয়েছে, সি ++ এর ডিজাইন এবং বিবর্তনে ভাষার "হুইস" এর উপর আরও ফোকাস দিয়ে ।
=== আসল উত্তর ===
যাক বলুন এটি ঘটেনি।
ধরা যাক আমি প্যারামিটারলেস কনস্ট্রাক্টর চাই না, কারণ আমি আমার ক্লাসটি একটি ছাড়া অর্থবহ অবস্থায় ফেলতে পারি না। প্রকৃতপক্ষে, এটি struct
সি # তে ঘটতে পারে (তবে আপনি যদি সি # তে অল-জিরো এবং নালগুলির অর্থবহ ব্যবহার করতে না পারেন তবে আপনি struct
সর্বজনীন-দৃশ্যমান অপ্টিমাইজেশন ব্যবহার করতে পারেন, এবং অন্যথায় এটি রয়েছে ব্যবহারে ডিজাইন ত্রুটি struct
)।
আমার শ্রেণীর আক্রমণকারীদের রক্ষা করতে সক্ষম করতে আমার একটি বিশেষ removeDefaultConstructor
কীওয়ার্ড প্রয়োজন need খুব কমপক্ষে, কোনও কলিং কোডটি ডিফল্টকে কল করে না তা নিশ্চিত করার জন্য আমার একটি ব্যক্তিগত প্যারামিটারলেস কনস্ট্রাক্টর তৈরি করতে হবে।
যা ভাষাটিকে আরও জটিল করে তোলে। না করাই ভাল।
সব মিলিয়ে ডিফল্ট অপসারণ হিসাবে কনস্ট্রাক্টর যুক্ত করার কথা না ভাবা ভাল, প্যারামিটারলেস কনস্ট্রাক্টর যা কিছু না করে যোগ করার জন্য সিনট্যাকটিক চিনির মতো কোনও কনস্ট্রাক্টর না থাকার কথা ভাবাই ভাল।