আমার মতে, সি ++ এর বিপদগুলি কিছুটা অতিরঞ্জিত।
অপরিহার্য বিপদটি হ'ল: সি # আপনাকে unsafe
কীওয়ার্ডটি ব্যবহার করে "অনিরাপদ" পয়েন্টার ক্রিয়াকলাপ করতে দেয় , সি ++ (বেশিরভাগ ক্ষেত্রে সি এর সুপারস্টেট হওয়া) আপনাকে যখনই মনে হয় পয়েন্টার ব্যবহার করতে দেয়। পয়েন্টার (যা সি এর সাথে সমান) ব্যবহারের সাথে অন্তর্নিহিত স্বাভাবিক বিপদগুলি ছাড়াও, মেমরি-ফাঁস, বাফার ওভারফ্লো, ডাঙ্গালিং পয়েন্টার ইত্যাদির মতো, সি ++ আপনাকে গুরুত্ব সহকারে জিনিসগুলি স্ক্রু করার জন্য নতুন উপায় প্রবর্তন করে।
এই "অতিরিক্ত দড়ি", তাই বলার জন্য, যায়েল স্পলস্কি যার কথা বলছিলেন , মূলত একটি জিনিস অবতীর্ণ হয় : লেখার ক্লাসগুলি যা অভ্যন্তরীণভাবে তাদের নিজস্ব স্মৃতি পরিচালনা করে, " 3 এর বিধি " হিসাবে পরিচিত, (যা এখন রুল বলা যেতে পারে) 4 বা সি ++ 11 এ 5 এর বিধি)। এর অর্থ, আপনি যদি এমন কোনও ক্লাস লিখতে চান যা অভ্যন্তরীণভাবে তার নিজস্ব মেমরি বরাদ্দ পরিচালনা করে তবে আপনি কী করছেন তা জানতে হবে অন্যথায় আপনার প্রোগ্রামটি ক্র্যাশ হওয়ার সম্ভাবনা রয়েছে। আপনাকে সাবধানে একটি কনস্ট্রাক্টর, কপি কনস্ট্রাক্টর, ডেস্ট্রাক্টর এবং অ্যাসাইনমেন্ট অপারেটর তৈরি করতে হবে যা আশ্চর্যজনকভাবে ভুল হওয়া সহজ, প্রায়শই রানটাইমটিতে উদ্ভট ক্র্যাশ হয়ে যায়।
তবুও , প্রকৃত প্রতিদিনের সি ++ প্রোগ্রামিংয়ে, এমন একটি ক্লাস লিখতে খুব বিরল দেখা যায় যা তার নিজস্ব স্মৃতি পরিচালনা করে, সুতরাং এটি বিভ্রান্তিকর যে এই সমস্যাগুলি এড়াতে সি ++ প্রোগ্রামারদের সর্বদা "যত্নবান" হওয়া দরকার। সাধারণত, আপনি আরও কিছু এর মতো করে যাবেন:
class Foo
{
public:
Foo(const std::string& s)
: m_first_name(s)
{ }
private:
std::string m_first_name;
};
এই শ্রেণিটি আপনি জাভা বা সি # তে যা করতে চেয়েছিলেন তার খুব কাছাকাছি দেখায় - এটির জন্য কোনও স্পষ্ট মেমরি ব্যবস্থাপনার প্রয়োজন নেই (কারণ গ্রন্থাগার ক্লাসটি std::string
স্বয়ংক্রিয়ভাবে সেগুলির সমস্ত যত্ন নেয়) এবং ডিফল্ট থেকে কোনও "3 বিধি" উপাদান কোনও প্রয়োজন হয় না all কপি কনস্ট্রাক্টর এবং এসাইনমেন্ট অপারেটর ঠিক আছে fine
আপনি যখন এমন কিছু করার চেষ্টা করেন কেবল তখনই:
class Foo
{
public:
Foo(const char* s)
{
std::size_t len = std::strlen(s);
m_name = new char[len + 1];
std::strcpy(m_name, s);
}
Foo(const Foo& f); // must implement proper copy constructor
Foo& operator = (const Foo& f); // must implement proper assignment operator
~Foo(); // must free resource in destructor
private:
char* m_name;
};
এই ক্ষেত্রে, নবাগতদের জন্য অ্যাসাইনমেন্ট, ডেস্ট্রাক্টর এবং অনুলিপি কনস্ট্রাক্টরকে সঠিকভাবে প্রাপ্ত করা মুশকিল হতে পারে। তবে বেশিরভাগ ক্ষেত্রে এটি করার কোনও কারণ নেই। সি ++ এটি খুব সহজ মত গ্রন্থাগার শ্রেণীর ব্যবহার দ্বারা ম্যানুয়াল মেমরি ব্যবস্থাপনা এড়াতে সময় 99% তোলে std::string
এবং std::vector
।
অন্য একটি সম্পর্কিত সমস্যা হ'ল ম্যানুয়ালি এমনভাবে ম্যানেজ করা যা কোনও ব্যতিক্রম নিক্ষেপ হওয়ার সম্ভাবনা বিবেচনায় না নেয়। ভালো লেগেছে:
char* s = new char[100];
some_function_which_may_throw();
/* ... */
delete[] s;
যদি some_function_which_may_throw()
প্রকৃতপক্ষে কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয় তবে আপনার একটি মেমরি ফাঁস হবে কারণ এর জন্য বরাদ্দ হওয়া মেমরিটি s
কখনও পুনরুদ্ধার করা যাবে না। কিন্তু আবার, বাস্তবে এটি একই কারণেই খুব বেশি সমস্যাযুক্ত যে "" বিধি 3 "আসলেই আর কোনও সমস্যা নয়। কাঁচা পয়েন্টার সহ আপনার নিজের মেমরিটি আসলে পরিচালনা করা খুব বিরল (এবং সাধারণত অপ্রয়োজনীয়)। উপরের সমস্যাটি এড়াতে, আপনাকে যা করতে হবে তা হ'ল একটি std::string
বা ব্যবহার std::vector
করা উচিত এবং ব্যতিক্রম ছোঁড়ার পরে ডেস্ট্রাক্টর স্বয়ংক্রিয়ভাবে স্ট্যাক আনওয়ানড করার সময় অনুরোধ করা হবে।
সুতরাং, এখানে একটি সাধারণ থিমটি হ'ল অনেক সি ++ বৈশিষ্ট্য যা সি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় নি , যেমন স্বয়ংক্রিয় সূচনা / ধ্বংস, অনুলিপি নির্মাণকারী এবং ব্যতিক্রমগুলি, সি ++ এ ম্যানুয়াল মেমরি পরিচালনা করার সময় কোনও প্রোগ্রামারকে অতিরিক্ত সতর্কতা অবলম্বন করতে বাধ্য করে। তবে আবার, আপনি যদি প্রথম স্থানে ম্যানুয়াল মেমরি পরিচালনা করতে চান তবে এটি কেবল তখনই সমস্যা, যখন আপনার কাছে স্ট্যান্ডার্ড পাত্রে এবং স্মার্ট পয়েন্টার রয়েছে তখনই আর প্রয়োজন হয় না।
সুতরাং, আমার মতে, যদিও সি ++ আপনাকে প্রচুর অতিরিক্ত দড়ি দেয়, নিজেকে ফাঁসানোর জন্য এটি ব্যবহার করা খুব কমই প্রয়োজন হয় এবং জোয়েল যে সমস্যাগুলি নিয়ে কথা বলছিলেন তা আধুনিক সি ++ এ এড়ানো সহজ নয়।
Your questions should be reasonably scoped. If you can imagine an entire book that answers your question, you’re asking too much.
। আমি যেমন একটি প্রশ্ন হিসাবে এই যোগ্যতা বিশ্বাস ...