منتخب بازارچه

كلاس در سي ++

A.S.Roma

کاربر تازه وارد
تاریخ عضویت
9 می 2006
نوشته‌ها
24
لایک‌ها
0
با سلام
ممنون دوست عزيز
ممكنه يك مثال كوچك بزنيد.؟!
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام.
من خيلي وقته كه مي خواهم وراثت را شروع كنم ولي نتونستم. چند روزه درگير ويژوال سي هستم.
در اونجا هم به اين نتيجه رسيدم بايد وراثت بحث بشه. در اونجا هم
this
خيلي استفاده ميشه.
----------------
حالا كه دوستان هم مشغول اين بحث هستند ، با هم به شكل بحث مي رويم جلو.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
از ديتل فصل وراثت:
وراثت inheritance :
وراثت فرمي از ((دوباره استفاده كردن)) است.
در اين حالت ، برنامه نويس ((كلاس)) ئي ايجاد مي كند كه data ها و رفتارهاي يك ((كلاس)) موجود را جذب مي كند(دارا مي شود) و همچنين قابلتهاي جديد ديگري را هم به آن مي افزايد.
اين كار باعث صرفه جويي در وقت مي شود.
همچنين فوائد ديگري دارد .زيرا باعث استفاده مجدد از برنامه هاي خطايابي شده مي شود.

پس به جاي اين كه كل كلاس را از اول بنويسيم(شامل data members و member functions ) ، از كلاسي ، كلاس خود را مشتق مي كنيم.

كلاسي كه موجود است و ما از آن كلاس خود را مشتق مي كنيم را base class مي گوييم.
و كلاس جديدي كه مي سازيم را derived class مي گوييم.
در زبان جاوا به اولي سوپركلاس و به دومي ساب كلاس مي گويند.

كلاس مشتق شده ، باعث خلق اشيايي از آن مي شود كه تخصصي تر هستند.
سالك: چون كه كلاس مشتق شده ، هم صفات كلاس پدر را دارد و هم صفاتي را خود افزوده. مثلا كلاس چهار چرخه عمومي است ولي كلاس اتومبيل صفات ديگري مثل درها و رنگ ماشين را هم دارد. پس اشياي تخصصي تري نسبت به اشيايي كه از كلاس پدر ساخته مي شوند ساخته مي شود. يعني اگر شي ئي از كلاس چهارچرخه بسازيم ، فقط چهار چرخ دارد ولي اگر شي ئي از كلاس اتومبيل بسازيم صفات بيشتري دارد كه كلاس اتومبيل علاوه بر كلاس چهارچرخه به كلاس پدر خود افزوده. يعني كلاس اتومبيل كاملتر از كلاس چهار چرخه است ولي در نوشتن صفت چهار چرخ ديگه صرفه جويي كرده ايم و ننوشته ايم.

ادامه مطلب:
در ادامه كتاب خواهيم ديد كه كلاس مشتق شده مي تواند صفات كلاس پدر خود را customize كند. يعني مخصوص كند.
بحث ديگر direct base class و indirect base class است.


. A direct base class is the base class from which a derived class explicitly inherits. An indirect base class is inherited from two or more levels up in the class hierarchy.

س : متن اصلي را گذاشتم . به نظرم معني اش اينه كه اگر يك كلاس بلافاصله از كلاسي مشتق بشه ، بهش مي گن ((دايركت بيس كلاس)) و اگر با واسطه مشتق بشه مي گن ((ايندايركت)).

بحث بعدي single inheritance و multiple inheritance است .
در اولي فقط از يك كلاس توارث انجام شده.
در سي پلاس پلاس ، ما توارث چند گانه هم داريم كه از كلاس مشتق شده از چند كلاس پايه (base class ) مشتق ميشه.
توارث سينگل سرراست است ولي چندگانه پيچيده و خطاخيز است.

== = = = == = =
3 نوع وراثت داريم: public و protected و private .
در اين فصل كتاب نوع پابليك بحث ميشه.
نوع پروتكتد به ندرت rarely استفاده ميشه.


With public inheritance, every object of a derived class is also an object of that derived class's base class.


در وراثت public ، هر شي از كلاس مشتق شده ، شي ئي از كلاس پايه هم هست.



However, base-class objects are not objects of their derived classes.



اما اشياي كلاس پايه ، اشياي كلاس مشتق شده نيستند.

مثلا هر اتومبيلي كه از كلاس كار ساخته شده ، يك چهار چرخه هم هست ولي هر چهارچرخه يك اتومبيل نيست.
س: كلاس گرد و كلاس گردو . هر گردي گردو نيست. در اين ضرب المثل ، كلاس گردو از كلاس گرد مشتق شده.

در فصول بعدي كتاب به فوائد اين ارتباط مي پردازيم و به يك سري دستكاري هاي جالب مي پردازيم.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
ادامه از همين كتاب:
دو اصطلاح داريم به نام is-a relationship و has-a relationship .

در اولي يعني is-a relationship همان وراثت منظور است. مثلا وقتي كلاس اتومبيل از كلاس چهارچرخه مشتق بشه ، هر شي ئي كه از كلاس اتومبيل ساخته بشه ، تمام مشخصات چهارچرخه را هم دارد.

در دومي يعني has-a relationship اتومبيل ، داراي صندلي است. حاوي صندلي. Composition يا تركيب نام دارد اين قضيه كه بعدها به آن پرداخته مي شود. در اين حال يك شي حاوي يك يا چند شي ديگر است.

== == == = = = = = = =

كلاس مشتق شده به اعضاي non-private كلاس پايه خود دسترسي دارد.
اعضايي از كلاس پايه كه نبايد توسط توابع كلاس مشتق شده قابل دسترس باشند private تعريف مي شوند.
پس كلاس مشتق شده فقط توسط توابع non-private كلاس پايه به اعضاي private كلاس پايه دسترسي دارد.
مي دانيد كه اين توابع توسط وراثت به كلاس مشتق شده هم به ارث رسيده.
.

در طراحي كلاس پايه بايد به اين نكته توجه داشت كه كلاسهايي كه از اين كلاس مي خواهند ارث ببرند ، چه توابعي را به ارث مي برند.
گاهي لازم مي شود تا اين توابع چون مناسب نيستند در كلاس مشتق شده دوباره نويسي شوند. س: اين پاراگراف را فعلا بگذريد تا وارد كدنويسي شويم . فكر نمي كنم خوب بيان شده باشد.

.
= == = = == = = ==
مثال: كلاس مستطيل از كلاس چهارضلعي مشتق مي شود. ( مربع و متوازي الاضلاع و ذوزنقه هم از كلاس چهارضلعي مشتق مي شوند.)

مستطيل حالت خاصي از چهارضلعي است.
يك چهار ضلعي الزاما مستطيل نيست چون مي تواند متوازي الاضلاع باشد.


مثال بعدي:
كلاس دانش آموز ، كلاس پايه و دبيرستاني و ابتدايي و .. كلاس مشتق شده.

مثال بعدي:
كلاس shape كلاس پايه و دايره و مربع و مثلث و .. كلاس مشتق شده.

= = = = == = = = = = = =

چون هر كلاس كه از كلاس بالايي مشتق شده خودش مي تواند مورد استفاده قرار گيرد براي مشتق شدن كلاسهاي بعدي ، يك حالت درختي بوجود مي آيد.

در وراثت چندگانه ، اين حالت درختي به هم مي خورد ، زيرا يك كلاس از چند كلاس بالايي خود به ارث مي برد.
.

= = == = = = = = == =
چون اشكال هندسي ، شامل دوبعدي و 3 بعدي است پس ما يك كلاس shape داريم و دو كلاس دوبعدي و 3 بعدي كه از آن مشتق مي شوند. در زير طريقه اين توارث را نشان مي دهيم:

کد:
class TwoDimensionalShape : public Shape

در كد بالا ، كلاس دوبعدي ، از كلاس shape مشتق شده.
روش توارث هم كه مي بينيد public است.كه نوع public روشي است كه اغلب مورد استفاده قرار مي گيرد.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
Msdn:
کد:
class PrintedDocument
{
    // Member list.
};

// Book is derived from PrintedDocument.
class Book : public PrintedDocument
{
    // Member list.
};

// PaperbackBook is derived from Book.
class PaperbackBook : public Book
{
    // Member list.
};
در كد بالا ، Single-Inheritance را داريم. كه دو كلاس آخري ، هر يك از كلاس بالايي مشتق شده.

اولي direct base دومي است و indirect base سومي.
تفاوت اينه كه در تعريف سومي اسم دومي هست و اسم اولي نيست.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها

msdn
کد:
class Document
{
public:
    char *Name;           // Document name.
    void  PrintNameOf();  // Print name.
};

// Implementation of PrintNameOf function from class Document.
void Document::PrintNameOf()
{
    cout << Name << endl;
}

class Book : public Document
{
public:
    Book( char *name, long pagecount );
private:
    long  PageCount;
};

// Constructor from class Book.
Book::Book( char *name, long pagecount )
{
    Name = new char[ strlen( name ) + 1 ];
    strcpy( Name, name );
    PageCount = pagecount;
};
شرح كد بالا:
در توارث ، كلاس مشتق شده ،حاوي اعضاي كلاس پايه است بعلاوه اعضايي كه شما اضافه كرده ايد.
در كلاس مشتق شده ، به اعضاي كلاس پايه اشاره ميشه مگراينكه اين اعضا دوباره در كلاس مشتق شده تعريف شده باشند.
.
مي بينيد كه تابع سازنده كلاس Book به عضو Name (نه name ، حرف اول فرق داره) از اعضاي كلاس پايه دسترسي داره.
حال به شكل برنامه زير ، مي توانيم شي ئي از كلاس مشتق شده بسازيم و با تابع آن كار كنيم:

کد:
//  Create a new object of type Book. This invokes the
//   constructor Book::Book.
Book LibraryBook( "Programming Windows, 2nd Ed", 944 );

//...

//  Use PrintNameOf function inherited from class Document.
LibraryBook.PrintNameOf();
س: در پستهاي قبلي گفتيم كه سازنده تابعي همنام كلاس است كه موقع ساختن كلاس احضار ميشه. و چون سازنده ما در اينجا مقدار مي گيرد ، شي را با مقدار ساخته ايم.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
حال برنامه زير را اجرا كنيد و با برنامه بالا مقايسه كنيد.
اين بار كلاس مشتق شده را جور ديگري ساخته ايم.

کد:
class Book : public Document
{
    Book( char *name, long pagecount );
    void PrintNameOf();
    long  PageCount;
};
void Book::PrintNameOf()
{
    cout << "Name of book: ";
    Document::PrintNameOf();
}
فرقش اينه كه كلاس مشتق شده ما ، تابع PrintNameOf را دوباره تعريف كرده.
يعني كلاس پايه تابعي داشته كه كلاس مشتق شده آن را دوباره تعريف كرده.
همچنين مي بينيم كه داخل تعريف اين تابع ، تابع همنام از كلاس پايه با استفاده از عملگر اسكوپ( :: ) احضار شده.
دوستان اگر در شرح اشتباه گفته ام تصحيح كنيد.
.
 

e-anahita

کاربر تازه وارد
تاریخ عضویت
17 ژوئن 2006
نوشته‌ها
2
لایک‌ها
0
محل سکونت
Tehran
هر شیء تعریف شده از یک کلاس علاوه بر اعضا داده ای که بطور صریح در تعریف کلاس اعلان شده اند بطور ضمنی دارای اشاره گری است به نام this که این اشاره گر به خود شیء اشاره کرده و به عبارت دیگر آدرس شی را در خود دارد. بنابراین هر شی از طریق اشاره گر this به آدرس خود دسترسی دارد.

مثال:

در یک تابع عضو غیر ثابت کلاس employee نوع اشاره گر this عبارت است از یک اشاره گر ثابت به یک شی غیر ثابت از کلاس employee
employee *const​

در مورد یک تابع عضو ثابت همین کلاس نوع اشاره گر this عبارت خواهد بود از یک اشاره گر ثابت به یک شیء ثابت از کلاس employee:
const employee * const​

یکی دیگر از کاربردها و موارد استفاده از اشاره گر this امکان فراخوانی متوالی توابع عضو می باشد که میتوان چند تابع را در یک دستور فراخوانی نمود.
return *this​
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
یه دوتا نکته در مورد این اشاره گره this اول این اشاره گر یه داده عضو کلاس نیست بلکه یه پارمتر که به تابع ها ارسال می شه مثلا اگه کلاس شما این طوری باشه
کد:
class test
{
      public
      void  func(int);
};
برای کامپایلر به این صورت هست

کد:
class test
{
      public
      void  func(test*const ,int);
};
و وقتی شما این طوری فراخوانی می کنید
کد:
int main()
{
   test ob;
   ob.func(1);
   return 0;
}
کامپایلر کد شما رو این طوری می بینه
کد:
int main()
{
   test ob;
   test::func(&ob,1);
   return 0;
}
و این پامتر اول درون اشاره گر this قرار می گیره

در ضمن اشاره گر this درون توابع استاتیک وجود نداره چون می شه این توابع رو بدون داشتن آبجکتی از نوع کلاس تعریف کرد
 

sima naderi

کاربر تازه وارد
تاریخ عضویت
29 جولای 2006
نوشته‌ها
2
لایک‌ها
0
سلام
لطفا" اموزش كامل c را بنويسيد بطور ساده
متشكر
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
یه تاپیک برای اینکار هست اون رو بخونید اگه مشکلی بود بپرسید احتمالا با کمک دوستان حل می شه
 

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
منبع :
http://www.aachp.ir/post.aspx?no=72
-----------------------------------------------
توابع دوست کلاس - ارائه شده توسط مسعود اقدسی فام

توابع دوست کلاسها از جمله موارد بحث برانگیز برنامه نویسی شی گرا به زبان ++C هستن. چرا که یکی از اصول اساسی شی گرایی (یعنی پنهان سازی اطلاعات) رو نقض می کنن! با این وجود به خاطر کاربردهای متعددی که دارن از حضورشون نمی شه چشم پوشی کرد.

به زبان ساده، توابع دوست یک کلاس توابعی هستن که عضو کلاس نیستن، اما به تمامی داده ها و توابع خصوصی و محافظت شده اون دسترسی دارن!! یه مثال ساده می زنم:
کد:
class myclass

{

  friend void print_a ( myclass ) ;

 private:

  unsigned a ;

 public:

  myclass ( int r )

  {

   a = r > 0 ? r : - r ;

  }

  void print ( )

  {

   cout << a ;

  }

};

 

void print_a ( myclass ob )

{

 cout << ob.a ;

}

 

void main()

{

 myclass ob ( 9 ) ;

 ob.print ( ) ;

 cout << "\t" ;

 print_a ( ob ) ;

}
خروجی برنامه به این صورته:
کد:
9    9
تابع دوست print_a علیرغم اینکه عضو کلاس myclass نیست اما به عضو خصوصی a از کلاس دسترسی داره.

این قطعه برنامه خیلی ساده روش استفاده از توابع دوست رو نشون می ده. توابع دوست با کلمه کلیدی friend در ابتدای تعریفشون مشخص می شن. توجه داشته باشید که چون این توابع عضو کلاس نیستن نباید عملگر تعیین حوزه ( :: ) زمان تعریف بلوک بدنه اونها استفاده بشه. یعنی این عبارت نادرسته:
کد:
void myclass::print_a ( myclass ob )
چرا که ممکنه یه تابع مشخص، تابع دوست برای چندین کلاس مختلف باشه. درضمن بلوک بدنه این توابع باید بیرون از تعاریف هر کلاسی نوشته بشه.

اما چرا به توابع دوست نیاز داریم؟ چه کاربردهایی دارن که علیرغم نقض آشکار قوانین شی گرایی ازشون استفاده می شه؟ یکی از کاربردهای این توابع رو در ادامه بررسی می کنیم.




سربارگذاری عملگرها با توابع دوست:

قبلا در مورد سربازگذاری عملگرها در زبان ++C مطالبی ارائه شده. در این مطالب تاکید شده بود که برای عملگرهای دودویی (مثل جمع و ضرب و . . . ) شی سمت چپ تابع عملگر مربوطه رو فراخوانی می کنه و شی سمت راست به عنوان آرگومان به تابع ارسال می شه. مثلا اگه عملگر + برای کلاسی سربارگذاری شده باشه، دو عبارت زیر معادل هم هستن:
کد:
ob1 + ob2    ≡    ob1.operator+( ob2 )
حالا فرض کنید کلاسی برای کار با اعداد مختلط با نام comp تعریف کردیم. عملگر + هم مطابق با عمل جمع اعداد مختلط براش تعریف شده. برای جمع زدن یه عدد حقیقی (مثلا double) با یه عدد مختلط از تابع + بصورت زیر استفاده می کنیم:
کد:
comp operator + ( double f )
اما این تابع تنها برای جمع عدد حقیقی از سمت راست کاربرد داره، و نمی تونه از سمت چپ عدد حقیقی رو با عدد مختلط جمع کنه. به عنوان نمونه برای یه عدد مختلط مثل c تابع بالا عبارت c + 3.5 رو به خوبی محاسبه می کنه، اما اگه جای دو عملوند عوض بشه دیگه کاری از دستش بر نمی یاد! چرا که در این حالت شی سمت چپ از جنس خود کلاس نخواهد بود.

اینجاست که تابع دوست به کمک ما می یاد. به تعریف زیر دقت کنید:
کد:
friend comp operator + ( double f , comp c )
زمانی که از توابع دوست برای سربارگذاری عملگرهای دودویی استفاده می شه بر خلاف حالت اصلی هر دو شی به صورت آرگومان به تابع ارسال می شن. آرگومان اول شی سمت چپ و آرگومان دوم شی سمت راست رو مشخص می کنه. با تعریف بالا براحتی عبارت زیر هم محاسبه می شه:
کد:
c2 = 3.5 + c1 ;
کد کامل این کلاس به این صورت خواهد بود:
کد:
class comp

{

  friend comp operator + ( double , comp ) ;

 private:

  double real , imag ;

 public:

  comp ( double r , double i )

  {

   real = r ;

   imag = i ;

  }

  comp operator + ( comp r )

  {

   comp temp ( real + r.real , imag + r.imag ) ;

   return temp ;

  }

  comp operator + ( double r )

  {

   comp temp ( real + r , imag ) ;

   return temp ;

  }

};

 

comp operator + ( double l , comp r )

{

 comp temp ( l + r.real , r.imag ) ;

 return temp ;

}

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

و یه نکته مهم دیگه:

برای سربارگذاری عملگرهای جریان (یعنی >> و <<) چاره ای ندارید جز اینکه از توابع دوست استفاده کنید (چرا؟).
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
ممنون از مطلب مفیدتون
 

مسعود اقدسی فام

کاربر تازه وارد
تاریخ عضویت
30 دسامبر 2008
نوشته‌ها
5
لایک‌ها
0
سن
34
سلام

ممنونم دوست عزیز بابت استفاده از مطالب وب سایت ما.

موفق باشید.


منبع :
http://www.aachp.ir/post.aspx?no=72
-----------------------------------------------
توابع دوست کلاس - ارائه شده توسط مسعود اقدسی فام

توابع دوست کلاسها از جمله موارد بحث برانگیز برنامه نویسی شی گرا به زبان ++C هستن. چرا که یکی از اصول اساسی شی گرایی (یعنی پنهان سازی اطلاعات) رو نقض می کنن! با این وجود به خاطر کاربردهای متعددی که دارن از حضورشون نمی شه چشم پوشی کرد.

به زبان ساده، توابع دوست یک کلاس توابعی هستن که عضو کلاس نیستن، اما به تمامی داده ها و توابع خصوصی و محافظت شده اون دسترسی دارن!! یه مثال ساده می زنم:
کد:
class myclass

{

  friend void print_a ( myclass ) ;

 private:

  unsigned a ;

 public:

  myclass ( int r )

  {

   a = r > 0 ? r : - r ;

  }

  void print ( )

  {

   cout << a ;

  }

};

 

void print_a ( myclass ob )

{

 cout << ob.a ;

}

 

void main()

{

 myclass ob ( 9 ) ;

 ob.print ( ) ;

 cout << "\t" ;

 print_a ( ob ) ;

}
خروجی برنامه به این صورته:
کد:
9    9
تابع دوست print_a علیرغم اینکه عضو کلاس myclass نیست اما به عضو خصوصی a از کلاس دسترسی داره.

این قطعه برنامه خیلی ساده روش استفاده از توابع دوست رو نشون می ده. توابع دوست با کلمه کلیدی friend در ابتدای تعریفشون مشخص می شن. توجه داشته باشید که چون این توابع عضو کلاس نیستن نباید عملگر تعیین حوزه ( :: ) زمان تعریف بلوک بدنه اونها استفاده بشه. یعنی این عبارت نادرسته:
کد:
void myclass::print_a ( myclass ob )
چرا که ممکنه یه تابع مشخص، تابع دوست برای چندین کلاس مختلف باشه. درضمن بلوک بدنه این توابع باید بیرون از تعاریف هر کلاسی نوشته بشه.

اما چرا به توابع دوست نیاز داریم؟ چه کاربردهایی دارن که علیرغم نقض آشکار قوانین شی گرایی ازشون استفاده می شه؟ یکی از کاربردهای این توابع رو در ادامه بررسی می کنیم.




سربارگذاری عملگرها با توابع دوست:

قبلا در مورد سربازگذاری عملگرها در زبان ++C مطالبی ارائه شده. در این مطالب تاکید شده بود که برای عملگرهای دودویی (مثل جمع و ضرب و . . . ) شی سمت چپ تابع عملگر مربوطه رو فراخوانی می کنه و شی سمت راست به عنوان آرگومان به تابع ارسال می شه. مثلا اگه عملگر + برای کلاسی سربارگذاری شده باشه، دو عبارت زیر معادل هم هستن:
کد:
ob1 + ob2    ≡    ob1.operator+( ob2 )
حالا فرض کنید کلاسی برای کار با اعداد مختلط با نام comp تعریف کردیم. عملگر + هم مطابق با عمل جمع اعداد مختلط براش تعریف شده. برای جمع زدن یه عدد حقیقی (مثلا double) با یه عدد مختلط از تابع + بصورت زیر استفاده می کنیم:
کد:
comp operator + ( double f )
اما این تابع تنها برای جمع عدد حقیقی از سمت راست کاربرد داره، و نمی تونه از سمت چپ عدد حقیقی رو با عدد مختلط جمع کنه. به عنوان نمونه برای یه عدد مختلط مثل c تابع بالا عبارت c + 3.5 رو به خوبی محاسبه می کنه، اما اگه جای دو عملوند عوض بشه دیگه کاری از دستش بر نمی یاد! چرا که در این حالت شی سمت چپ از جنس خود کلاس نخواهد بود.

اینجاست که تابع دوست به کمک ما می یاد. به تعریف زیر دقت کنید:
کد:
friend comp operator + ( double f , comp c )
زمانی که از توابع دوست برای سربارگذاری عملگرهای دودویی استفاده می شه بر خلاف حالت اصلی هر دو شی به صورت آرگومان به تابع ارسال می شن. آرگومان اول شی سمت چپ و آرگومان دوم شی سمت راست رو مشخص می کنه. با تعریف بالا براحتی عبارت زیر هم محاسبه می شه:
کد:
c2 = 3.5 + c1 ;
کد کامل این کلاس به این صورت خواهد بود:
کد:
class comp

{

  friend comp operator + ( double , comp ) ;

 private:

  double real , imag ;

 public:

  comp ( double r , double i )

  {

   real = r ;

   imag = i ;

  }

  comp operator + ( comp r )

  {

   comp temp ( real + r.real , imag + r.imag ) ;

   return temp ;

  }

  comp operator + ( double r )

  {

   comp temp ( real + r , imag ) ;

   return temp ;

  }

};

 

comp operator + ( double l , comp r )

{

 comp temp ( l + r.real , r.imag ) ;

 return temp ;

}

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

و یه نکته مهم دیگه:

برای سربارگذاری عملگرهای جریان (یعنی >> و <<) چاره ای ندارید جز اینکه از توابع دوست استفاده کنید (چرا؟).
 

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
دوستان علاقه مند بحث ((کلاس در سی)) ، تاپیک زیر هم همین بحث را دنبال کرده.
چون کدهای تاپیک حاضر کمی به هم ریخته شده می توانید به تاپیک زیر مراجعه کنید:

كلاس در سي ++
 
Last edited:
بالا