برنامه Hello World
برنامه زیر با استفاده از کتابخانه استاندارد و جریان های خروجی یک متن را به خروجی استاندارد ارسال می نماید.
# کد PHP:
کد:
کد:
include <iostream.h> // provides std::cout
using namespace std;
int main()
{
cout << "Hello, world!\n"; // prints "Hello, world!"
}
ویژگی های زبان
عملگرها
پیش پردازنده
++C بطور عمومی در سه فاز ترجمه می گردد: پیش پردازنده، ترجمه به کد object، پیوند (که دو مرحله آخر به عنوان عمل کامپایل شناخته می شود.) در اولین مرحله در پیش پردازنده، شبه دستورات پیش پردازنده تغییرات لغوی بر روی کد منبع ایجاد می نمایند و آن را به به مراحل دیگر تحویل می دهند.
شبه دستورات پیش پردازنده با استفاده از کاراکتر # قبل از هر گونه فضای خالی آغاز گشته و رشته هایی را در کد منبع با فایل یا رشته های دیگر با توجه به قوانین تعریف گشته توسط برنامه نویس جایگزین می نماید. این دستورات معمولاً اعمال زیر را انجام می دهند: جایگزینی ماکروها، شمول فایل های دیگر (برخلاف ویژگی سطح بالاتر مانند شمول ماجول ها/پکیج ها/یونیت ها/کامپوننت ها)، کامپایل شرطی و/یا شمول شرطی. به عنوان مثال:
کد PHP:
که این دستور تمام سمبل ها در فایل سرایند کتابخانه استاندارد iostream را در فایل منبع وارد می سازد.
کاربرد معمول دیگر به عنوان ماکرو خوانده می شود:
کد PHP:
کد:
کد:
#define MY_ASSERT(x) assert(x)
که کد (MY_ASSERT(x را با (assert(x در فایل منبع جایگزین می نماید. که این جایگزینی امکان کنترل استفاده از این تابع را در اختیار برنامه نویس قرار می دهد.
استفاده از ماکروها در عمل چندان توصیه نمی گردد چرا که امکان کنترل نوع آرگومان ها را از بین برده در نتیجه ممکن است اشتباهاتی را وارد کد منبع نماید. طریقه دیگر برای انجام این کار استفاده از توابع درون خطی است.
علاوه بر شبه دستورات معمول تعدادی شبه دستور برای کنترل جریان کامپایل وجود دارد که امکان شمول یا عدم شمول قطعه ای کد یا سایر ویژگی های کامپایل را در اختیار ما قرار می دهد.
دستورات پیش پردازنده برای کاربردهای عددی نیز به کار می رود که هم اکنون استفاده از const به جای #define ترجیح داده می شود. این کار علاوه بر ایجاد کنترل نوع قوی مانع از گمراهی در فضاهای نام می گردد.
هدف کمیته استانداردسازی از بین بردن پیش پردازنده است اما با توجه به خصوصیت مدولار ++C بعید به نظر می آید که این حذف امکان پذیر باشد.
قالب ها
قالب ها متفاوت با ماکروها هستند. در حالی که هر دوی این ویژگی های زمان کام پایل برای ایجاد کامپایل شرطی استفاده می شوند قالب ها محدود هب تغییرات لغوی و متنی نیستند. قالب ها با آگاهی از معنا و سیستم نوع در زبان استفاده شده و سایر ویژگی های زمان کامپایل می توانند از عملیات سطح بالا برای کنترل ترتیب اجرا براساس نوع پارامترها استفاده نمایند. ماکروها کنترل خود را بر کامپایل از طریق ویژگی های از پیش تعیین شهد انجام می دهند ولی قادر به ایجاد انواع جدید و کنترل نوع نیستند و فقط محدود به تغییرات متنی پیش از کامپایل هستند. به زبان دیگر ماکروها کنترل خود را با استفاده از نشانه های از پیش تعیین شده انجام می دهند اما همانند قالب ها نمی توانند نشانه ها را خود ایجاد نمایند. قالب ها ابزاری برای چندریختی ایستا و برنامه نویسی جنریک است. مثلاً جایگزین معادل با استفاده از قالب ها برای عبارت خطرناک #define max(x,y) ((x)>(y)?(x)
y)) در پایین نشان داده شده است.
کد PHP:
کد:
کد:
template <typename T>
const T& max(const T& x, const T& y)
{
return x > y ? x : y;
}
این قالب در سرآیند algorithm تحت عنوان std::max() قابل دسترسی است. معمولاً می توان از کلمه کلیدی class بجای typename استفاده کرد.
علاوه بر این قالب ها یک ویژگی تورینگ-کامل هستند که به این معناست که هر برنامه قابل محاسبه توسط کامپیوتر را می توان با استفاده از فرابرنامه نویسی قالب ها نوشت.
بطور خلاصه استفاده از قالب ها به معنای نوشتن هر تابع یا کلاس باشتفاده از تمامی انواع ممکن است که در قالب آن را پیش از کامپایل معین نمی کنیم.
اشیا
سی++ چندین ویژگی شی گرا را زبان سی معرفی نمود معرفی کلاس چهار ویژگی که در زبان های شی گرا و بعضا غیر شی گرا حضور دارد یعنی انتزاع، بسته بندی، وراثت، و چندریختی را فراهم کرد. اشیا نمونه های ساخته شده از کلاس در زمان اجرا هستند. می توان کلاس را نمونه ای از قالب ها دانست که چندین مورد از آنها بوجود می آید.
بسته بندی
بسته بندی به معنای جمع آوری عملیات و داده در یک محل می باشد. سی++ بسته بندی را با ایجاد امکان تعریف هر کلاس به صورت public، private، protected پیاده سازی نموده است. اعضای private فقط توسط اعضای کلاس و یا کلاس ها دقیقا بیان شده (friend) قابل دسترسی هستند. اعضای protected توسط کلاس های ارث برده شده و اعضای کلاس و کلاس های friend قابل دسترسی هستند.
در تعاریف شی گرا باید تنها توابعی بسته بندی گردند که باید از نحوه پیاده سازی این نوع بخصوص اطلاع داشته باشد. سی++ این ویژگی را با استفاده از توابع عضو و توابع دوست فراهم نموده اما قطعی نکرده است. در سی++ این امکان وجود دارد که تمام نوع را عمومی تعریف نمایند اما در صورتی که نیاز باشد فقط بخشی از آن عمومی گردد در نتیجه این زبان نه تنها شی گرا است از مدل های ضعیف تر همانند برنامه نویسی مدولار پشتیبانی می نماید.
عموماً توصیه بر این است که تمام اعضا به صورت خصوصی یا حفاظت شده تبدیل گردند و فقط توابعی که باید توسط دیگر کلاس ها به عنوان واسط استفاده شوند عمومی باقی بمانند.
وراثت
وراثت این امکان را ایجاد می کند که یک نوع ویژگی دیگر انواع را داشته باشد. وراثت از یک کلاس پایه می تواند عمومی، خصوصی یا حفاظت شده باشد. این تعیین سطح دستزسی مشخص می سازد آیا کلاس های نامربوط و یا مشتق شده می توانند به اعضای عمومی یا حفاظت شده کلاس پایه دسترسی داشته باشند. تنها وراثت عمومی به معنای وراثت به کار رفته بصورت عموم است. دو نوع دیگر وراثت به ندرت مورد استفاده قرار می گیرند. اگر تعیین کننده سطح دسترسی حذف شود سطح دسترسی برای کلاس خصوصی و برای ساختمان به صورت عمومی تعریف می گردد. کلاس های پایه ممکن است بصورت مجازی تعریف شوند که به آن وراثت مجازی گویند. وراثت مجازی تضمین می کند که فقط یک نمونه از کلاس پایه وجود داشته باشد و مشکلاتی همانند مشکلات وراثت چندگانه بوجد نیاید.
وراثت چندگانه یکی از ویژگی های مورد بحث در سی++ است. وراثت چندگانه امکان اشتقاق از چند کلاس پایه را فراهم می نماید که موجب بوجود آمدن گراف رابطه وراثت بسیار پیچیده است. به عنوان مثال «گربه پرنده» می تواند از کلاس «گربه» و کلاس «پستانداران پرنده» ارث برد. در زبان های دیگر مانند سی شارپ و جاوا به صورت دیگری ویژگی مشابه را پیاده سازی می نماید هر کلاس می تواند از چندین واسط اشتقاق یابد اما فقط یک کلاس پایه برای اشتقاق وجود دارد(واسط ها برخلاف کلاس پایه فقط تعریف هستند و هیچ گونه پیاده سازی را شامل نمی گردند).
چندریختی
امکان استفاده از یک واسط برای چندین پیاده سازی فراهم می نماید و اشیا در شرایط مختلف رفتار مختلفی از خود نشان می دهند.
سی++ دو نوع چندریختی در اختیار برنامه نویس قرار می دهد: چندریختی زمان کامپایل و چندریختی زمان اجرا. چندریختی زمان کامپایل امکان تصمیم گیری های زمان اجرا را فراهم نمی سازد و چندریختی زمان اجرا اغلب موجب پایین آمدن بازدهی می گردد.
چندریختی ایستا
چندریختی ایستا شامل گرانبارسازی تابع، گرانبارسازی عملگر، آرگومان پیش فرض، و قالب کلاس ها و تابع است.
گرانبارسازی تابع
گرانبارسازی تابع امکان تعریف چندین تابع با نام یکسان اما با تعداد آرگومان های متفاوت را فراهم می سازد. این توابع از طریق تعداد پارامترها یا نوع رسمی آنها شناسایی می گردند. در نتیجه یک تابع ممکن است با توجه به موقعیت استفاده معنای مختلفی داشته باشد. نوع داده برگشتی برای تشخیص توابع از یکدیگر مورد استفاده قرار نمی گیرد.
گرانبارسازی عملگر
بطور مشابه گرانبارسازی عملگر امکان استفاده از یک عملگر مشخص می شود که عملکرد متفاوتی با توجه به عملوندهای خود دارد. این عملگرهای گرانبار شده موجب فراخوانی تابع مشخصی متناسب با آن موقعیت می گردند. گرانبارسازی عملگر ترتیب اجرا یا تعداد عملوندهای یک عملگر را تغییر نمی دهد. عملگرهای . :: . ? نمی توانند گرانبار شوند.
آرگومان پیش فرض
آرگومان پیش فرض در شرایطی به کار می رود که تعیین یک مقدار مشخص برای یک آرگومان نیاز به تعریف یک تابع جدید را برطرف می سازد. هنگام استفاده از این مشخصه باید دقت شود که تابع های گرانبار شده و تابع های دارای آرگومان پیش فرض با یکدیگر تداخل نداشته باشند به عنوان مثال:
کد PHP:
کد:
کد:
// function with default argument but also an overloaded function
int strcpy(char str1, char str2, short unsigned n=65535);
// second overloaded function
int strcpy(char str1, char str2);
کد بالا در صورت استفاده از یک آرگومان n برای strcpy درست کامپایل می گردد اما اگر آرگومانی تعیین نگردد درست عمل نخواهد کرد. چرا که کامپایلر نخواهد دانست که باید از مقدار پیش فرض استفاده نماید یا از تابع بدون آرگومان.
چندریختی
چندریختی پویا شامل وراثت و توابع مجازی عضو است.
ساختار برنامه ها
ساختار برنامه ها در این زبان بدین صورت است که همانند زبان سی، هر برنامه بایستی یک تابع اصلی (main) به عنوان بدنه برنامه داشته باشد. هر برنامه معمولاً از تعداد زیادی فایل تشکیل می شود که به هم الحاق می گردند (با دستور include) و به این فایل های الحاقی سرآیند (Header) می گوییم. فایل های الحاقی حاوی کدها یا نسخه های اجرایی کلاس ها (مجموعه متغیرها و توابع) می باشند که در بدنه اصلی برنامه از آنها استفاده می شود. معمولاً هر کلاس (که تعریف یک نوع داده ای با متدهای مربوط به آن است) را در یک سرآیند می نویسند. هر سرآیند که معمولاً تنها تعاریف (معرفی) کلاس را در خود دارد به همراه فایل های پیاده سازی به زبان ++C یا پیاده سازی های کامپایل شده (به صورت فایل اشیا مانند dll یا so یا ... ) می تواند به کار برده شود. به مجموعه های یکپارچه ای از کلاس های پیاده سازی شده (به صورت فایل های سرآیند با پیاده سازی های کد یا اشیای زبان ماشین) که برای برنامه نویسی به کار می روند، یک کتابخانه ++C گفته می شود و قدرت اصلی این زبان در امکان به کارگیری کتابخانه های آماده می باشد. کتابخانه های بزرگ ++C مانند STL، MFC، QT و ... مجموعه قدرتمندی برای تولید برنامه در این زبان ایجاد کرده اند.
محیط های برنامه نویسی
یک برنامه به زبان ++C می تواند در محیط های ++Turbo C++ ,Borland C++ ,Dev C در ویندوز و GCC در لینوکس نوشته شود. این محیط های برنامه نویسی، همراه با یک کمپایلر عرضه می شوند که کار تبدیل برنامه به فایل اجرایی را راحت می کند.