جزوه تایپ شده برنامه نویسی شبکه
با پایتون سی شارپ شیرافکن دیوید ب. ماکوفسکی مترجم عین الله جعفرنژاد قمی محم علمی کاربردی ضا ماهر پیام نور علی کریم
ً “” “” “” ++ “” “” “” # () (). # ++ “”. ً ++ ::
?:
*
” “. ” ” . : ++
++ ً ( .*) ++ 
++ (). ” &&” ” ” ||
: ()
++ () () ً : (). ++ () ++[69]
: ++ (ً ). () () ++ / : ( /) () ()، ً static_castdynamic_cast
توابع عضو مجازی
معمولاً، وقتی تابعی در یک کلاس مشتق شده ، تابعی در کلاس پایه را لغو می کند ، تابعی که باید فراخوانی شود با نوع شی تعیین می شود. یک تابع معین زمانی لغو می شود که تفاوتی در تعداد یا نوع پارامترها بین دو یا چند تعریف از آن تابع وجود نداشته باشد. از این رو، در زمان کامپایل، تنها با توجه به یک اشاره گر کلاس پایه، ممکن است امکان تعیین نوع شی و بنابراین تابع صحیح برای فراخوانی وجود نداشته باشد. بنابراین تصمیم به زمان اجرا موکول می شود. به این امر اعزام پویا می گویند . توابع یا روش های عضو مجازی [72]اجازه می دهد تا خاص ترین پیاده سازی تابع، با توجه به نوع زمان اجرا واقعی شی، فراخوانی شود. در پیاده سازی های C++، این معمولاً با استفاده از جداول توابع مجازی انجام می شود . اگر نوع شی مشخص باشد، ممکن است با اضافه کردن یک نام کلاس کاملاً واجد شرایط قبل از فراخوانی تابع، از این موضوع دور زده شود، اما به طور کلی فراخوانیهای توابع مجازی در زمان اجرا حل میشوند.
علاوه بر عملکردهای عضو استاندارد، اضافه بارهای اپراتور و تخریب کننده ها می توانند مجازی باشند. یک قانون غیر دقیق مبتنی بر تجربه عملی بیان می کند که اگر هر عملکردی در کلاس مجازی است، تخریب کننده نیز باید باشد. از آنجایی که نوع یک شی در زمان ایجاد آن در زمان کامپایل مشخص است، سازندهها و سازندههای کپی پسوند نمیتوانند مجازی باشند. با این وجود، زمانی که یک اشاره گر به یک شی مشتق شده به عنوان یک اشاره گر به یک شی پایه ارسال می شود، ممکن است شرایطی ایجاد شود که یک کپی از یک شی باید ایجاد () ()
“” () = ++ : [73]
[ capture ]( ) -> { }
++: [ ضبط ] < > ( ) -> { }
لامبدا هیچ پارامتری دریافت نکند و هیچ نوع بازگشتی یا سایر مشخصکنندهها استفاده نشود، () را میتوان حذف کرد، یعنی:
[ عکسبرداری ] { function_body }
نوع برگشتی یک عبارت لامبدا را می توان به طور خودکار استنباط کرد، در صورت امکان، به عنوان مثال:
[]( int x , int y ) { return x + y ; } // استنتاج شد []( int x , int y ) -> int { return x + y ; } // صریح
لیست از تعریف بسته شدن پشتیبانی می کند . چنین عبارات لامبدا در استاندارد به عنوان قند نحوی برای یک شی تابع بی نام تعریف شده است . [capture]
رسیدگی به استثناء
مدیریت استثنا برای ارتباط وجود یک مشکل یا خطا در زمان اجرا از جایی که شناسایی شده تا جایی که مشکل قابل رسیدگی است استفاده می شود. [74] این اجازه می دهد تا این کار به صورت یکنواخت و جدا از کد اصلی انجام شود، در حالی که همه خطاها را شناسایی می کند. [75] اگر خطایی رخ دهد، یک استثنا پرتاب میشود (بالا میرود)، که سپس توسط نزدیکترین کنترلکننده استثنای مناسب دستگیر میشود. استثنا باعث می شود که محدوده فعلی خارج شود، و همچنین هر محدوده بیرونی (تکثیر) تا زمانی که یک کنترل کننده مناسب پیدا شود، به نوبه خود تخریب کنندگان هر شیء را در این محدوده های خارج شده فرا می خواند. [76] در همان زمان، یک استثنا به عنوان یک شی ارائه می شود که داده های مربوط به مشکل شناسایی شده را حمل می کند. [77]
برخی از راهنماهای سبک C++، مانند گوگل، [78] LLVM، [79] و Qt [80] استفاده از استثناها را ممنوع میکنند.
کد ایجاد استثنا در داخل یک بلوک قرار می گیرد. جزوه برنامه نویسی شبکه در بلوک های جداگانه (هندلرها) مدیریت می شوند. هر بلوک می تواند چندین کنترل کننده استثنا داشته باشد، همانطور که در مثال زیر قابل مشاهده است. [81]trycatchtry
#include <iostream>
#include <بردار>
#include <stdexcept>
int main () {
امتحان کن {
std :: < > { };
{ ( )}; // ::(–)
}
// ::() ( :: & ) {
:: << “: ” << () << ” ;
}
// (::)
( :: ) {
:: << “: ” << () << ” ;
}
// (::)
(…) {
:: << “” ;
}
}
[82]
§ ++ [ ویرایش ]
++ ً ً ++ ()، ++ :{} ;
++: /(ً ::)، (++) () :
{ };
ً “” :
: { }; // ” : ; // ً «» ”” ++آن به کتابخانه استاندارد C++ اختصاص یافت.
مقاله اصلی: کتابخانه استاندارد C++
استاندارد C++ از دو بخش تشکیل شده است: زبان اصلی و کتابخانه استاندارد. برنامه نویسان C++ در هر پیاده سازی اصلی C++ انتظار دومی را دارند [ شفاف سازی ] ; شامل انواع انبوه ( بردارها ، لیستها، نقشهها، مجموعهها، صفها، پشتهها، آرایهها، تاپلها)، الگوریتمها (یافتن، برای_هرک ، جزوه برنامه نویسی شبکه ، تصادفی_تصادفی ، و غیره)، امکانات ورودی/خروجی ( iostream ، برای خواندن و نوشتن به کنسول و فایل ها)، کتابخانه سیستم فایل، پشتیبانی محلی سازی، اشاره گرهای هوشمند برای مدیریت خودکار حافظه، پشتیبانی از بیان منظم ، چند رشته ایکتابخانه، پشتیبانی اتمی (اجازه دادن به یک متغیر برای خواندن یا نوشتن حداکثر توسط یک رشته در یک زمان بدون هیچ گونه هماهنگی خارجی)، ابزارهای زمانی (اندازه گیری، دریافت زمان جاری و غیره)، سیستمی برای تبدیل گزارش خطا که انجام نمی دهد. از استثناهای C++ در استثناهای C++، یک مولد اعداد تصادفی و یک نسخه کمی تغییر یافته از کتابخانه استاندارد C (برای مطابقت با سیستم نوع C++) استفاده کنید.
بخش بزرگی از کتابخانه ++C بر اساس کتابخانه قالب استاندارد (STL) است. ابزارهای مفید ارائه شده توسط STL شامل کانتینرهایی مانند مجموعه اشیاء (مانند بردارها و لیست ها )، تکرار کننده هایی است که دسترسی آرایه مانند به کانتینرها را فراهم می کند و الگوریتم هایی که عملیات هایی مانند جستجو و مرتب سازی را انجام می دهند.
علاوه بر این، (چند) نقشهها ( آرایههای انجمنی ) و (چند) مجموعهها ارائه شدهاند که همگی رابطهای سازگار صادر میکنند. بنابراین، با استفاده از الگوها می توان الگوریتم های عمومی را نوشت که با هر ظرف یا هر دنباله ای که توسط تکرار کننده ها تعریف شده است کار می کند. همانطور که در C، ویژگی های کتابخانه با استفاده از #include دستورالعمل برای گنجاندن یک هدر استاندارد قابل دسترسی است. کتابخانه استاندارد C++ 105 سرصفحه استاندارد را ارائه می دهد که 27 مورد از آنها منسوخ شده است.
این استاندارد شامل STL است که در ابتدا توسط الکساندر استپانوف طراحی شده بود که سال ها با الگوریتم ها و کانتینرهای عمومی آزمایش کرد. زمانی که او با C++ شروع کرد، سرانجام زبانی را پیدا کرد که در آن امکان ایجاد الگوریتمهای عمومی (مثلاً مرتبسازی STL) وجود داشت که حتی بهتر از مثلاً Qsort کتابخانه استاندارد C عمل میکرد، به لطف ویژگیهای C++ مانند استفاده از inlining و کامپایل- زمان اتصال به جای نشانگرهای تابع. استاندارد به آن به عنوان “STL” اشاره نمی کند، زیرا صرفاً بخشی از کتابخانه استاندارد است، اما این اصطلاح هنوز به طور گسترده برای متمایز کردن آن از بقیه کتابخانه استاندارد (جریان های ورودی/خروجی، بین المللی سازی، تشخیص، زیر مجموعه کتابخانه C و غیره). [83]
اکثر کامپایلرهای C++ و همه کامپایلرهای اصلی، پیاده سازی مطابق با استانداردهای کتابخانه استاندارد C++ را ارائه می دهند.
رهنمودهای اصلی C++
دستورالعملهای هسته C++ [84] ابتکاری است که توسط Bjarne Stroustrup، مخترع C++، و Herb Sutter، گردآورنده و رئیس گروه کاری C++ ISO، رهبری میشود تا به برنامهنویسان کمک کند تا با استفاده از بهترین شیوهها برای زبان، «C++ مدرن» بنویسند. استانداردهای C++11 و جدیدتر، و برای کمک به توسعه دهندگان کامپایلرها و ابزارهای بررسی استاتیک برای ایجاد قوانینی برای کشف شیوه های برنامه نویسی بد.
هدف اصلی نوشتن کارآمد و پیوسته از نوع و منبع امن C++ است.
دستورالعمل های اصلی [85] در جزوه برنامه نویسی شبکه افتتاحیه در CPPCon 2015 اعلام شد.
رهنمودها با کتابخانه پشتیبانی راهنما (GSL)، [86] یک کتابخانه فقط سرصفحه ای از انواع و توابع برای پیاده سازی دستورالعمل های اصلی و ابزارهای جستجوگر ایستا برای اجرای قوانین دستورالعمل همراه است. [87]
سازگاری
برای دادن آزادی بیشتر به فروشندگان ++ (++ ) [88] : ++
++ ً [89] ++ ++ ++ (). ++ (ً ) *( ) ++ ( //) ++ ++ (++ )، [90] C99 در نسخه بعدی استاندارد C++، C++11 گنجانده شد.std::complexrestrict(از آنهایی که زائد نبودند). [91] [92] [93] با این حال، استاندارد C++11 ناسازگاریهای جدیدی را معرفی میکند، مانند عدم تخصیص یک رشته تحت اللفظی به یک اشارهگر کاراکتر، که C معتبر باقی میماند.
برای ترکیب کد C و C++، هر اعلان یا تعریف تابعی که قرار است از C و C++ فراخوانی شود/استفاده شود، باید با پیوند C با قرار دادن آن در یک بلوک اعلام شود. چنین عملکردی ممکن است به ویژگیهای بسته به انحراف نام (یعنی بارگذاری بیش از حد تابع) وابسته نباشد. extern “C” {/*…*/}
انتقاد
مقاله اصلی: نقد C++
علیرغم پذیرش گسترده آن، برخی از برنامه نویسان برجسته زبان C++ را مورد انتقاد قرار داده اند، از جمله لینوس توروالدز ، [94] ریچارد استالمن ، [95] جاشوا بلوخ ، کن تامپسون [96] [97] [98] و دونالد کنوت . [99] [100]
یکی از مواردی که اغلب مورد انتقاد C++ قرار می گیرد پیچیدگی درک شده آن به عنوان یک زبان است، با این انتقاد که تعداد زیادی از ویژگی های غیر متعامد در عمل مستلزم محدود کردن کد به زیرمجموعه ای از C++ است، بنابراین از مزایای خوانایی سبک و اصطلاحات رایج اجتناب می شود. . همانطور که توسط جاشوا بلوخ بیان شده است :
من فکر میکنم C++ بسیار فراتر از آستانه پیچیدگیاش بود، و با این حال افراد زیادی هستند که آن را برنامهنویسی میکنند. اما کاری که شما انجام می دهید این است که مردم را مجبور می کنید آن را زیر مجموعه قرار دهند. بنابراین تقریباً هر فروشگاهی که من از ++C استفاده میکند، میگوید: «بله، ما از C++ استفاده میکنیم، اما از ارث بری چند پیادهسازی استفاده نمیکنیم و از بارگذاری بیشازحد اپراتور استفاده نمیکنیم.» فقط یک سری ویژگی وجود دارد که شما از آنها استفاده نمی کنید (++ )، “++” “”: [99] [100]
++ ++ “”.
فهرست مطالب