প্রথমে থাম্বের কিছু নিয়ম:
std::unique_ptrকোনও ওভারহেড স্মার্ট পয়েন্টার হিসাবে ব্যবহার করুন । আপনার প্রায়শই কাঁচা পয়েন্টার নিয়ে বিরক্ত করার দরকার নেই। std::shared_ptrবেশিরভাগ ক্ষেত্রে একইভাবে অপ্রয়োজনীয়। ভাগ করে নেওয়া মালিকানার জন্য একটি আকাঙ্ক্ষা প্রায়শই প্রথম স্থানে মালিকানা সম্পর্কে চিন্তাভাবনার অভাবকে বিশ্বাসঘাতকতা করে।
ব্যবহার করুন std::arrayস্ট্যাটিক দৈর্ঘ্যের অ্যারে এবং std::vectorগতিশীল জন্য।
জেনেরিক অ্যালগরিদমগুলি ব্যাপকভাবে ব্যবহার করুন, বিশেষত:
<algorithm>
<numeric>
<iterator>
<functional>
ব্যবহার করুন autoএবং decltype()যেখানেই তারা পাঠযোগ্যতার উপকার করে। বিশেষত, আপনি যখন কোনও জিনিস ঘোষণা করতে চান তবে এমন একটি ধরণের যা আপনি কোনও পুনরুক্তিকারী বা জটিল টেম্পলেট টাইপের মতো ব্যবহার করেন না auto। আপনি যখন অন্য জিনিসটির ধরণের ক্ষেত্রে কোনও জিনিস ঘোষণা করতে চান, তখন ব্যবহার করুন decltype()।
আপনি যখন পারেন তখন জিনিসগুলিকে টাইপ-সেফ করুন। যখন আপনার দৃ as় বক্তব্য রয়েছে যা একটি নির্দিষ্ট ধরণের জিনিসের উপর আক্রমণকারীকে চাপিয়ে দেয়, সেই যুক্তিটি কোনও প্রকারে কেন্দ্রীভূত হতে পারে। এবং এটি অগত্যা কোনও রানটাইম ওভারহেডের জন্য তৈরি করে না। এ ছাড়া এটিও বলা উচিত যে সি-স্টাইলের ক্যাসেটগুলি ( (T)x) আরও স্পষ্টত (এবং সন্ধানযোগ্য!) সি ++ - স্টাইলের ক্যাসেটের (যেমন, static_cast) পক্ষে যেতে হবে।
অবশেষে, জেনে নিন কীভাবে তিনটির নিয়ম:
- বিনাশকারী
- অনুলিপি নির্মাণকারী
- নিয়োগ অপারেটর
মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটর যুক্ত করে পাঁচটির নিয়মে পরিণত হয়েছে। এবং সাধারণভাবে মূলসূত্রের রেফারেন্সগুলি এবং কীভাবে অনুলিপি এড়ানো যায় তা বুঝুন।
তো কেমন ব্যবহার করা সবচেয়ে ভাল বৈশিষ্ট্য কঠিন সি ++, একটি জটিল ভাষা সব এটি। তবে ভাল সি ++ বিকাশের অনুশীলনগুলি সি ++ 11 এর সাথে মৌলিকভাবে পরিবর্তিত হয়নি। ম্যানুয়াল মেমরি পরিচালনার চেয়ে আপনার এখনও মেমরি-পরিচালিত পাত্রে পছন্দ করা উচিত — স্মার্ট পয়েন্টারগুলি দক্ষতার সাথে এটি করা সহজ করে তোলে।
আমি বলব যে আধুনিক সি ++ প্রকৃতপক্ষে ম্যানুয়াল মেমরি পরিচালনা থেকে বেশিরভাগ ক্ষেত্রেই মুক্ত C সি ++ এর মেমরির মডেলটির সুবিধা হ'ল এটি নির্দোষ , এটি ম্যানুয়াল নয়। অনুমানযোগ্য deallocations আরও অনুমানযোগ্য কর্মক্ষমতা জন্য।
সংকলক হিসাবে, জি ++ এবং ক্ল্যাং উভয়ই সি ++ ১১ টি বৈশিষ্ট্যের ক্ষেত্রে প্রতিযোগিতামূলক এবং তাদের ঘাটতিগুলি দ্রুত ধরা। আমি ভিজ্যুয়াল স্টুডিও ব্যবহার করি না, তাই আমি এর পক্ষে বা বিপক্ষে কথা বলতে পারি না।
অবশেষে, এ সম্পর্কে একটি নোট std::for_each: সাধারণভাবে এড়াতে।
transform, accumulate, এবং erase- remove_ifভাল পুরানো কার্মিক হয় map, foldএবং filter। তবে for_eachএটি আরও সাধারণ, এবং তাই কম অর্থবহ — এটি লুপিং ব্যতীত অন্য কোনও অভিপ্রায় প্রকাশ করে না । তদ্ব্যতীত, এটি পরিসীমা ভিত্তিক হিসাবে একই পরিস্থিতিতে ব্যবহৃত হয় for, এবং বিন্দু-মুক্ত ব্যবহৃত হলেও সিনট্যাক্টিকভাবে ভারী av বিবেচনা:
for (const auto i : container)
std::cout << i << '\n';
std::for_each(container.begin(), container.end(), [](int i) {
std::cout << i << '\n';
});
for (const auto i : container)
frobnicate(i);
std::for_each(container.begin(), container.end(), frobnicate);