نکات کلیدی
۱. زبان C++: ابزاری برای انتزاعات زیبا و کارآمد
زبان C++ برای توسعه و استفاده از انتزاعات زیبا و کارآمد طراحی شده است.
دوگانگی ماهیت. C++ به گونهای طراحی شده که فاصله میان دسترسی سطح پایین به سختافزار و حوزههای مسئله سطح بالا را پر کند. این زبان کارایی زبان C را در برنامهنویسی سیستمها به ارث برده و در عین حال مکانیزمهای قدرتمند انتزاعی را که از زبان Simula الهام گرفته شدهاند، افزوده است. هدف ارائه زبانی است که هم سریع باشد و هم بیانگر، به طوری که برنامهنویسان بتوانند مفاهیم را مستقیماً در کد بازنمایی کنند.
- نگاشت مستقیم به سختافزار
- مکانیزمهای انتزاعی مقرونبهصرفه
- زبان چندمنظوره
- گرایش به برنامهنویسی سیستمها
بدون سربار اضافی. یکی از اصول بنیادین طراحی C++ اصل «صفر سربار» است: شما برای ویژگیهایی که استفاده نمیکنید هزینهای پرداخت نمیکنید. امکانات زبان و انتزاعات پایه به گونهای طراحی شدهاند که به اندازه کد دستنویس کارآمد باشند. این موضوع برای برنامههای حساس به عملکرد و نرمافزارهای زیرساختی حیاتی است.
- کارایی در اولویت است
- هزینه ضمنی برای ویژگیهای استفادهنشده وجود ندارد
- امکان استفاده در محیطهای محدود منابع
بیان ایدهها. هدف زبان کمک به برنامهنویسان برای بیان واضح و مستقیم ایدهها در کد است. این شامل بازنمایی مفاهیم به صورت نوعها، روابط به صورت سلسلهمراتب یا پارامتریسازی، و نگهداشتن ایدههای مستقل به صورت جداگانه است. ترکیب سبکهای مختلف برنامهنویسی برای رسیدن به بهترین راهحلها تشویق میشود.
- بیان مستقیم ایدهها
- بازنمایی روابط
- نگهداشتن ایدههای مستقل جداگانه
- سادهسازی ایدههای ساده
۲. C++ مدرن (C++11) زبانی بهتر است
C++ حس زبانی نو را دارد.
تحول چشمگیر. زبان C++ طی سالها تحولات چشمگیری داشته است که مهمترین آنها استاندارد C++11 است. این تغییرات C++ را به ابزاری قدرتمندتر و پالایشیافتهتر برای نوشتن نرمافزار با کیفیت تبدیل کردهاند. C++ مدرن امکان بیان ایدهها را به شکلی واضحتر، سادهتر و مستقیمتر فراهم میکند.
- مقایسه C++11 با C++98
- افزایش قابلیت بیان
- بهبود ایمنی و عملکرد
ویژگیهای کلیدی. C++11 مجموعهای از ویژگیها را معرفی کرد که نحوه نوشتن و استفاده از C++ را به طور بنیادین تغییر دادند. این ویژگیها شامل پشتیبانی بهتر از همزمانی، مدیریت منابع، برنامهنویسی عمومی و امکانات نحوی برای کاهش کدهای تکراری است.
- پشتیبانی از همزمانی (
std::thread،std::mutex) - معنای انتقال (
std::move، مراجع rvalue) - اشارهگرهای هوشمند (
unique_ptr،shared_ptr) - توابع لامبدا
autoوconstexpr- لیستهای مقداردهی اولیه
پذیرش سبکهای مدرن. برنامهنویسان به شدت تشویق میشوند که از ویژگیها و سبکهای C++ مدرن استفاده کنند. پایبندی به سبکهای قدیمی C++98 یا C منجر به کدی با کیفیت پایینتر، نگهداری دشوارتر و احتمالاً عملکرد کمتر خواهد شد. استاندارد تضمین سازگاری رو به عقب را میدهد، اما پیشرفت ضروری است.
۳. کلاسها: پایه انتزاع
ویژگی مرکزی زبان C++ کلاس است.
نوعهای تعریفشده توسط کاربر. کلاسها مکانیزم اصلی برای ایجاد نوعهای تعریفشده توسط کاربر هستند که مفاهیم حوزه مسئله را مستقیماً در کد بازنمایی میکنند. مجموعهای مناسب از کلاسها برنامه را قابل فهمتر، قابل استدلالتر و قابل تغییرتر میکند.
- بازنمایی مفاهیم به صورت نوعها
- پایه مکانیزمهای انتزاع
- بهبود وضوح و نگهداری کد
کپسولهسازی. کلاسها امکان تمایز بین رابط عمومی (آنچه کاربران میبینند و استفاده میکنند) و جزئیات پیادهسازی خصوصی (اعضای داده و توابع کمکی) را فراهم میکنند. این امر پنهانسازی داده، تضمین استفاده منسجم از دادهها و امکان تغییر پیادهسازی بدون تأثیر بر کد کاربر را ممکن میسازد.
- رابط عمومی
- پیادهسازی خصوصی
- پنهانسازی داده
- تفکیک مسئولیتها
سازندهها و نابودگرها. سازندهها نحوه مقداردهی اولیه اشیاء را تعریف میکنند و تضمین میکنند که اشیاء در هنگام ایجاد در وضعیت معتبری قرار دارند. نابودگرها عملیات پاکسازی هنگام تخریب شیء را تعریف میکنند که برای آزادسازی منابع حیاتی است. این جفت سازنده/نابودگر اساس تکنیکهای مدیریت منابع مانند RAII است.
- مقداردهی اولیه تضمینشده
- کسب منابع (سازندهها)
- آزادسازی منابع (نابودگرها)
- نامعادلات کلاس
۴. مدیریت منابع: RAII و اشارهگرهای هوشمند
ترکیب سازنده/نابودگر پایه بسیاری از تکنیکهای زیبا است.
اصل RAII. کسب منابع همان مقداردهی اولیه است (RAII) تکنیکی بنیادین در C++ است که در آن کسب منابع به مقداردهی اولیه اشیاء (سازندهها) و آزادسازی منابع به تخریب اشیاء (نابودگرها) وابسته است. این تضمین میکند که منابع حتی در صورت پرتاب استثنا یا خروج زودهنگام از تابع به درستی مدیریت شوند.
- کسب منابع در سازندهها
- آزادسازی منابع در نابودگرها
- پاکسازی خودکار هنگام خروج از حوزه
- ایمنی در برابر استثنا
جلوگیری از نشتها. RAII به جلوگیری از نشت منابع (مانند نشت حافظه) و سایر خطاهای مدیریت منابع (حذف زودهنگام، حذف دوگانه) کمک میکند. با کپسولهسازی مالکیت منابع درون اشیاء، کامپایلر پاکسازی را به صورت خودکار انجام میدهد.
- حذف استفاده مستقیم از
newوdelete - جلوگیری از نشت حافظه
- مدیریت فایلها، قفلها، نخها و غیره
اشارهگرهای هوشمند. unique_ptr و shared_ptr اشارهگرهای هوشمند کتابخانه استاندارد هستند که با استفاده از RAII حافظه تخصیصیافته پویا را مدیریت میکنند. unique_ptr مالکیت انحصاری و shared_ptr مالکیت مشترک با شمارش مراجع را فراهم میکند. اینها به جای اشارهگرهای خام برای مدیریت اشیاء روی پشته ترجیح داده میشوند.
unique_ptr(مالکیت انحصاری)shared_ptr(مالکیت مشترک)- آزادسازی خودکار حافظه
- جلوگیری از فراخوانی دستی
delete
۵. قالبها: امکان برنامهنویسی عمومی
قالب، کلاسی یا تابعی است که با مجموعهای از نوعها یا مقادیر پارامتری میشود.
پارامتریسازی زمان کامپایل. قالبها امکان تعریف کلاسها، توابع و نامهای نوع پارامتریشده با نوعها، مقادیر یا قالبهای دیگر را فراهم میکنند. این امکان نوشتن کدی را میدهد که با انواع مختلف کار میکند بدون اینکه کارایی کاهش یابد.
- پارامتریسازی بر اساس نوع یا مقدار
- چندریختی زمان کامپایل
- تولید کد
برنامهنویسی عمومی. قالبها پایه برنامهنویسی عمومی در C++ هستند که بر طراحی الگوریتمها و ساختارهای دادهای تمرکز دارد که با هر نوعی که شرایط خاصی را داشته باشد (مفاهیم) کار میکنند. این امکان نوشتن کدی بسیار قابل استفاده مجدد، ایمن از نظر نوع و کارآمد را فراهم میکند.
- طراحی الگوریتمهای عمومی
- کار با انواع مختلف
- مفاهیم (شرایط روی آرگومانها)
کارایی. قالبها مکانیزمی زمان کامپایل هستند، به این معنی که استفاده از آنها معمولاً سربار زمان اجرا ندارد و معادل کد دستنویس است. این از طریق تکنیکهایی مانند درونخطیسازی و محاسبات زمان کامپایل حاصل میشود.
- صفر سربار زمان اجرا
- امکان درونخطیسازی
- محاسبات زمان کامپایل
۶. کتابخانه استاندارد: جعبهابزار ضروری شما
هیچ برنامه مهمی صرفاً با زبان برنامهنویسی خام نوشته نمیشود.
اجزای ضروری. کتابخانه استاندارد مجموعهای جامع از اجزای بنیادین را فراهم میکند که برای تقریباً هر برنامه C++ ضروری هستند. اینها شامل کانتینرها، الگوریتمها، امکانات ورودی/خروجی، ابزارها و پشتیبانی از همزمانی است.
- کانتینرها (vector، list، map، set)
- الگوریتمها (sort، find، copy، unique)
- جریانهای ورودی/خروجی (cin، cout، cerr)
- ابزارها (pair، tuple، اشارهگرهای هوشمند، زمان)
- پشتیبانی از همزمانی
پایه. کتابخانه استاندارد خود به زبان C++ نوشته شده است که قدرت زبان را نشان میدهد و الگویی برای طراحی خوب C++ است. این کتابخانه پایه مشترکی برای سایر کتابخانهها و برنامهها فراهم میکند و قابلیت حمل و همکاری را ترویج میکند.
- نوشته شده به زبان C++
- الگویی برای طراحی خوب
- ترویج قابلیت حمل
- امکان همکاری
ترجیح به استاندارد. برنامهنویسان به شدت تشویق میشوند که هر زمان ممکن از اجزای کتابخانه استاندارد استفاده کنند تا از بازآفرینی آنها جلوگیری شود. اجزای استاندارد به خوبی طراحی شده، بهینه و به طور گسترده در دسترس و شناخته شدهاند که هزینه نگهداری را کاهش و کیفیت کد را افزایش میدهد.
- از چرخ دوباره اختراع نکنید
- طراحی شده و بهینه
- در دسترس و شناخته شده
۷. همزمانی: پشتیبانی داخلی از پردازش موازی
همزمانی – اجرای چند وظیفه به طور همزمان – به طور گسترده برای افزایش توان عملیاتی (با استفاده از چند پردازنده برای یک محاسبه) یا بهبود پاسخگویی (اجازه دادن به پیشرفت بخشی از برنامه در حالی که بخش دیگر منتظر پاسخ است) استفاده میشود.
ویژگی مدرن. C++ پشتیبانی قوی، قابل حمل و ایمن از نظر نوع برای برنامهنویسی همزمان دارد که نیازهای سختافزارهای چند هستهای مدرن را برآورده میکند. این افزوده مهمی در C++11 است.
- پشتیبانی داخلی
- قابل حمل و ایمن از نظر نوع
- پاسخ به پردازندههای چند هستهای
نخها و وظایف. کتابخانه مدیریت سطح پایین نخها (std::thread) و انتزاعات سطح بالاتر مبتنی بر وظیفه (std::future، std::async) را فراهم میکند. نخها فضای آدرس مشترک دارند که نیازمند هماهنگی دقیق برای جلوگیری از رقابت داده است.
std::threadبرای نخهای سیستمی- فضای آدرس مشترک
- همزمانی مبتنی بر وظیفه (
std::async)
هماهنگی. مکانیزمهایی مانند میوتکسها (std::mutex) و متغیرهای شرطی (std::condition_variable) برای مدیریت دسترسی به دادههای مشترک و هماهنگی نخها فراهم شدهاند. عملیات اتمی هم هماهنگی دقیق و بدون قفل برای انواع ساده ارائه میدهد.
- میوتکسها و قفلها
- متغیرهای شرطی
- عملیات اتمی
- جلوگیری از رقابت داده
۸. تسلط بر نوعها و امکانات پایه
هر نام و هر عبارت دارای نوعی مرتبط است.
بلوکهای سازنده بنیادین. درک نوعهای داخلی C++ (int، double، char، bool)، نحوه اعلام متغیرها، قواعد حوزه دید و دستورات کنترل جریان پایه (if، switch، for، while) اساس همه برنامههای C++ را تشکیل میدهد. این عناصر از C به ارث رسیده و توسعه یافتهاند.
- نوعهای داخلی
- اعلام و حوزه دید
- دستورات کنترل جریان
- عبارات و عملگرها
ایمنی نوع. C++ زبانی با نوع ایستا است، به این معنی که نوعها در زمان کامپایل بررسی میشوند که به کشف زودهنگام خطاها کمک میکند. ویژگیهایی مانند auto برای استنتاج نوع و constexpr برای ثابتهای زمان کامپایل ایمنی نوع و قابلیت بیان را افزایش میدهند.
- بررسی نوع ایستا
- کشف زودهنگام خطاها
autoبرای استنتاج نوعconstexprبرای ثابتهای زمان کامپایل
اشارهگرها و مراجع. C++ اشارهگرها و مراجع را برای دسترسی غیرمستقیم به حافظه فراهم میکند. این امکانات قدرتمند نیازمند مدیریت دقیق هستند، بهویژه هنگام مدیریت مالکیت منابع. اشارهگرهای هوشمند به جای اشارهگرهای خام برای مدیریت حافظه پشته ترجیح داده میشوند.
- اشارهگرها و مراجع
- دسترسی غیرمستقیم به حافظه
- اشارهگرهای هوشمند برای مالکیت
۹. ترکیب سبکهای برنامهنویسی برای راهحلهای مؤثر
بهترین (قابل نگهداریترین، خواناترین، کوچکترین، سریعترین و غیره) راهحل برای اکثر مسائل غیرساده معمولاً ترکیبی از جنبههای این سبکها است.
ترکیب، نه انحصار. C++ برای پشتیبانی از چندین سبک برنامهنویسی طراحی شده است: رویهای، انتزاع داده، شیءگرا و برنامهنویسی عمومی. ویژگیهای زبان اجازه میدهد این سبکها به صورت ترکیبی استفاده شوند و مؤثرترین راهحلها اغلب ترکیبی از چند پارادایم هستند.
- برنامهنویسی رویهای
- انتزاع داده
- برنامهنویسی شیءگرا
- برنامهنویسی عمومی
دوری از دگماتیزم. تمرکز صرف بر یک سبک یا دیدن C++ به عنوان زبان «ترکیبی» به معنای نادیده گرفتن قدرت ترکیب آن است. زبان ابزارهایی فراهم میکند که میتوانند به شکلی زیبا و ترکیبی برای پشتیبانی از تکنیکهای متنوع به کار روند.
- زبان از ترکیبها پشتیبانی میکند
- دوری از تفکر تکپارادایمی
طراحی عملی. برنامهنویسی مؤثر در C++ شامل انتخاب ابزارهای مناسب (ویژگیهای زبان، اجزای کتابخانه استاندارد) از مجموعه موجود و ترکیب آنها به شکل مناسب برای مسئله است. این نیازمند درک نقاط قوت و ضعف رویکردهای مختلف و نحوه تعامل آنهاست.
- انتخاب ابزارهای مناسب
- ترکیب مؤثر ویژگیها
- تمرکز بر طراحی و تکنیکها
۱۰. مدیریت خطا: استثناها و تضمینها
مفهوم استثنا برای انتقال اطلاعات از نقطهای که خطا تشخیص داده میشود به نقطهای که میتوان آن را مدیریت کرد، ارائه شده است.
تفکیک مسئولیتها. استثناها (throw، catch) مکانیزمی برای جدا کردن کدی که خطا را تشخیص میدهد از کدی که آن را مدیریت میکند فراهم میکنند. این موضوع به ویژه در برنامهها و کتابخانههای بزرگ مفید است که تشخیصدهنده نمیداند چگونه بازیابی کند و مدیریتکننده به آسانی نمیتواند خطا را تشخیص دهد.
throwبرای گزارش خطاهاcatchبرای مدیریت خطاها- جداسازی تشخیص و مدیریت
ایمنی استثنا. کتابخانه استاندارد تضمینهایی درباره وضعیت اشیاء هنگام پرتاب استثنا ارائه میدهد. تضمین پایه حفظ نامعادلات و جلوگیری از نشت منابع است. تضمین قوی اطمینان میدهد که عملیات یا موفق است یا هیچ تأثیری ندارد.
- تضمین پایه (بدون نشت، وضعیت معتبر)
- تضمین قوی (همه یا هیچ)
- مشخصه
noexcept
ادغام با RAII. مدیریت استثنا به طور تنگاتنگی با RAII (کسب منابع همان مقداردهی اولیه است) ادغام شده است. این تضمین میکند که منابع کسبشده توسط اشیاء هنگام بازگشت پشته در زمان انتشار استثنا به درستی آزاد شوند، از نشت جلوگیری کرده و کد پاکسازی را ساده میکند.
- RAII برای پاکسازی
- فراخوانی نابودگرها هنگام بازگشت پشته
خلاصه نقدها
کتاب «زبان برنامهنویسی ++C» بهعنوان مرجع نهایی و جامع این زبان برنامهنویسی شناخته میشود که توسط خالق آن نگارش یافته است. این اثر بهخاطر پوشش کامل مطالب و ارائهی دیدگاههای ارزشمند مورد تحسین قرار گرفته است، اما بسیاری از منتقدان بر این باورند که برای مبتدیان مناسب نیست. کتاب بهعنوان متنی فشرده و گاه پرحجم توصیف شده و بیشتر بهعنوان یک منبع مرجع کاربرد دارد تا یک ابزار آموزشی. برنامهنویسان باتجربه از عمق مطالب و جزئیات فنی آن استقبال میکنند. برخی نقدهایی به سبک نگارش و ساختار کتاب وارد کردهاند، در حالی که عدهای دیگر آن را برای تسلط بر زبان ++C ضروری میدانند. در مجموع، این کتاب بهعنوان منبعی حیاتی برای حرفهایها شناخته میشود، اما برای تازهکاران چالشی جدی به شمار میآید.
دیگران نیز خواندهاند