কীভাবে সি ++ 11 এ স্যুইচ করবেন?


35

আমি কিছু সময়ের জন্য সি ++ এ প্রোগ্রামিং করছি তবে বেশিরভাগ জিনিস সি ++ এর নিম্ন-স্তরের বৈশিষ্ট্যগুলিকে কেন্দ্র করে। এর অর্থ আমার বেশিরভাগ পয়েন্টার এবং কাঁচা অ্যারে নিয়ে কাজ করা। আমি মনে করি এই আচরণটি ক্লাস সহ সি ++ সি হিসাবে ব্যবহার হিসাবে পরিচিত। এটি সত্ত্বেও, আমি সম্প্রতি প্রথমবারের জন্য সি চেষ্টা করেছি। আমি আনন্দদায়কভাবে অবাক হয়েছিল যে সি # এবং জাভা এর মতো ভাষা কীভাবে ডকোরিজ এবং তালিকার মতো সুবিধাজনক স্ট্যান্ডার্ড গ্রন্থাগার ক্লাসে এই বিবরণগুলি লুকিয়ে রাখে।

আমি সচেতন যে সি ++ স্ট্যান্ডার্ড লাইব্রেরিতে ভেক্টর, মানচিত্র এবং স্ট্রিংয়ের মতো অনেকগুলি ধারক রয়েছে এবং সি ++ 11 কেবল এসটিডি :: অ্যারে এবং রেঞ্জযুক্ত লুপ থাকার মাধ্যমে এটিতে যুক্ত হয়।

আমি কীভাবে এই আধুনিক ভাষার বৈশিষ্ট্যগুলি ব্যবহার করতে শিখি এবং কোন মুহুর্তের জন্য উপযুক্ত? এটা কি ঠিক যে আজকাল সি ++ তে সফটওয়্যার ইঞ্জিনিয়ারিং বেশিরভাগ ম্যানুয়াল মেমরি পরিচালনা থেকে মুক্ত?

শেষ অবধি, নতুন স্ট্যান্ডার্ডটি সর্বাধিক তৈরি করতে আমার কোন সংকলকটি ব্যবহার করা উচিত? ভিজ্যুয়াল স্টুডিওতে দুর্দান্ত ডিবাগিং সরঞ্জাম রয়েছে তবে ভিএস ২০১২-তেও ভয়ঙ্কর সি ++ 11 সমর্থন রয়েছে বলে মনে হয়।


2
আমি বলব ভিএস ২০১২ এর সি ++ ১১ সাপোর্টকে "ভয়ঙ্কর" বলাটা কিছুটা অতিরঞ্জিত, তবে এটি অবশ্যই আরও ভাল হতে পারে (অনুপস্থিত আরম্ভকারী তালিকাগুলি বিশেষত টেস্ট / খেলনা কোডের জন্য বিরক্তিকর)। তবে নোট করুন যে তারা ঘোষণা করেছিলেন যে তারা বাকী ভিএসের তুলনায় স্বাধীনভাবে সংকলক আপডেটগুলি শিপিং করবে, সুতরাং আমি অনুমান করি যে আমরা ২০১৩ চলাকালীন ভিএস ২০১২-তে বেশ কয়েকটি সি ++ ১১ টি বৈশিষ্ট্যের জন্য আশা করতে পারি।
মার্টিন বা

3
প্রথমে আমি ভেবেছিলাম এটি সি ++ 11 শেখার জন্য পরামর্শ দেওয়া অদ্ভুত হবে, তবে আপনি এখনও সি-উইথ-ক্লাসের জমিতে আটকে রয়েছেন ... এক দশক আগে আমি কোয়েনিগ / মু'র এক্সিলারেটেড সি ++ পড়েছিলাম । আমি আসলে ইতিমধ্যে টেমপ্লেট মেটা-প্রোগ্রামিং করছিলাম (আমি কেবল এটি একটি পর্যালোচনার জন্য পড়ি), তবে এটি এখনও প্রকাশের মতো অনুভূত হয়েছিল। (আমি তখন থেকেই এটি সি ++ পড়ানোর ভিত্তি হিসাবে ব্যবহার করেছি)) সি উইথ ক্লাস থেকে এসে বইটি আপনাকে সম্পূর্ণ নতুন ভাষা দেখাতে পারে যা আপনি জানেন না যে আপনার নিজের হাতে ছিল। এটি কেবল 250 পৃষ্ঠাগুলি, এবং এরপরে আপনি দ্রুত সি ++ 11-নির্দিষ্ট কিছুতে অগ্রসর হতে পারেন তবে IMO এটি একটি সার্থক পদক্ষেপ।
এসবিআই

উত্তর:


50

প্রথমে থাম্বের কিছু নিয়ম:

  • 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);

6
থাম্বের এই নিয়মের কিছু বাধ্যতামূলক নীতি আছে? এটি পরামর্শের একটি দুর্দান্ত তালিকার মতো মনে হচ্ছে, তবে ... গুগলের মাধ্যমে এই প্রশ্নে বহিরাগত হিসাবে আগত আপনার উত্তর কীভাবে আমাকে সিডিক্যাল উপায়ে সি ++ 11 বাছাই করতে সহায়তা করে এবং সি ++ এক্সেলের চারপাশে নিজেকে গুটিয়ে না রেখে কীভাবে এটি ব্যবহার করে? ?
রবার্ট হার্ভে

3
তালিকার জন্য +1, তবে আমার একটি ছোট্ট নটপিক রয়েছে: যখন (যথাযথভাবে) সতর্কবার্তা std::for_eachআমি লুপের উপর ভিত্তি করে ব্যাপ্তিকে প্লেনের চেয়ে আরও ভাল প্রতিস্থাপন হিসাবে প্রত্যাশা করতাম for
ফ্যাবিও ফ্রাকাসি

@ ফ্যাবিওফ্রেসি: ওফস আমি বিপরীতে স্পষ্টভাবে লিখেছি std::for_each, পরিসীমা ভিত্তিক নয় । বিভ্রান্তি এড়াতে আমি এটি সরিয়েছি।
জন পুর্ডি

1
এটি না থাকলে আমি আপডেট করব std::for_each()। যখন আপনার ল্যাম্বদা থাকে, এটি অবশ্যই একটি traditional forতিহ্যবাহী লুপের চেয়ে ভাল । একটি পরিসীমা ভিত্তিক forলুপের সাথে এটি নাও হতে পারে তবে আপনি "পরিসীমা ভিত্তিক forলুপ" লিখেন নি ।
এসবিআই

@ এসবিআই: আমার মনে, " forলুপ" শব্দটিতে "পরিসর-ভিত্তিক forলুপ" অন্তর্ভুক্ত রয়েছে । আমি আরও ব্যাখ্যা এবং স্পষ্ট করে একটি উদাহরণ দিয়ে সম্পাদনা করেছি, আপনাকে ধন্যবাদ।
জন পুরি

12

একটি সূচনা পয়েন্ট হিসাবে:

  • char*স্ট্রিংগুলির জন্য ব্যবহার বন্ধ করুন । ব্যবহারের std::stringবা std::wstringএবং মাত্র আপনার কোড খাটো পেতে ঘড়ি, আরো পাঠযোগ্য এবং নিরাপদ
  • সি স্টাইলের অ্যারেগুলি (যেগুলির সাথে ঘোষিত জিনিসগুলি [ ]) ব্যবহার করা std::vectorবা কিছু অন্যান্য উপযুক্ত ধারক শ্রেণি ব্যবহার বন্ধ করুন। সুন্দর জিনিসগুলি std::vectorহ'ল এটি নিজের দৈর্ঘ্যটি জানে, সুযোগের বাইরে গেলে এটি এর সামগ্রীগুলি পরিষ্কার করে দেয়, পুনরাবৃত্তি করা সহজ এবং আপনি আরও আইটেম যুক্ত করলে এটি নিজেকে বড় করে তোলে। তবে অন্যান্য সংগ্রহ রয়েছে যেগুলি আপনার পরিস্থিতিতে আরও ভাল কাজ করতে পারে।
  • ব্যবহার করুন std::unique_ptr- এবং std::moveপ্রায় অবিলম্বে শিখুন । যেহেতু এই কিছু noncopyable বস্তু হতে পারে, আলস্য মাঝেমধ্যে তোমার দিকে পাঠাতে পারে std::shared_ptr- এবং আপনার জন্য কিছু প্রকৃত ব্যবহারের ক্ষেত্রে থাকতে পারে std::shared_ptrপাশাপাশি
  • autoপূর্ববর্তী ঘোষণার উপর নির্ভর করে পুনরাবৃত্তকারী এবং প্রকারগুলি ঘোষণা করার সময় ব্যবহার করুন (যেমন আগে আপনি কোনও কিছুর ভেক্টর ঘোষণা করেছিলেন, এখন আপনি কোনও কিছু ঘোষণা করছেন, ব্যবহার করুন auto)
  • অ্যালগরিদম এবং for_eachযখনই আপনি পারেন "কাঁচা জন্য" ব্যবহার করুন যখনই আপনি আপনার লুপটি যত্ন সহকারে পড়তে অন্যদের বাঁচান এই সিদ্ধান্তে যে আপনি আসলে পুরো সংগ্রহের উপরে পুনরাবৃত্তি করছেন ইত্যাদি If যদি আপনার সংকলক "রেঞ্জ" সমর্থন করে তবে এটি ব্যবহার করুন for_each। মত তুচ্ছ অ্যালগরিদম কল জানুন iota, generate, accumulate, find_ifইত্যাদি।
  • ল্যাম্বডাস ব্যবহার করুন - এগুলি অ্যালগরিদমগুলি লাভ করার সহজ উপায়। তারা আরও অনেক কিছু জন্য দরজা খুলুন।

কোন সংকলকটি ব্যবহার করবেন সে সম্পর্কে খুব বেশি কাজ করবেন না। ভিএস ২০১২-তে সি ++ 11 সমর্থনের "ভয়ানক, ভয়াবহ" অভাবটি হ'ল এখানে ভেরিয়ডিক টেম্পলেট নেই (হ্যাঁ, আপনি কেবল ভেরিয়াদিক টেম্পলেট ব্যবহার করতে চলেছিলেন) এবং আরম্ভকারীটি {}সেখানে নেই। আমি এটিও চাই তবে আমি এটির উপরে কোনও কার্যকর বিকাশ সরঞ্জাম ব্যবহার করা বিরত করব।

দ্বিতীয় জিনিসটি, আলিঙ্গন করার পরে std::, আরআইআইআই চিন্তা শুরু করা। আপনি যে কোনও সময়

  • কাজ শুরু
  • ক্রিয়া শুরুর থেকে আপনি যে কিছু পেয়েছেন তার ক্রিয়াগুলির ক্রম
  • ব্যতিক্রমের ক্ষেত্রেও হওয়া দরকার এমন ক্লিনআপ অ্যাকশন

তারপরে আপনার যা আছে তা হ'ল একজন কনস্ট্রাক্টর, বেশ কয়েকটি সদস্য ফাংশন এবং ডেস্ট্রাক্টর। আপনার জন্য যে যত্ন নেয় এমন একটি ক্লাস লিখুন। আপনি এমনকি ctor এবং dtor লিখতে হবে না। একটি ফেলে shared_ptrএকটি বর্গ সদস্য পরিবর্তনশীল যেমন RAII একটি উদাহরণ - আপনি লিখতে মেমরি ব্যবস্থাপনা কোড না, কিন্তু যখন আপনার উদাহরণস্বরূপ সাধ্যের বাইরে যায়, সঠিক জিনিস ঘটবে। ফাইলগুলি বন্ধ করা, হ্যান্ডলগুলি প্রকাশ করা, লকগুলি ইত্যাদি কোডের মতো বিষয়গুলি কভার করার চিন্তাভাবনাটি প্রসারিত করুন এবং কোডটি আপনার চোখের সামনে সহজ এবং আরও ছোট (ফাঁস দূর করার সময়) পাবেন।

আপনি কি সত্যিই আত্মবিশ্বাসী বোধ করছি, তাহলে রেচক পদার্থ printfপক্ষে cout, ম্যাক্রো (পরিত্রাণ পেতে #defineকাপড়), এবং PIMPL মত কিছু "উন্নত বাগধারার" শিখতে শুরু। আমি Plurasight এ এ সম্পর্কে একটি সম্পূর্ণ কোর্স আছে যা আপনি সম্ভবত তাদের বিনামূল্যে ট্রায়াল ব্যবহার করে দেখতে পারেন।


2
আমি পছন্দ করি আপনি কীভাবে তাকে শীঘ্রই যে কোনও সময় ভ্যারিয়েডিক টেম্পলেট ব্যবহার করছেন না তা সম্পর্কে ব্যঙ্গাত্মক হয়ে উঠছেন তবে আমি মনে করি যে ইউনিফর্ম সূচনা হারিয়ে যাওয়া দৈনন্দিন প্রোগ্রামিংয়ের জন্য সত্যিই গুরুত্বপূর্ণ কিছু অনুপস্থিত।
এসবিআই

প্রারম্ভিক তালিকার জন্য অপেক্ষা করতে পারি না ... আমরা কখন সেগুলি পাব তা খুঁজে পাওয়ার অপেক্ষায় ...
কেট গ্রেগরি

ভিএস ২০১২-তে আরেকটি গুরুত্বপূর্ণ অভাব হ'ল "রেভ্যালু রেফারেন্স ভি 3", অর্থাৎ স্বয়ংক্রিয়ভাবে উত্পন্ন মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইন্ট।
মিঃসি 64

3

আমি কীভাবে এই আধুনিক ভাষার বৈশিষ্ট্যগুলি ব্যবহার করতে শিখি এবং কোন মুহুর্তের জন্য উপযুক্ত?

প্রোগ্রামিং দ্বারা। অভিজ্ঞতা হল শেখার সর্বোত্তম উপায়।

সি ++ 11 এর প্রচুর নতুন বৈশিষ্ট্য রয়েছে (অটো, রেভ্যালু, নতুন স্মার্ট পয়েন্টার - কেবলমাত্র কয়েকটি নাম রাখার জন্য)। সর্বোত্তম শুরুটি হ'ল কেবল সেগুলি ব্যবহার শুরু করা এবং যখনই আপনি পারেন সেগুলি সম্পর্কে পড়ুন এবং যখনই আপনি একটি আকর্ষণীয় নিবন্ধ পাবেন।

এটা কি ঠিক যে আজকাল সি ++ তে সফটওয়্যার ইঞ্জিনিয়ারিং বেশিরভাগ ম্যানুয়াল মেমরি পরিচালনা থেকে মুক্ত?

এটি আপনার যা করা দরকার তা নির্ভর করে। বেশিরভাগ অ্যাপ্লিকেশন স্মার্ট পয়েন্টার নিয়ে চলে যেতে পারে এবং মেমরি পরিচালনা সম্পর্কে ভুলে যেতে পারে। এখনও এমন অ্যাপ্লিকেশন রয়েছে যা এতো সহজে চলে যেতে পারে না (উদাহরণস্বরূপ যদি তাদের কোনও নতুন স্থানের প্রয়োজন হয় বা যে কোনও কারণে কাস্টম মেমরি বরাদ্দকারী প্রয়োজন হয়)।

আপনার যদি Qt ব্যবহার করার প্রয়োজন হয়, আপনাকে মেমরি পরিচালনার জন্য তাদের নিয়মগুলি ব্যবহার করতে হবে।

নতুন স্ট্যান্ডার্ডটি সর্বাধিক তৈরি করতে আমার কোন সংকলকটি ব্যবহার করা উচিত?

আপনার হাতে যা আছে তা সর্বশেষ মানটিকে সমর্থন করে:

তবে কোনও সংকলক সমস্ত বৈশিষ্ট্য সমর্থন করে না।


-7

আমার বিশ্ববিদ্যালয়টি এখনও পাঠদানের জন্য সি ++ ব্যবহার করছে। আমি 5 বছর ধরে সি ++ নিয়ে প্রোগ্রাম করেছি এবং এখন আমি একজন স্নাতক ছাত্র। অবশ্যই, এখন আমি প্রচুর জাভা, রুবি ইত্যাদি ব্যবহার করছি I আমি সত্যিই আপনাকে জাভা মতো ভাষার বৈশিষ্ট্যগুলি সম্পর্কে খুব তাড়াতাড়ি না করার পরামর্শ দিচ্ছি। আমার অভিজ্ঞতা এবং মতামতে, সি ++ এর নিম্ন স্তরের বৈশিষ্ট্যগুলির পরে। টেমপ্লেট ক্লাস, টেমপ্লেট ফাংশন, অপারেটর ওভাররাইট, ভার্চুয়াল পদ্ধতি, স্মার্ট পয়েন্টার তৈরির মতো সি / সি ++ সহ জেনেরিক প্রোগ্রামিংয়ের মতো বিষয়গুলিতে আপনার নজর দেওয়া উচিত। অবজেক্ট ওরিয়েন্টেড ডিজাইন পার্টের জন্য, সি -++ এর অনেকগুলি বৈশিষ্ট্য রয়েছে এবং জাভা বহু-উত্তরাধিকারের মতো নয়। উত্তরাধিকার শক্তিশালী তবে বিপজ্জনকও। সি ++ তে অবজেক্ট ওরিয়েন্টেড ডিজাইনের বাস্তবায়ন স্তরটিও একটি ভাল বিষয়। আন্ত: প্রক্রিয়া যোগাযোগ, থ্রেডিংগুলি সি ++ তেও গুরুত্বপূর্ণ।

সংকলক এবং ডিবাগারের জন্য। আমি জানি ভিজ্যুয়াল স্টুডিও দুর্দান্ত। তবে আমি আপনাকে সত্যিই সুপারিশ করছি আপনি জিডিবি, ভালগ্র্যান্ড এবং স্থির করুন, এবং এই সরঞ্জামগুলিতে ভাল হন। মাইক্রোসফ্ট দুর্দান্ত, তবে এটি আপনার পক্ষে অনেক কিছু করেছে। একজন শিক্ষার্থী হিসাবে মাইক্রোসফ্ট আপনাকে যা করেছে তা সত্যই আপনার শেখা উচিত। সংকলকটির জন্য, জি + ইউ জিএনইউ থেকে ভাল।

সর্বোপরি, এত বছর পরে, আমি সত্যিই অনুভব করি, সর্বাধিক গুরুত্বপূর্ণ জিনিসগুলি হ'ল কাঁচা অ্যারের মতো নিম্ন স্তরের বৈশিষ্ট্য। ভেক্টর আসলেই কেবল একটি গতিশীল অ্যারে। এগুলি আমার প্রস্তাবনা, খুব সম্ভবত বিষয়গত কিছু, আপনি যা সঠিক মনে করেন কেবল তা গ্রহণ করুন।


6
কিভাবে এই প্রশ্নের উত্তর দেয়? প্রশ্নটি সাধারণভাবে সি ++ শেখার বিষয়ে নয়, তবে সি ++ 11 এ স্যুইচ করা।
রক মার্টে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.