توابع دوست کلاس در برنامه نویسی C++ (Class Friend functions) :

قبلا یادآوری شد که اعضای یک کلاس اعم از داده ها یا توابع دارای ۳ نوع سطح دسترسی می باشند که شامل دسترسی خصوصی private و دسترسی عمومی public و دسترسی حفاظت شده protected است .

اگر داده ها و توابع عضو یک کلاس از نوع private تعریف شوند فقط داده ها و توابع درونی آن کلاس در داخل همان کلاس می توانند به آنها دسترسی داشته باشند و هیچ جزء دیگری در بیرون از کلاس حتی شی ساخته شده از همان کلاس هم اجازه و توانایی دسترسی و کار با آنها را ندارند مگر تابعی را تعریف نماییم که در اصطلاح دوست(Friend) کلاس مورد بحث باشد .

پس تابع دوست یک کلاس، تابع ویژه ای است که می تواند به تمامی اعضای کلاس حتی اعضای private نیز دسترسی داشته باشد. تفاوتی نمی کند که تابع دوست کلاس را عمومی یا خصوصی تعریف نماییم. یک تابع دوست کلاس طبق الگوی زیر تعریف می شود که باید از کلمه کلیدی friend در ابتدای آن استفاده نمود :

friend type FunctionName(Parameters List...)
{
    Function Body...
}

ادامه مطلب

همانطور که میدانید، کلاسها و اشیا، مبانی برنامه نویسی شیءگرا هستند که باید به خوبی درک شوند. کلاس نوع جدیدی است که برنامه نویس آن را برای حل مسئله های دنیای واقعی تعریف میکند، حاوی داده ها و تعریف عملیات هاست. داده های عضو کلاس را فیلد یا صفت گویند، در حالیکه عملیات های کلاس را تابع یا متد می نامند. متدها بر روی صفات اجرا میشوند. شیء نمونه ای از کلاس است که در تکنیک برنامه نویسی شیءگرا یک نهاد زمان اجرا میباشد. داده های کلاس را عضو داده ای و متدهای کلاس را تابع عضو می نامیم.

هر یک از اعضای کلاس، چه اعضای داده ای و چه توابع عضو، میتوانند بصورت static تعریف شوند.

اعضای داده ای استاتیک کلاسها در سی پلاس پلاس :

هر شیءای از کلاس یک کپی از تمام اعضای داده ای آن کلاس را داراست. در بعضی از موارد فقط یک کپی  از یک متغیر باید بین تمام اشیای یک کلاس مشترک باشد. کلمه کلیدی استاتیک برای این منظور و اهداف دیگر به کار میرود. وقتی کلمه کلیدی static را با اعضای داده ای کلاس به کار میبرید، به کامپایلر می گویید که فقط یک کپی از آن متغیر وجود خواهد داشت و تمام اشیای آن کلاس ، آن متغیر را به اشتراک می گذارند.برخلاف اعضای داده ای معمولی، فقط یک کپی از اعضای داده ای استاتیک وجود دارد. پس تمام اشیای آن کلاس از یک متغیر استفاده می کنند. حوزه متغیرهای استاتیک در یک کلاس است.

وقتی یک عضو داده ای static را در داخل کلاسی اعلان میکنید، حافظه به آن اختصاص نمی یابد. در عوض باید در خارج از کلاس، آن را بصورت عمومی تعریف کنید. این کار با تعریف مجدد متغیر static و با استفاده از عملگر تعیین کننده حوزه (::) برای شناسایی کلاسی که آن متغیر به آن کلاس تعلق دارد، انجام میشود. به این ترتیب حافظه به متغیر اختصاص می یابد. ادامه مطلب

در ++C کلمه کلیدی this همراه با کلاس ها وجود دارد. هر شیء از طریق اشاره گری به نام this به آدرس خود دسترسی دارد. از این اشاره گر می توان برای بررسی اینکه آیا آرگومان ارسال شده به تابع عضو یک شیء، خود شیء می باشد یا خیر ، استفاده کرد.

مثال :

    #include <iostream>  
    using namespace std;  
    class Employee {  
       public:  
           int id; //data member (also instance variable)      
           string name; //data member(also instance variable)  
           float salary;  
           Employee(int id, string name, float salary)    
            {    
                 this->id = id;    
                this->name = name;    
                this->salary = salary;   
            }    
           void display()    
            {    
                cout<<id<<"  "<<name<<"  "<<salary<<endl;    
            }    
    };  
    int main(void) {  
        Employee e1 =Employee(101, "Sonoo", 890000); //creating an object of Employee   
        Employee e2=Employee(102, "Nakul", 59000); //creating an object of Employee  
        e1.display();    
        e2.display();    
        return 0;  
    }  

خروجی :
۱۰۱  Sonoo  890000
۱۰۲  Nakul  59000

ادامه مطلب

 کلاس ها (Classes) و اشیا (Objects) در برنامه نویسی C++ :

اکنون وقت آن است که برنامه نویسی شی گرا را در عمل یاد گرفته و با اصول تعریف و بکارگیری آن بیشتر آشنا بشویم .

  • کلاس ها (Classes) :

کلاس ها همان نوع داده تجریدی یا انتزاعی (Abstract) هستند. به عبارتی یک نوع داده هستند که توسط برنامه نویس برای کار با داده ها و توابع و رویدادهای مختلفی تعریف می شوند. برای تعریف کلاس از الگوی زیر پیروی می کنیم :

class className
{
    // Define private variables & functions
    public:
        // Define public variables & functions
    private:
        // Define private variables & functions
    protected:
        // Define protected variables & functions
} objectsame;   // Declare Objects

ادامه مطلب

تعریف اشاره گر در زبان برنامه نویسی c++ :
به زبان ساده، اشاره‌گر نوعی متغیر است که محتوای آن آدرس یکی از خانه‌های حافظه‌ی کامپیوتر است.
برای کار با اشاره گرها در c++ وقتی عملیات خواندن و نوشتن صادر می شود باید مشخص باشد که این عملیات روی کدامیک از بایت های حافظه صورت گیرد و برای این منظور برای هر یک از خانه های حافظه یک ادرس در نظر گرفته شده است که یک عدد صحیح مثبت است. دسترسی به خانه های حافظه از طریق آدرسش صورت میگیرد.در حافظه ی اصلی به قطعات مساوی با طول تقسیم شده است که به هریک از آن ها یک گوییم.
در داخل هر بایت ها از صفر تا شماره گذاری شده اند.برای دسترسی به یک بایت در داخل یک کافی است در داخل یک تفاوت مکان آن نسبت به ابتدای را بدانیم.که به آن گوییم. آدرس خانه های حافظه به صورت زیر ساخته میشوند.
off set : segment آدرس شروع
اشاره گر : متغیر دوبایتی است که آدرس حافظه را در خود نگه میدارد. ادامه مطلب

در زبان برنامه نویسی C++ به منظور ارسال آرایه به یک تابع سه روش وجود دارد که در ادامه بررسی می کنیم. هر سه روش نتایج مشابهی دارند. ارسال آرایه های چند بعدی هم مشابه ارسال آرایه تک بعدی است.

روش اول (پارامتر تابع به عنوان یک اشاره گر) :

void myFunction(int *param) {
   .
   .
   .
}

روش دوم (پارامتر تابع به عنوان یک آرایه با سایز مشخص شده) :

void myFunction(int param[10]) {
   .
   .
   .
}

روش سوم (پارامتر تابع به عنوان یک آرایه با سایز مشخص نشده) :

void myFunction(int param[]) {
   .
   .
   .
}

مثال

حال تابع زیر را در نظر بگیرید. این تابع یک آراگومان به عنوان آرایه و یک آرگومان دیگر به عنوان سایز آرایه می گیرد و میانگین اعداد موجود در آرایه را برمیگرداند.

double getAverage(int arr[], int size) {
  int i, sum = 0;       
  double avg;          
   for (i = 0; i < size; ++i) {
      sum += arr[i];
   }
   avg = double(sum) / size;
   return avg;
}

مثال زیر نحوه استفاده از این تابع را نشان می دهد :

#include <iostream>
using namespace std;
// function declaration:
double getAverage(int arr[], int size);
int main () {
   // an int array with 5 elements.
   int balance[5] = {1000, 2, 3, 17, 50};
   double avg;
   // pass pointer to the array as an argument.
   avg = getAverage( balance, 5 ) ;
   // output the returned value 
   cout << "Average value is: " << avg << endl; 
   return 0;
}
double getAverage(int arr[], int size) {
  int i, sum = 0;       
  double avg;          
   for (i = 0; i < size; ++i) {
      sum += arr[i];
   }
   avg = double(sum) / size;
   return avg;
}

خروجی :
Average value is: 214.400000

 

آرایه ها

زمانی که بخواهیم تعدادی متغیر را به صورت دسته بندی شده ذخیره کنیم از آرایه استفاده میکنیم.
گاهی نیز تعداد داده های یک برنامه آنقدر زیاد است که نمیتوانیم برای هر کدام از آنها یک متغیر جداگانه تعریف کنیم بنابراین از یک آرایه با تعداد عناصر زیاد استفاده میکنیم.

آرایه های یک بعدی:

آرایـه دارایی تعدادی عنصر پشت سر هم است که برای دستیابی به هر کدام از این عناصر از اندیس استفاده میکنیم. اندیس آرایـه در C++ از صفر شروع میشود. برای استفاده از آرایـه ها ابتدا باید آرایـه مورد نظر را در حافظه تعریف کنیم. در مثال زیر آرایه ای با ۶ عنصر تعریف کرده ایم:

int Array[6];

همانطور که مشخص است، این آرایـه که نام آن را Array گذاشته ایم از نوع int است یعنی میتواند ۶ عنصر از نوع int را در خود ذخیره کند.

اما برای دسترسی به عناصر این آرایـه باید از اندیس آن عنصر مورد نظر استفاده کنیم.

عنصر اول : Array[0]                                 عنصر دوم : Array[1]                     عنصر سوم : Array[2]

عنصر چهارم : Array[3]                              عنصر پنجم: Array[4]                    عنصر ششم : Array [5]

مقداردهی به آرایه:

برای مقدار دادن به یک آرایـه میتوانیم به صورت یکجا به تمامی عناصر آن مقدار دهی کنیم یا به صورت تک تک :

int Array[6] = {1, 5, -3, 10, 22, 4}

یا

Array[0] = 1;
Array[1] = 5;
Array[2] = -3;

مثال: برنامه ای بنویسید که ۶ عدد را از کاربر دریافت نماید و حاصل جمع آنها را در خروجی نمایش دهد :

#include <iostream.h>
int main()
{
    int num[6];
    int sum = 0;

    for(int i = 0 ; i < 6 ; i++)
    {
        cout << "Enter number " i+1 " :";
        cin >> num[i];
        sum += num[i];
    }
    cout << "\n Sum of numbers is " << sum;
    return 0;
}


خروجی :

Enter number 1 : 1
Enter number 2 : 7
Enter number 3 : 9
Enter number 4 : 0
Enter number 5 : 18
Enter number 6 : 1
Sum of numbers is 36

در مثال بالا آرایـه ای بنام num با طول ۶ تعریف شده که از یک حلقه تکرار for برای مقدار دادن به عناصر آن استفاده می کنیم و در درون حلقه، مقدار هر عنصر از آرایه را با متغیر sum که دارای مقدار اولیه صفر است جمع می کنیم. دقت کنید که حلقه for باید حتما از صفر شروع شود چون اندیس اولین عنصر آرایه صفر است. در نهایت و با خروج از حلقه حاصلجمع عناصر آرایه که در متغیر sum ریخته شده است را چاپ می کنیم .

آرایه چند بعدی:

در آرایـه های تک بعدی، فقط یک سطر داشتیم و تعدادی ستون، اما در آرایـه های چند بعدی تعدادی سطر و تعدادی ستون داریم، درست همانند یک ماتریس.

تعریف کردن یک آرایه با ۳ سطر و ۲ ستون :

Char x[3][2];



زمانی که آرایـه ای از نوع Char تعریف میشود، هر عنصر میتواند یک کاراکتر (حرف) را در خود ذخیره کند. بنابراین اگر بخواهیم برای مثال یک نام را در برنامه خود ذخیره کنیم میتوانیم تک تک حروف آن را در یک آرایـه ذخیره کنیم بنابراین آن آرایـه یک نام را در خود ذخیره کرده است.

مقداردهی به آرایه چند بعدی :

char x[3][4] = {{‘t’, ‘b’, ‘p’, ‘z’},     // Row 1
                       {‘m’, ‘c’, ‘c’, ‘q’},   // Row 2
                       {‘a’, ‘z’, ‘d’, ‘g’}};  // Row 3
یا
x[0][0] = t;
x[1][3] = q;
x[2][1] = z;
x[2][0] = a;
x[2][3] = g;
  • توجه داشته باشید که برای مقدار دهی آرایه های یک بعدی، از یک حلقه استفاده میکردیم، اما در آرایـه دو بعدی برای دسترسی مقادیر توسط حلقه، از دو حلقه تو در تو استفاده میکنیم. حلقه بیرونی برای سطرها و حلقه داخلی برای ستون ها.

مثال: برنامه ای بنویسید که یک آرایـه ۴×۴ تعریف کند و آن را با اعدادی که از کاربر میگیرد پر کند سپس جمع عناصر قطر اصلی را محاسبه و در خروجی نمایش دهد.

int main()
{
    // تعریف آرایـه
    int A[4][4];

    // دریافت اعداد از کاربر
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++)
            cin >> A[i][j];

    //جمع عناصر قطر اصلی
    int sum = 0;
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++)
            if (i == j) // شرط قطر اصلی بودن عنصر
                sum += A[i][j];

    //نمایش مجموع در خروجی
    cout << sum;

    return 0;
}


 

 

توابع بازگشتی توابعی هستند که در درون تعریف خود تابع هم فراخوانی میشوند. هدف از اینکار صرفه جویی در کد نویسی و ایجاد خلاقیت است. به این نکته توجه داشته باشید که حتما شرطی برای تابع بازگشتی باید وجود داشته باشد تا برنامه به درستی اجرا شود و نتایج خواسته شده از تابع بدست آید و اگر این مورد رعایت نشود تابع بینهایت بار فراخوانی شده و هیچ وقت برنامه به پایان نمی رسد .

کدی به زبان C++ با استفاده از تابع بازگشتی بنویسید که حاصل ضرب دو عدد را با استفاده از حاصل جمع آنها بدست آورد .

برای حل این مثال لازم است بدانید که :

a*b=a          ----->     اگر b=1
a*b=a*(b-1)+a  ----->     اگر b>1

ادامه مطلب

تابع عبارت است از مجموعه ای از دستورات که با هم یک عملیات معین را اجرا می کنند. تمامی برنامه های ++C حداقل یک تابع اصلی در خود دارند که به آن ()main گفته شده و نقطه ی شروع اجرا برنامه می باشد.

شما می توانید کد خود را به چندین تابع تقسیم کنید. اینکه چگونه کد (انجام وظایف مختلف) خود را بین توابع مختلف تقسیم می کنید کاملا به خود شما بستگی دارد. با این حال به صورت منطقی تقسیم گونه ای انجام می شود که هر تابع یک عملیات یا وظیفه ی خاص را انجام می دهد.

خط اعلان تابع/function declaration در واقع اسم تابع، نوع بازگشتی (خروجی) و پارامترهای آن را به کامپایلر اعلان می کند. تعریف تابع/ function definition بدنه ی حقیقی تابع و آن عملیاتی که انجام می دهد را تعیین می کند.

کتابخانه ی استاندارد ++C تعدادی تابع درون ساخته و از پیش تعریف شده فراهم می کند که برنامه ی شما می تواند آن ها را بر اساس نیاز خود فراخوانی نماید. به طور مثال، تابع ()strcat دو رشته را به هم متصل می کند، در حالی که تابع ()memcpy آدرس حافظه را به آدرس دیگری کپی می نماید.

زبان های برنامه نویسی مختلف به توابع با واژه های مختلف اشاره می کنند. برای مثال ممکن است آن را یک متد، subroutine یا procedure نام گذاری کنند.

ادامه مطلب

Comment ها دستوراتی هستند که جهت درج توضیحات درباره ی کارایی کد برنامه مورد استفاده قرار می گیرند. کامپایلر در ترجمه ی کد برنامه به زبان ماشین، این خطوط را کاملا نادیده گرفته و آن ها را ترجمه نمی کند. در واقع توسعه دهنده با استفاده از comment در متن برنامه، توضیحاتی درباره ی کاربرد کد خود ارائه می دهد تا بدین وسیله زمانی که شخص دیگری source code برنامه را می خواند، بتواند از بخش های مختلف آن سردر بیاورد.
comment در تمامی زبان های برنامه نویسی کاربرد داشته و دارای اشکال متفاوت است.
در زبان ++C دو نوع comment به تفکیک زیر وجود دارد:

  1. comment های تک خطی که با کاراکتر // آغاز شده و تنها یک خط به طول می انجامند.
  2. comment های چند خطی که بین دو کاراکتر */ و /* محصور می شوند و چندین خط را دربرمی گیرند.

همان طور که در بالا ذکر شد، هر کاراکتری که بین کاراکترهای فوق قرار می گیرد، توسط کامپایلر نادیده گرفته می شود. نمونه ای از کامنت چند خطی :

/* This is a comment */
/* ++C comments can  also
 * span multiple lines
 */

ادامه مطلب

این عبارت برای پرش در برنامه می باشد ، هنگامی که برنامه به این عبارت می رسد به لیبل مشخص شده پرش می کند و کدها را از آنجا اجرا می کند.

مثال :

#include <iostream>  
using namespace std;  
int main()  
{  
ineligible:    
         cout<<"You are not eligible to vote!\n";    
      cout<<"Enter your age:\n";    
      int age;  
      cin>>age;  
      if (age < 18){    
              goto ineligible;    
      }    
      else    
      {    
              cout<<"You are eligible to vote!";     
      }         
}

ادامه مطلب

دستور do while در زبان C++ دستور یا دستوراتی را تا زمانی که شرط تعیین شده برقرار شود، تکرار می کند. ابتدا یک بار دستورات مشخص شده اجرا می شوند، سپس شرط حلقه بررسی می شود.

نحوه نوشتن حلقه do while

در زیر Syntax یک دستور do while را مشاهده می کنید :

do {
   statement(s);
} while( condition );

بعد از این که دستورات داخل حلقه یک بار اجرا شدند، شرط حلقه بررسی می شود، اگر درست باشد، اجرای حلقه ادامه می یابد و در غیر این صورت  اولین دستور بعد از حلقه اجرا می شود. ادامه مطلب

حلقه while در زبان C++ دستور یا دستوراتی را تا زمانی که شرط تعیین شده برقرار باشد، تکرار می کند. شرط تعیین شده قبل از اجرا شدن دستورات بررسی می شود.

نحوه نوشتن حلقه while

در زیر Syntax یک حلقه while را مشاهده می کنید :

while(condition) {
   statement(s);
}

ادامه مطلب

حلقه for در زبان C++ دنباله ای از دستورات را تا زمانی که شرط تعیین شده برقرار شود، تکرار می کند. از حلقه for معمولا زمانی استفاده می شود که میزان تکرار مشخص باشد.

نحوه نوشتن حلقه for

در زیر syntax یک حلقه for را مشاهده می کنید :

for ( init; condition; increment ) {
   statement(s);
}

ادامه مطلب