جزوه تایپ شده برنامه نویسی شبکه
با پایتون سی شارپ شیرافکن دیوید ب. ماکوفسکی مترجم عین الله جعفرنژاد قمی محم علمی کاربردی ضا ماهر پیام نور علی کریم
ً “” “” “” ++ “” “” “” # () (). # ++ “”. ً ++ ::
?:
*
” “. ” ” . : ++
++ ً ( .*) ++ 
++ (). ” &&” ” ” ||
: ()
++ () () ً : (). ++ () ++[69]
: ++ (ً ). () () ++ / : ( /) () ()، ً ً، [72]++، ً ً () است که در هنگام فراخوانی، یک کپی از کلاس مشتق شده ایجاد کرده و برمی گرداند. clone()
یک تابع عضو را نیز می توان با ضمیمه کردن آن با پس از پرانتز بسته و قبل از نقطه ویرگول، “مجازی مجازی” کرد. کلاسی که حاوی یک تابع مجازی خالص باشد، کلاس انتزاعی نامیده می شود . اشیاء را نمی توان از یک کلاس انتزاعی ایجاد کرد. آنها فقط می توانند از آنها مشتق شوند. هر کلاس مشتق شده تابع مجازی را به صورت خالص به ارث می برد و باید یک تعریف غیر خالص از آن (و سایر توابع مجازی خالص دیگر) قبل از ایجاد اشیاء کلاس مشتق شده ارائه دهد. برنامه ای که سعی می کند یک شی از یک کلاس را با یک تابع عضو مجازی خالص یا تابع عضو مجازی خالص به ارث برده ایجاد کند، شکل بدی ندارد. = 0
عبارات لامبدا
C++ از توابع ناشناس پشتیبانی می کند که به عبارات لامبدا نیز معروف جزوه برنامه نویسی شبکه، با شکل زیر: [73]
[ capture ]( پارامترها ) -> return_type { function_body }
از C++20، میتوانید پارامترهای الگو را روی لامبدا بدون کلمه کلیدی بنویسید : template
[ ضبط ] < template_parameters > ( پارامترها ) -> return_type { function_body }
اگر لامبدا هیچ پارامتری دریافت نکند و هیچ نوع بازگشتی یا سایر مشخصکنندهها استفاده نشود، () را میتوان حذف کرد، یعنی:
[ عکسبرداری ] { 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 :: vector < int > vec { 3 , 4 , 3 , 1 };
int i { vec . در ( 4 )}; // یک استثنا پرتاب می کند، std::out_of_range (شاخص سازی برای vec از 0-3 است نه 1-4)
}
// یک کنترل کننده استثنا، std::out_of_range را می گیرد که توسط vec.at(4) پرتاب می شود.
catch ( std :: out_of_range & e ) {
std :: cerr << “دسترسی به عنصری که وجود ندارد: ” << e . what () << ‘n’ ;
}
// برای گرفتن سایر استثناهای کتابخانه استاندارد (آنها از std::exception مشتق می شوند)
catch ( std :: استثنا و e ) {
std :: cerr << “Exception انداخته شد: ” << e . what () << ‘n’ ;
}
// همه استثناهای ناشناخته را بگیرید (یعنی مواردی که از std::exception مشتق نمی شوند)
گرفتن (…) {
std :: cerr << “خطای مرگبار n ” ;
}
}
همچنین می توان استثناها را به صورت هدفمند با استفاده از کلمه کلیدی مطرح کرد. این استثنائات به روش معمول رسیدگی می شود. در برخی موارد، به دلایل فنی نمی توان از استثناها استفاده کرد. یکی از این نمونه ها یک جزء حیاتی از یک سیستم تعبیه شده است، که در آن هر عملیات باید تضمین شود که در مدت زمان مشخصی تکمیل شود. این را نمی توان با استثنا تعیین کرد زیرا هیچ ابزاری برای تعیین حداکثر زمان لازم برای رسیدگی به یک استثنا وجود ندارد. [82]throw
برخلاف مدیریت سیگنال ، که در آن تابع هندلینگ از نقطه شکست فراخوانی میشود، مدیریت استثنا قبل از وارد شدن بلوک catch از محدوده فعلی خارج میشود، که ممکن است در تابع فعلی یا هر یک از فراخوانیهای تابع قبلی در حال حاضر در پشته قرار داشته باشد.

دانلود رایگان خلاصه کتاب برنامه نویسی شبکه
انواع برشمرده شده
این بخش گزیده ای از نوع Enumerated § C++ است. [ ویرایش ]
C++ دارای انواع enumeration است که مستقیماً از C به ارث برده شدهاند و عمدتاً مانند اینها کار میکنند، با این تفاوت که enumeration یک نوع واقعی در C++ است که بررسی زمان کامپایل را اضافه میکند. همچنین (مانند ساختارها)، enumکلمه کلیدی C++ به طور خودکار با یک typedef ترکیب می شود ، به طوری که به جای نامگذاری نوع enum name، به سادگی آن را نامگذاری کنید name. این را می توان در C با استفاده از typedef شبیه سازی کرد:typedef enum {Value1, Value2} name;
C++11 همچنین نوع دومی از شمارش را ارائه میکند که به آن جزوه برنامه نویسی شبکه محدودهای میگویند . اینها از نظر نوع ایمن هستند: شمارشگرها به طور ضمنی به یک نوع عدد صحیح تبدیل نمی شوند. در میان چیزهای دیگر، این اجازه /(ً ::)، (++) () :
{ };
ً “” :
: { }; // ” : ; // ً «» ”” ++++ : ++
++ : ++ ++ [ شفاف سازی ] ; ( )، ()، /( )، ()، ()، ++ ++، (++) ++() ()، () ( ) () #++ ++ کرد، سرانجام زبانی را پیدا کرد که در آن امکان ایجاد الگوریتمهای عمومی (مثلاً مرتبسازی 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]
سازگاری
برای دادن آزادی بیشتر به فروشندگان کامپایلر، کمیته استانداردهای C++ تصمیم گرفت اجرای نامها ، مدیریت استثناها و سایر ویژگیهای خاص پیادهسازی را دیکته نکند. نقطه ضعف این تصمیم این است که انتظار می رود کد شی تولید شده توسط کامپایلرهای مختلف ناسازگار باشد. با این حال، تلاشهایی برای استانداردسازی کامپایلرها برای ماشینها یا سیستمهای عامل خاص (به عنوان مثال C++ ABI) وجود داشت، [88] اگرچه به نظر میرسد که اکنون تا حد زیادی رها شدهاند.
با سی
اطلاعات بیشتر: سازگاری C و C++
C++ اغلب به عنوان ابرمجموعه C در نظر گرفته می شود، اما این کاملاً درست نیست. [89] اکثر کدهای C می توانند به راحتی در C++ به درستی کامپایل شوند، اما چند تفاوت وجود دارد که باعث می شود برخی از کدهای C معتبر نامعتبر باشند یا در C++ متفاوت رفتار کنند. به عنوان مثال، C اجازه می دهد تا تبدیل ضمنی از انواع اشاره گر دیگر را انجام دهد، اما C++ اجازه نمی دهد (به دلایل ایمنی نوع). همچنین، C++ بسیاری از کلیدواژههای جدید مانند و را تعریف میکند که ممکن است به عنوان شناسه (مثلاً نام متغیرها) در برنامه C استفاده شوند. void*newclass
برخی از ناسازگاری ها با تجدید نظر در سال 1999 استاندارد C ( C99 ) حذف شده اند، که اکنون از ویژگی های C++ مانند نظرات خط ( //) و اعلان های مخلوط با کد پشتیبانی می کند. از سوی دیگر، C99 تعدادی ویژگی جدید را معرفی کرد که C++ از آنها پشتیبانی نمی کرد و در C++ ناسازگار یا اضافی بودند، مانند آرایه های با طول متغیر ، انواع اعداد مختلط بومی (با این حال، کلاس موجود در کتابخانه استاندارد C++ عملکرد مشابهی را ارائه می کند. ، اگرچه با کد سازگار نیست)، مقداردهی اولیه، لفظ ترکیبی و کلمه کلیدی جزوه برنامه نویسی شی گرا شده است. [90] برخی از ویژگی های معرفی شده توسط ++، ++::(). [91] [92] [93] ++++، ++ /() “” {/*…*/}
: ++
++ [94] [95] [96] [97] [98] [99] [100]
++ ++ :
++ ً ++: «++ » (++ )، “++” “”: [99] [100]
++ ++ “”.
فهرست مطالب