سلام
راجع به کلاس ها وoverloading درc++ یه کم توضیح دهید(خواهش میکنم)
ممنونم
Printable View
سلام
راجع به کلاس ها وoverloading درc++ یه کم توضیح دهید(خواهش میکنم)
ممنونم
سلام
اين pdf در مورد كلاس ها هست اميدوارم كه بتونه كمك كنه
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
دوست من مریم جان سلام.
فکر می کنم منظور شما یکی از ویژگیهای مهم شیء گرایی، یعنی قابلیت دادن بار اضافی به عملگرها و توابع یا همان Overloading هست. این قابلیت، انعطاف پذیری بیشتری را در طراحی برنامه فراهم می کند.
قابلیت بارگذاری، یکی از امکاناتی است که ویژگی Polymorphism(چند ریختی) زبانهای شیء گرا به برنامه نویس ارائه می کند. چندریختی، یعنی امکان ایجاد چندین نگارش از یک تابع یا یک عملگر.
قابلیت بارگذاری توابع(Function Overloading)، یعنی اینکه تابع را طوری دوباره تعریف کنیم که بتواند با انواع مختلف داده ها کار کند. برای مثال کتابخانه Runtime زبان C++، خود شامل چند تابع است که برای کار با انواع داده ها Overload شده اند. بعنوان مثال به prototype تابع square نگاه می کنیم:
هر تابع برای گرفتن و برگرداندن نوع خاصی از داده(integer، float یا double) طراحی می شود، باوجود این، همه تابع ها square نام دارند. در C++، بارگذاری تابع تنها تا زمانی که لیست آرگومانها با هم تفاوت داشته باشد، امکانپذیر است. بنابراین اگر تابع square را با فرستادن یک مقدار صحیح صدا بزنید، تابع مناسب صدا زده می شود و یک مقدار صحیح برگردانده خواهد شد. بهمین ترتیب اگر square را با یک مقدار float یا double صدا بزنید، بترتیب یک float یا double برگردانده خواهد شد.کد:int square(int value);
float square(float value);
double square(double value);
قابلیت بارگذاری عملگرها(Operator Overloading)، وابستگی شدیدی به خاصیت امکان تعریف نوع داده(Data Type) جدید در برنامه نویسی شیء گرا دارد. بدین ترتیب که کاربر می تواند بعد از تعریف یک نوع داده جدید، عملگرهای موجود در گرامر زبان شیء گرا رو(برای مثال در C++ عملگرهایی چون + - * / % ^ & | ~ ! = <> += [] () new delete و ...) ، بارگذاری کند. در C++، عملگرهای بارگذاری شده، عملگرهایی هستند که در طول یک کلاس با استفاده از کلمه کلیدی operator که بدنبال آن علامت یک عملگر می آید، مجددا تعریف شده اند. در C++ تمامی عملگرها را می توان بارگذاری کرد، مگر.، :، ?:، ::، .*(نقطه ستاره) و علائم پیش پردازنده # و ##.
برای درک بهتر موضوع، مطلب را با یک مثال ساده در مورد اعداد مختلط-موهومی(Complex) ادامه می دهیم.
در اکثر قریب به اتفاق زبانهای رایج برنامه نویسی، از جمله C++ هیچ نوع داده از پیش تعریف شده ای برای اعداد مختلط در نظرگرفته نشده، اما ما می توانیم خود یک نوع داده جدید برای کار با این اعداد تعریف کنیم. برای اینکار در C++ از کلاسها استفاده می کنیم. همانطور که می دانیم، اعدد مختلط بفرم کلی Z=x+iy هستند که x و y قسمت حقیقی(Real Part) وi را قسمت موهومی(Imaginary Part) می گویند و آنرا بصورت Z(x,y) هم نشان می دهند. برای جمع دو عدد مختلط، بایستی دو بخش دو عدد را بصورت جداگانه با هم جمع کنیم.
به ساختار کلاس زیر توجه کنید:
همانطور که می بینید، در کلاس بالا، سه تابع با نام مشترک Complex، اما با استفاده از امکان Polymorphism، در سه شکل مختلف داریم. این تابع فقط در هنگام تعریف متغیرها می تواند فعال شود و تابعی است که متغیرهای کلاس را مقداردهی اولیه می کند(تابع Constructor-سازنده).کد:class Complex{
float Re, Im;
Public:
void set(float R, float I)
{
Re=R;
Im=I;
}
Complex(float R, float I=0)
{
Re=R;
Im=I;
}
Complex(float R, float I)
{
Re=R;
Im=I;
}
Complex()
{
Re=Im=0;
}
Complex Operator +(Complex &x)
{
Complex y;
y.Re = Re + x.Re;
y.Im = Im + x.Im;
Return y;
}
};
و حالا برای استفاده از این کلاس، برای مثال برنامه زیر را داریم:
در واقع در خط اول تابع main، عبارات X, Z1(1), Z2(4,3)، تابع سازنده کلاس Complex را بطور اتوماتیک صدا می زنند، البته هر کدام، یکی از شکلهای این تابع را فراخوانی می کنند.کد:main(){
Complex X, Z1(1), Z2(4,3);
X=Complex(0,0);
X=Z1+Z2; // X=5+3i
}
امیدوارم این مطالب که هر کدوم رو از یک جا پیدا کردم_دست نوشته های قدیم خودم، برات مفید باشه._
موفق باشی
سلام
از راهنماییتان ممنونم ولی میخواستم کمی ساده تر و بیشتر توضیح دهید
مریم جان
من نمی دونم کجاش رو باید بیشتر یا ساده تر توضیح بدم. پس لطف کن و بگو کجاش رو متوجه نشدی تا توضیح بدم. کلا شما راجع به شیءگرایی باید یه پیش زمینه نه چندان مختصری داشته باشین تا مبحث بالا رو خوب متوجه بشین.
موفق باشید
من چند مثال راجع به overloading میخواستم
دوستان اگه كسي در مورد كلاس در سي ++ چند تا برنامه واسه نمونه داره ممنون ميشم لينكش رو بذاره
دوستان من، قبلا یک نمونه Overloading گذاشتم، با توضیح. اما خوب این هم یکی دیگه. پیاده سازی کلاس Rational (اعداد کسری) همراه با overload اپراتورها برای سادگی کار با این اعداد:
کد:Rational::Rational( int _a, int _b)
{
_num = _a;
_den = _b;
if( _den == 0 )
{
_error_msg("denominator can't be zero.");
assert( _den != 0 );
}
reduce(*this);
}
Rational Rational::operator =( const Rational &r )
{
this->_num = r._num;
this->_den = r._den;
return *this;
}
Rational Rational::operator +()
{
return *this;
}
Rational Rational::operator -()
{
Rational temp = *this;
temp._num = -(this->_num);
return temp;
}
Rational Rational::operator +( const Rational &r ) const
{
Rational temp;
int lcm_val = lcm( this->_den, r._den );
int a = this->_num * ( lcm_val / this->_den );
int c = r._num * ( lcm_val / r._den );
int b = lcm_val;
int d = b;
temp._num = a + c;
temp._den = lcm_val;
reduce(temp);
return temp;
}
Rational Rational::operator -( const Rational &r ) const
{
Rational temp;
int lcm_val = lcm( this->_den, r._den );
int a = this->_num * ( lcm_val / this->_den );
int c = r._num * ( lcm_val / r._den );
int b = lcm_val;
int d = b;
temp._num = a - c;
temp._den = lcm_val;
reduce(temp);
return temp;
}
Rational Rational::operator *( const Rational &r ) const
{
Rational temp;
int a = this->_num;
int b = this->_den;
int c = r._num;
int d = r._den;
int gcd_val = gcd( a, d );
int gcd_val2 = gcd( b, c );
a /= gcd_val;
d /= gcd_val;
b /= gcd_val2;
c /= gcd_val2;
temp._num = a * c;
temp._den = b * d;
reduce(temp);
return temp;
}
Rational Rational::operator /( const Rational &r ) const
{
Rational temp;
int a = this->_num;
int b = this->_den;
int c = r._num;
int d = r._den;
int gcd_val = gcd( a, c );
int gcd_val2 = gcd( b, d );
a /= gcd_val;
c /= gcd_val;
b /= gcd_val2;
d /= gcd_val2;
temp._num = a * d;
temp._den = b * c;
reduce(temp);
return temp;
}
Rational Rational::operator +=( const Rational &r )
{
*this = *this + r;
return *this;
}
Rational Rational::operator -=( const Rational &r )
{
*this = *this - r;
return *this;
}
Rational Rational::operator *=( const Rational &r )
{
*this = *this * r;
return *this;
}
Rational Rational::operator /=( const Rational &r )
{
*this = *this / r;
return *this;
}
Rational Rational::operator ++()
{
*this += Rational( 1, 1 );
return *this;
}
Rational Rational::operator --()
{
*this -= Rational( 1, 1 );
return *this;
}
Rational Rational::operator ++( int n )
{
if( n == 0 ) *this += Rational( 1, 1 );
else *this += Rational( n, 1 );
return *this;
}
Rational Rational::operator --( int n )
{
if( n == 0 ) *this -= Rational( 1, 1 );
else *this -= Rational( n, 1 );
return *this;
}
bool Rational::operator ==( const Rational &r ) const
{
return ( this->_num == r._num && this->_den == r._den );
}
bool Rational::operator !=( const Rational &r ) const
{
return ( this->_num != r._num || this->_den != r._den );
}
bool Rational::operator >( const Rational &r ) const
{
Rational temp = *this - r;
return ( temp._num > 0 && temp._den > 0 );
}
bool Rational::operator <( const Rational &r ) const
{
Rational temp = *this - r;
return ( temp._num < 0 || temp._den < 0 );
}
bool Rational::operator >=( const Rational &r ) const
{
Rational temp = *this - r;
return ( temp._num >= 0 && temp._den > 0 );
}
bool Rational::operator <=( const Rational &r ) const
{
Rational temp = *this - r;
return ( temp._num <= 0 || temp._den < 0 );
}
int Rational::gcd( int _x, int _y ) const
{
int x = _x;
int y = _y;
if( x < 0 ) x = -x;
if( y < 0 ) y = -y;
if( _x > _y ) swap( x, y );
for( int i = x; i > 1; i-- )
{
if( !(x % i) && !(y % i)) break;
}
if( i == 0 ) i++;
return i;
}
int Rational::lcm( int _x, int _y ) const
{
int gcd_val = gcd( _x, _y );
int prod = _x * _y;
if(prod < 0) prod = -prod;
return ( prod / gcd_val );
}
void Rational::reduce( Rational &r ) const
{
int gcd_val = gcd( r._num, r._den );
r._num /= gcd_val;
r._den /= gcd_val;
}
Rational Rational::_abs( const Rational &r )
{
if( r._num < 0 ) this->_num = -r._num;
if( r._den < 0 ) this->_den = -r._den;
return *this;
}
Rational Rational::_min( const Rational &p, const Rational &q )
{
return (p < q ? p : q);
}
Rational Rational::_max( const Rational &p, const Rational &q )
{
return (p > q ? p : q);
}
Rational Rational::convert_to_fraction( char *strNum )
{
if(!IsNumber(strNum))
{
_error_msg("unable to make conversion,make sure that you've entered a valid number.");
assert(IsNumber(strNum));
}
int counter = 0, len = 0, pos = -1, i = 0;
bool isdecimal = false;
char *str = strNum;
char *temp = new char[20];
while( *str )
{
if(*str == '.') { isdecimal = true; pos = counter; }
else *( temp + i++ ) = *str;
str++; counter++;
}
temp[i] = 0;
if(isdecimal)
{
this->_num = atol(temp);
this->_den = pow(10, counter - pos - 1 );
}
else
{
this->_num = atol(temp);
this->_den = 1;
}
delete temp;
return *this;
}
double Rational::convert_to_decimal( const Rational &r )
{
return ((double)r._num/r._den);
}
double Rational::Log( const Rational &r )
{
if( r._num <= 0 || r._den <= 0 )
{
_error_msg("neither numerator or denominator can't be negative values or zero.");
assert( r._num > 0 && r._den > 0 );
}
return (log(r._num) - log(r._den));
}
double Rational::Log10( const Rational &r )
{
if( r._num <= 0 || r._den <= 0 )
{
_error_msg("neither numerator or denominator can't be negative values or zero.");
assert( r._num > 0 && r._den > 0 );
}
return (log10(r._num) - log10(r._den));
}
double Rational::Exp( const Rational &r )
{
return exp(((double)r._num / r._den));
}
double Rational::Pow( const Rational &p, const Rational &q )
{
return pow(((double)p._num/p._den), ((double)q._num/q._den));
}
ostream& operator<< ( ostream &os, Rational &p )
{
os << p._num << "/" << p._den;
return os;
}
istream& operator>> ( istream& is, Rational &p )
{
char *buff = new char[20];
char *tmp = new char[20];
is >> buff;
char *str = buff;
bool is_fraction = false;
bool is_rational = true;
int i = 0;
// search "/" operator in "str" and retriving numerator
while( *str )
{
if( *str == '/' ) { is_fraction = true; break; }
*(tmp + i) = *str;
str++; i++;
}
tmp[i] = 0;
if(!IsNumber(tmp)) is_rational = false;
verify_number( tmp, is_fraction );
Rational P, Q(1,1); i = 0;
P.convert_to_fraction(tmp);
if(is_fraction)
{
str++;
// retriving denominator
while( is_fraction && *str )
{
*(tmp + i) = *str;
str++; i++;
}
tmp[i] = 0;
verify_number( tmp, is_fraction );
Q.convert_to_fraction(tmp);
}
p = P/Q;
delete tmp; delete buff;
return is;
}
void verify_number( char *strNum, bool is_fraction )
{
int len = strlen(strNum);
if( is_fraction && (len == 0 || !IsNumber(strNum)))
{
_error_msg("this is not a rational number.");
assert(IsNumber(strNum));
}
if( len > 9 )
{
_error_msg("this number is too big.");
assert( len < 10 );
}
}
bool IsNumber( char *number )
{
int len = strlen( number );
bool isnumber = true;
int i = 0;
if( len == 0 ) return !isnumber;
while( i < len && isnumber )
{
if( isdigit( number[i] ) == 0 )
{
if( number[i] == '.' )
{
if( i + 1 > len - 1 )
{
isnumber = false;
break;
}
}
if( number[i] == '+' || number[i] == '-' )
{
if( i + 1 > len - 1 || i - 1 >= 0 )
{
isnumber = false;
break;
}
}
if( number[i] != '+' && number[i] != '-' && number[i] != '.' )
{
isnumber = false;
break;
}
}
i++;
}
return isnumber;
}
void _error_msg( char *str )
{
cerr << str << "\n";
}
واقعا" متشکرم من هفته بعد امتحان دارم اگر چند مثال دیگه بذارید ممنون میشم
نقل قول:
mamno0n az matalebe mofidi ke mizarin
mishe dobare in addresso bezarin,PLZ!!!
not founde!!!!!!!!!
:11::11::11: