چگونگی overload کردن اپراتور ++ به صورت پیش و پس افزایشی
سلام خدمت همه توسینسویی های عزیز همه مفهوم i++ و ++i رو میدونیم و میدونیم ک اپراتور هارو میشه overload کرد حالا سوال اینجاست چطور هم post increment و هم preincrement رو با هم تو ی کلاس اورلود کنیم برای نوع داده های پیشفرض میشه از جفتش استفاده کرد ولی توی نوع داده کاربر نتونستم هردورو باهم داشته باشم در ضمن روش این دو رو هم بلدم فقط چطوری بنویسیمش رو موندم اگه نمونه کد هم بدین خیلی عالی میشه خیلی ممنون
مثلا در C++ مینویسیم
Test& operator++()// pretfix
{
}
Testoperator++(int)// postfix
{
}
و در سی شارپ فقط یک نوع اورلود داریم به صورت زیر
public static Test operator ++(Test test)
{
}
چطور این دو رو باهم در سی شارپ داشته باشیم
5 پاسخ
خواهش میکنم , موفق باشید 🌹🙏
خواهش مکینم , والا تا اونجایی که من خوندم امروز فهمیدم تو #C فقط یه اپراتور increment (++) و یه اپراتور decrement (--) داریم و در واقع post و pre جفتشون یک کار رو انجام میدن و فقط نحوه ای که اجرا می شن متفاوته یعنی این تفاوت رو compiler ایجاد می کنه نه کد برنامه نویس و برنامه نویس فقط می تونه اپراتور ++ یا -- رو ادیت کنه که همونطور که فرمودید یا باید ساختار post رو درنظر بگیریم یا pre و نمیشه جفتش رو داشته باشیم اما راجب تایپ داده های پیش فرض من خودم هم دقیق اطلاعی ندارم ولی خب طبیعتا چون پیش فرض هستن همچین اپراتور هایی براشون تعریف شده اما خب متاسفانه اجازه overload این اپراتور ها به صورت مجزا به برنامه نویس داده نشده.
سلام دوست عزیز
تا اونجایی که من فهمیدم در #C این pre و post تعریف مجزایی ندارن و فقط یک operator هست و اون هم ++ یا -- هست. حالا باید توجه داشت که اصلا تفاوت این دو در چیه ؟ و جواب اینه که هر دو در نهایت مقدار رو عوض می کنن اما pre مقدار جدید رو بر می گردونه و post مقدار قدیمی رو بر می گردونه برای مثال برای دو متغییر زیر داریم:
int i = 1;
int j = i++;
Console.WriteLine(i); //Result is 2
Console.WriteLine(j); //Result is 1
int i = 1;
int j = ++i;
Console.WriteLine(i); //Result is 2
Console.WriteLine(j); //Result is 2
پس با همین نکته می تونیم متد های دلخواه بنویسیم تا این کار رو برای ما انجام بدن که به این شکل میشه:
using System;
public class Program
{
public static void Main()
{
MyNumber i = new MyNumber(10);
MyNumber j = i.post();
Console.WriteLine(i.number);
Console.WriteLine(j.number);
MyNumber _i = new MyNumber(10);
MyNumber _j = _i.pre();
Console.WriteLine(_i.number);
Console.WriteLine(_j.number);
}
}
public class MyNumber {
public int number {get; set;}
public MyNumber(int number) {
this.number = number;
}
public MyNumber post() {
MyNumber oldItem = new MyNumber(this.number);
this.number += 1;
return oldItem;
}
public MyNumber pre() {
this.number += 1;
return this;
}
}
یا از خود این operator ها استفاده کنیم که به این شکل میشه:
using System;
public class Program
{
public static void Main()
{
MyNumber i = new MyNumber(10);
MyNumber j = i.post();
Console.WriteLine(i.number);
Console.WriteLine(j.number);
MyNumber _i = new MyNumber(10);
MyNumber _j = _i.pre();
Console.WriteLine(_i.number);
Console.WriteLine(_j.number);
}
}
public class MyNumber {
public int number {get; set;}
public MyNumber(int number) {
this.number = number;
}
public MyNumber post() {
int result = this.number++;
return new MyNumber(result);
}
public MyNumber pre() {
int result = ++this.number;
return new MyNumber(result);
}
}
خیلی ممنون از وقتی ک گذاشتید
خیلی ممنون از پاسخی ک دادین پس خلاصه این میشه ک در سی شارپ ما با یک امضا اوپراتور رو overload میتونیم بکنیم و دست خودمونه ک pre یا post باشه و اون ازادی عملی ک تو C++ هست رو نداریم با این وصفی ک کردیم جای سوال هست چطور برای نوع داده های پیش فرض مثل int میشه بین pre , post انتخواب کرد.