-
فرشید پوشنده
1405/05/27
-
27 مرداد 1405
بازگشت به: آموزش برنامه نویسی c++ سی پلاس پلاس
۱.۳ — آشنایی با اشیاء و متغیرها
دادهها و مقادیر (Data and Values)
در درس ۱.۱ — دستورات و ساختار برنامه، یاد گرفتید که اکثر دستورالعملهای یک برنامه، دستورات (Statements) هستند و توابع گروههایی از دستورات هستند که بهصورت ترتیبی اجرا میشوند. دستورات داخل تابع، اقداماتی را انجام میدهند که (امیدواریم) هر نتیجهای را که برنامه برای تولید آن طراحی شده است، تولید کنند.
اما برنامهها چگونه نتایج را تولید میکنند؟ آنها این کار را با دستکاری (Manipulating) دادهها (خواندن، تغییر و نوشتن) انجام میدهند. در محاسبات، داده (Data) هر اطلاعاتی است که میتواند توسط کامپیوتر جابهجا، پردازش یا ذخیره شود.
اگر می خوای حرفه ای برنامه نویسی یاد بگیری!
آموزش برنامه نویسی c++
«++C یکی از قدرتمندترین زبانهای برنامهنویسی دنیاست که هم سرعت و کارایی زبان C را دارد و هم امکانات پیشرفتهی شیگرایی را در اختیار میگذارد. با ++C میتوان از ساخت سیستمعاملها و نرمافزارهای سیستمی گرفته تا طراحی بازیهای سهبعدی و پروژههای پیچیدهی صنعتی را انجام داد. یادگیری این زبان مثل داشتن کلید ورود به دنیای عمیقتر کامپیوتر است؛ جایی که میتوانی کنترل کامل روی حافظه، پردازش و ساختار برنامه داشته باشی و ایدههایت را با نهایت قدرت و سرعت به واقعیت تبدیل کنی.»
نکته کلیدی
برنامهها مجموعههایی از دستورالعملها هستند که دادهها را برای تولید یک نتیجه مطلوب دستکاری میکنند.
برنامههای کامپیوتری (هم به صورت کد منبع و هم به صورت کامپایلشده) از نظر فنی نیز داده هستند، زیرا میتوانند جابهجا، پردازش و ذخیره شوند. با این حال، در زمینه یک برنامه کامپیوتری، ما معمولاً از اصطلاح «کد» (Code) برای خود برنامه و «داده» (Data) برای اطلاعاتی که برنامه با آنها کار میکند تا نتیجهای تولید کند، استفاده میکنیم.
یک برنامه میتواند دادههای مورد نیاز برای کار را به روشهای مختلفی به دست آورد: از یک فایل یا پایگاه داده، از طریق شبکه، از کاربری که ورودی را از صفحهکلید ارائه میدهد، یا از برنامهنویسی که دادهها را مستقیماً در کد منبع خود برنامه قرار میدهد. در برنامه “Hello World” از درس ذکر شده، متن “Hello world!” مستقیماً در کد منبع برنامه درج شده است و دادههایی را برای استفاده برنامه فراهم کرده است. سپس برنامه این داده را با ارسال آن به مانیتور برای نمایش، دستکاری میکند.
در برنامهنویسی، یک تکقطعه داده، مقدار (Value) نامیده میشود (که گاهی مقدار داده (Data Value) نیز نامیده میشود). نمونههای رایج مقادیر عبارتند از:
اعداد (به عنوان مثال
5یا6.7-).کاراکترها، که بین تکنقل قول (Single Quotes) قرار میگیرند (به عنوان مثال
'H'یا'$'). فقط یک نماد ممکن است استفاده شود.متن، که باید بین دو نقل قول (Double Quotes) قرار گیرد (به عنوان مثال
"Hello"یا"H"). متن میتواند شامل ۰ یا چند کاراکتر باشد.
نکته کلیدی
مقادیری که در تکنقل قول (Single Quotes) قرار میگیرند، توسط کامپایلر به عنوان مقادیر کاراکتری تفسیر میشوند.
مقادیری که در دو نقل قول (Double Quotes) قرار میگیرند، توسط کامپایلر به عنوان مقادیر متنی تفسیر میشوند.
مقادیر عددی نقل قول نمیشوند.
مقادیری که مستقیماً در کد منبع قرار میگیرند، لیترالها (Literals) نامیده میشوند. ما لیترالها را با جزئیات در درس ۵.۲ — لیترالها پوشش میدهیم.
یکی از رایجترین کارهایی که با مقادیر انجام میشود، چاپ آنها روی صفحه است. برای مثال:
1 #include <iostream> // for std::cout
2
3 int main()
4 {
5 std::cout << 5; // print the literal number `5`
6 std::cout << -6.7; // print the literal number `-6.7`
7 std::cout << 'H'; // print the literal character `H`
8 std::cout << "Hello"; // print the literal text `Hello`
9
10 return 0;
11 }
ترجمه:
اگر یک مقدار کاراکتری یا مقدار متنی به درستی نقل قول نشود، کامپایلر سعی میکند آن مقدار را طوری تفسیر کند که گویی کد C++ است. این تقریباً همیشه منجر به یک خطای کامپایل میشود.
لیترالها سادهترین راه برای تأمین مقادیر برای برنامه شما هستند، اما دارای کاستیهایی نیز میباشند. لیترالها مقادیر فقط خواندنی (Read-Only) هستند، بنابراین مقادیر آنها قابل تغییر نیستند. بنابراین، اگر بخواهیم دادهها را در حافظه ذخیره کنیم، به روش دیگری برای این کار نیاز داریم.
حافظه دسترسی تصادفی (RAM)
حافظه اصلی در یک کامپیوتر حافظه دسترسی تصادفی (Random Access Memory) نامیده میشود (که اغلب به اختصار RAM نامیده میشود). وقتی یک برنامه را اجرا میکنیم، سیستمعامل برنامه را در RAM بارگذاری میکند. هر دادهای که در خود برنامه کدگذاری شده است (مانند متن “Hello, world!”) در این مرحله بارگذاری میشود.
سیستمعامل همچنین مقداری RAM اضافی را برای استفاده برنامه در حین اجرا رزرو میکند. کاربردهای رایج این حافظه عبارتند از: ذخیره مقادیر وارد شده توسط کاربر، ذخیره دادههای خوانده شده از یک فایل یا شبکه، یا ذخیره مقادیر محاسبه شده در حین اجرای برنامه (مانند مجموع دو مقدار) تا بتوان بعداً دوباره از آنها استفاده کرد.
میتوانید RAM را به عنوان یک سری جعبههای شمارهدار در نظر بگیرید که میتوان از آنها برای ذخیره دادهها در حین اجرای برنامه استفاده کرد.
در برخی از زبانهای برنامهنویسی قدیمیتر (مانند Applesoft BASIC)، میتوانستید مستقیماً به این جعبهها دسترسی داشته باشید (به عنوان مثال، میتوانستید یک دستور بنویسید برای “برو و مقدار ذخیره شده در جعبه حافظه شماره ۷۵۳۲ را بیاور”).
اشیاء و متغیرها
در C++، دسترسی مستقیم به حافظه توصیه نمیشود. در عوض، ما از طریق یک شیء (Object) به حافظه دسترسی غیرمستقیم داریم. یک شیء نشاندهنده یک ناحیه از حافظه (معمولاً RAM یا یک ثبات CPU) است که میتواند یک مقدار را در خود نگه دارد. اشیاء همچنین دارای ویژگیهای مرتبطی هستند (که در درسهای آینده پوشش خواهیم داد).
نحوه عملکرد کامپایلر و سیستمعامل برای اختصاص حافظه به اشیاء فراتر از scope این درس است. اما نکته کلیدی در اینجا این است که به جای گفتن “برو و مقدار ذخیره شده در جعبه پستی شماره ۷۵۳۲ را بیاور”، میتوانیم بگوییم “برو و مقدار ذخیره شده توسط این شیء را بیاور” و به کامپایلر اجازه دهیم بفهمد که مقدار را از کجا و چگونه بازیابی کند. این بدان معناست که ما میتوانیم بر استفاده از اشیاء برای ذخیره و بازیابی مقادیر تمرکز کنیم و نیازی به نگرانی در مورد اینکه آن اشیاء در واقع در کجای حافظه قرار میگیرند، نداشته باشیم.
اگرچه اشیاء در C++ میتوانند بدون نام (ناشناس) باشند، اما بیشتر اوقات ما اشیاء خود را با استفاده از یک شناسه (Identifier) نامگذاری میکنیم. یک شیء با نام، متغیر (Variable) نامیده میشود.
نکته کلیدی
یک شیء (Object) برای ذخیره یک مقدار در حافظه استفاده میشود. یک متغیر (Variable)، شیءای است که دارای یک نام (شناسه) است.
نامگذاری اشیاء ما به ما امکان میدهد بعداً در برنامه دوباره به آن اشیاء ارجاع دهیم.
نامگذاری (Nomenclature)
در برنامهنویسی عمومی، اصطلاح شیء (Object) معمولاً به یک شیء بدون نام در حافظه، یک متغیر، یا یک تابع اشاره دارد. در C++، اصطلاح شیء تعریف محدودتری دارد که توابع را حذف میکند. وقتی از اصطلاح شیء در این مجموعه آموزشی استفاده میکنیم، این تعریف محدودتر C++ مد نظر ما است.
تعریف متغیر (Variable Definition)
برای اینکه بتوانیم از یک متغیر در برنامه خود استفاده کنیم، باید به کامپایلر بگوییم که یکی میخواهیم. رایجترین روش برای انجام این کار، استفاده از نوع خاصی از دستور اعلان (Declaration Statement) به نام تعریف (Definition) است (تفاوت بین اعلان و تعریف را بعداً در درس ۲.۷ — اعلانهای پیشین و تعاریف روشن خواهیم کرد).
نکته کلیدی
از یک دستور تعریف (Definition Statement) میتوان برای گفتن به کامپایلر استفاده کرد که میخواهیم از یک متغیر در برنامه خود استفاده کنیم.
در اینجا مثالی از تعریف یک متغیر به نام x آورده شده است:
در زمان کامپایل (زمانی که برنامه در حال کامپایل شدن است)، هنگام مواجهه با این دستور، کامپایلر برای خود یادداشت میکند که ما یک متغیر با نام x میخواهیم، و آن متغیر دارای نوع داده int است (بیشتر در مورد انواع داده در یک لحظه). از آن نقطه به بعد (با برخی محدودیتها که در یک درس آینده در مورد آنها صحبت خواهیم کرد)، هر زمان که از شناسه x در کد خود استفاده کنیم، کامپایلر میداند که ما به این متغیر اشاره میکنیم.
کامپایلر تمام جزئیات دیگر مربوط به این متغیر را برای ما مدیریت میکند، از جمله تعیین اینکه شیء به چه مقدار حافظه نیاز دارد، در چه نوع ذخیرهسازی قرار میگیرد (به عنوان مثال، در RAM یا یک ثبات CPU)، در کجا نسبت به اشیاء دیگر قرار میگیرد، چه زمانی ایجاد و از بین میرود، و غیره.
به متغیری که از طریق یک دستور تعریف ایجاد میشود، گفته میشود که در نقطهای که دستور تعریف قرار دارد، تعریف شده است. در حال حاضر، متغیرهای شما باید درون توابع (مانند درون main()) تعریف شوند.
در اینجا یک برنامه کامل شامل یک دستور تعریف متغیر آورده شده است:
1 int main()
2 {
3 int x; // definition of variable x
4
5 return 0;
6 }
ایجاد متغیر (Variable Creation)
در زمان اجرا (زمانی که برنامه در حافظه بارگذاری شده و اجرا میشود)، به هر شیء یک مکان ذخیرهسازی واقعی (مانند RAM یا یک ثبات CPU) داده میشود که میتواند از آن برای ذخیره مقادیر استفاده کند. فرآیند رزرو کردن حافظه برای استفاده یک شیء، تخصیص (Allocation) نامیده میشود. پس از انجام تخصیص، شیء ایجاد شده و میتوان از آن استفاده کرد.
برای مثال، فرض کنید که متغیر x در مکان حافظه ۱۴۰ نمونهسازی (Instantiated) شده است. هر زمان که برنامه از متغیر x استفاده کند، به مقدار موجود در مکان حافظه ۱۴۰ دسترسی پیدا خواهد کرد.
نکته کلیدی
یک شیء زمانی «ایجاد میشود» که حافظه واقعی برای استفاده شیء رزرو شده باشد.
هنگامی که برنامه فوق اجرا میشود، اجرا از بالای تابع main() شروع میشود. حافظه برای x تخصیص داده میشود. سپس برنامه پایان مییابد.
انواع داده (Data Types)
تا اینجا، پوشش دادهایم که اشیاء، نواحی از حافظه هستند که میتوانند یک مقدار داده را ذخیره کنند (نحوه دقیق ذخیره دادهها موضوعی برای یک درس آینده است). یک نوع داده (Data Type) (که بیشتر به سادگی نوع (Type) نامیده میشود) تعیین میکند که شیء چه نوع مقداری (مثلاً یک عدد، یک حرف، متن و غیره) را ذخیره خواهد کرد.
در مثال بالا، متغیر x ما نوع int داده شده است، که به این معنی است که متغیر x یک مقدار صحیح (Integer) را ذخیره خواهد کرد. یک عدد صحیح، عددی است که میتوان بدون جزء کسری نوشت، مانند 4، 27، 0، 2- یا 12-. به طور خلاصه، میتوانیم بگوییم که x یک متغیر صحیح (Integer Variable) است.
در C++، نوع یک شیء باید در زمان کامپایل مشخص باشد، و آن نوع بدون کامپایل مجدد برنامه قابل تغییر نیست. این بدان معناست که یک متغیر صحیح فقط میتواند مقادیر صحیح را در خود نگه دارد. اگر میخواهید نوع دیگری از مقدار را ذخیره کنید، باید از نوع متفاوتی استفاده کنید.
نکته کلیدی
نوع داده یک شیء باید در زمان کامپایل مشخص باشد (تا کامپایلر بداند که آن شیء به چه مقدار حافظه نیاز دارد).
اعداد صحیح فقط یکی از انواع زیادی هستند که C++ بهطور پیشفرض از آنها پشتیبانی میکند. برای اهداف توضیحی، در اینجا مثال دیگری از تعریف یک متغیر با استفاده از نوع داده double آورده شده است:
1 double width; // define a variable named width, of type double
C++ همچنین به شما امکان میدهد تا انواع سفارشی (Custom Types) خود را ایجاد کنید. این کاری است که در درسهای آینده زیاد انجام خواهیم داد و بخشی از چیزی است که C++ را قدرتمند میکند.
برای این فصلهای مقدماتی، به متغیرهای صحیح (Integer) پایبند خواهیم بود زیرا از نظر مفهومی ساده هستند، اما به زودی بسیاری از انواع دیگری را که C++ ارائه میدهد (از جمله double) بررسی خواهیم کرد.
تعریف چندین متغیر
امکان تعریف چندین متغیر از یک نوع در یک دستور واحد با جدا کردن نامها با کاما وجود دارد. قطعه کد زیر:
1 int a;
2 int b;
عملاً معادل این است:
1 int a, b;
هنگام تعریف چندین متغیر به این روش، سه اشتباه رایج وجود دارد که برنامهنویسان جدید تمایل به انجام آنها دارند (هیچکدام جدی نیستند، زیرا کامپایلر آنها را میگیرد و از شما میخواهد که آنها را برطرف کنید):
اشتباه اول: دادن یک نوع به هر متغیر هنگام تعریف متغیرها به صورت دنبالهای.
1 int a, int b; // wrong (compiler error)
2
3 int a, b; // correct
اشتباه دوم: تلاش برای تعریف متغیرهایی از انواع مختلف در یک دستور، که مجاز نیست. متغیرهایی از انواع مختلف باید در دستورات جداگانه تعریف شوند.
1 int a, double b; // wrong (compiler error)
2
3 int a; double b; // correct (but not recommended)
4
5 // correct and recommended (easier to read)
6 int a;
7 double b;
درباره موضوع سوم در درس بعدی، زمانی که مقداردهی اولیه متغیرها را پوشش میدهیم، بحث خواهیم کرد.
بهترین روش
اگرچه زبان به شما اجازه میدهد این کار را انجام دهید، از تعریف چندین متغیر از یک نوع در یک دستور واحد خودداری کنید. در عوض، هر متغیر را در یک دستور جداگانه در خط خودش تعریف کنید (و سپس از یک حاشیهنویسی تکخطی برای مستندسازی اینکه برای چه کاری استفاده میشود، استفاده کنید).
خلاصه
در C++، از اشیاء برای دسترسی به حافظه استفاده میکنیم. یک شیء نامدار، متغیر (Variable) نامیده میشود. هر متغیر دارای یک شناسه (Identifier)، یک نوع (Type) و یک مقدار (Value) است (و برخی ویژگیهای دیگر که در اینجا مرتبط نیستند). از نوع یک متغیر برای تعیین نحوه تفسیر مقدار در حافظه استفاده میشود.
متغیرها در واقع در زمان اجرا (Runtime) ایجاد میشوند، زمانی که حافظه برای استفاده آنها تخصیص داده میشود.
در درس بعدی، نحوه دادن مقادیر به متغیرهای خود و نحوه استفاده واقعی از آنها را بررسی خواهیم کرد.