سازنده ها

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

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

#include <iostream.h>
 
class CRectangle {
    int width, height;
  public:
    CRectangle (int,int);
    int area (void) {return (width*height);}
};
 
CRectangle::CRectangle (int a, int b) {
  width = a;
  height = b;
}
 
int main () {
  CRectangle rect (3,4);
  CRectangle rectb (5,6);
  cout << "rect area: " << rect.area() << endl;
  cout << "rectb area: " << rectb.area() << endl;
}

خروجی برنامه فوق به صورت زير می باشد:

rect area: 12
rectb area: 30

   سازنده ها را برای اينکه مقدار دهی اوليه به اعضای داده ای کلاس به صورتهای مختلف امکان پذیر باشد، می توان گرانبار کرد. به نحوه گرانبار کردن تابع سازنده، در برنامه زير توجه نماييد:

#include <iostream.h>
 
class CRectangle {
    int width, height;
  public:
    CRectangle ();
    CRectangle (int,int);
    int area (void) {return (width*height);}
};
 
CRectangle::CRectangle () {
  width = 5;
  height = 5;
}
 
CRectangle::CRectangle (int a, int b) {
  width = a;
  height = b;
}
 
int main () {
  CRectangle rect (3,4);
  CRectangle rectb;
  cout << "rect area: " << rect.area() << endl;
  cout << "rectb area: " << rectb.area() << endl;
}

خروجی برنامه فوق به صورت زير می باشد:

rect area: 12
rectb area: 25

   سازنده ها می توانند دارای آرگومان های پیش فرض نيز باشند. در برنامه زير در پيش تعريف تابع سازنده time و برای هر یک از آرگومانها مقدار پیش فرض صفر در نظر گرفته شده است. با مشخص کردن مقدار پيش فرض برای آرگومانهای تابع سازنده، حتی اگر هنگام فراخوانی تابع سازنده مقداری نيز برای آن تعيين نگردد، مقادير پيش فرض به کار گرفته می شود. اين کار تضمين می نمايد که  اعضاء کلاس همواره  مقادير درستی را در خود نگهداری می کنند.

#include <iostream.h>
 
class Time {
  public:
    Time( int = 0, int = 0, int = 0);
    void setTime( int, int, int );
    void printUniversal();
    void printStandard();
 
  private:
    int hour; // 0 - 23 (24-hour clock format)
    int minute; // 0 - 59
    int second; // 0 - 59
}
 
Time::Time( int hr, int min, int sec ) 
{ 
  setTime( hr, min, sec );
}
 
void Time::setTime( int h, int m, int s )
{
  hour = ( h >= 0 && h < 24 ) ? h : 0;
  minute = ( m >= 0 && m < 60 ) ? m : 0;
  second = ( s >= 0 && s < 60 ) ? s : 0;
}
 
void Time::printUniversal()
{
  cout << (hour<10 ? "0":"") << hour << ":"
       << (minute<10 ? "0":"") << minute << ":"
       << (second<10 ? "0":"") << second;
}
 
 
void Time::printStandard()
{
  cout << ( ( hour == 0 || hour == 12 ) ?
              12 : hour % 12 ) << ":"
       << (minute<10 ? "0":"") << minute << ":"
       << (second<10 ? "0":"") << second
       << (hour < 12 ? " AM" : " PM" );
}
 
 
void main()
{
  Time t1;               // all arguments defaulted
  Time t2( 2 );          // minute and second defaulted
  Time t3( 21, 34 );     // second defaulted 
  Time t4( 12, 25, 42 ); // all values specified
  Time t5( 27, 74, 99 ); // all bad values specified
 
  cout << "Constructed with:\n\n"
       << "all default arguments:\n ";
  t1.printUniversal(); // 00:00:00
  cout << "\n ";
  t1.printStandard(); // 12:00:00 AM
 
  cout << "\n\nhour specified;";
       << " default minute and second:\n ";
  t2.printUniversal(); // 02:00:00
  cout << "\n ";
  t2.printStandard(); // 2:00:00 AM
 
  cout << "\n\nhour and minute specified;";
       << " default second:\n ";
  t3.printUniversal(); // 21:34:00
  cout << "\n ";
  t3.printStandard(); // 9:34:00 PM
 
  cout << "\n\nhour, minute, and second specified:\n ";
  t4.printUniversal(); // 12:25:42
  cout << "\n ";
  t4.printStandard(); // 12:25:42 PM
 
  cout << "\n\nall invalid values specified:\n ";
  t5.printUniversal(); // 00:00:00
  cout << "\n ";
  t5.printStandard(); // 12:00:00 AM
  cout << endl;
 
}
 

خروجی برنامه فوق به صورت زير می باشد:

Constructed with:
 
all default arguments:
  00:00:00
  12:00:00 AM
 
hour specified; default minute and second:
  02:00:00
  2:00:00 AM
 
hour and minute specified; default second:
  21:34:00
  9:34:00 PM
 
hour, minute, and second specified:
  12:25:42
  12:25:42 PM
 
all invalid values specified:
  00:00:00
  12:00:00 AM

   در برنامه فوق پنج شیء از کلاس Time ايجاد شده اند که t1 هنگام فراخوانی سازنده از هر آرگومان پیش فرض استفاده کرده است، t2 یک آرگومان، t3 دو آرگومان، t4 سه آرگومان را برای سازنده خود مشخص کرده اند و t5 آرگومانهایی با مقادير غير مجاز را مشخص کرده است. ضمنا برای بررسی مجاز بودن آرگومان های دريافت شده توسط تابع سازنده، اين تابع ، setTime را با آرگومانهايی که دريافت کرده است فراخوانی می کند تا اطمينان حاصل شود که hour و minute و second با مقادير درستی مقدار دهی می شوند.

 

 

 

   معرفی کامپيوتروبرنامه نويسی

   ساختارهای کنترلی

   توابع

   آرايه ها

   اشاره گر ها و رشته ها

   کلاسها

   گرانبار کردن عملگر ها

 
 
 
   
 
 
 

حق کپی رایت محفوظ می باشد