operator overloading یعنی کاری کنیم که کلاس مثل یک متغیر معمولی عمل کنه ,و عملیات های مثل +- [] >> ,.... روش کار کنه .
operator های موجود در ++C واین که کدوم ها قابل overload شدن هستند رو میتونید از این لینک ببینید .
نحوه تعریف operator ها کاملا مثل توابع هست
return_type operator_name (inputs);
مثلا فرض کنید که یک کلاس دارید که داخلش یک وکتور ذخیره شده :
class A
{
public:
A(std::initializer_list<int> data) : data_(data){}
A(){}
private:
std::vector<int> data_;
};
حالا می خواهید کاری کنید که بشه به این شکل از کلاس استفاده کرد :
A obj = {1,2,3,4};
std::vector<int> data;
obj<<data;
برای این که این کار قابل انجام باشه باید operator << که یک ورودی از نوع وکتور داره رو داخل کلاس بنویسید به این شکل :
#include <vector>
#include <initializer_list>
#include <iostream>
class A
{
public:
A(std::initializer_list<int> data) : data_(data){}
A(){}
A& operator<<( const std::vector<int>& data)
{
for (const auto& elem : data)
this->data_.push_back(elem);
return *this;
}
void print()
{
for (const auto& i : data_){
std::cout << i << ' ';
}
}
private:
std::vector<int> data_;
};
int main()
{
A obj;
std::vector<int> data = { 4, 5 };
std::vector<int> data2 = { 1,2,3};
obj << data<<data2<<data;//alan A mese cout kar mikone
obj.print();// khorooji 4 5 1 2 3 4 5
}
نحوه کار cout هم کاملا به همین شکل هست cout خودش یک کلاس هست و >>operator براش به همین شکل overload شده .
کار های زیادی میشه با operator ها انجام داد مثلا میشه کاری کرد که یک کلاس رو بشه با cout چاپ کرد این لینک رو ببینید : نحوه نوشتن کلاس با cout
یا این که کاری کنیم که کلاس کاملا مثل یک int عمل کنه ! : تولید اعداد بزرگ
یا کاری که کلاس string انجام میده که میشه 2 تا شی از std::string رو با هم + زد .
یکی از کارهایی که خیلی زیاد انجام میشه اینه که کاری کنیم که کلاس مثل تابع قابل صدا زدن باشه :
A obj;
obj(4,5);//mese function sheye A ghabele seda zadan hast
این کار با overload کردن () قابل انجامه :
class A
{
public:
void operator()(int a, int b)
{
//...
}
};
int main()
{
A obj;
obj(1, 4);
}
مثلا داخل این لینک.حذف نقاط تکراری کلاس hash به این شکل تعریف شده :
struct hash<Point2f>
{
size_t operator()(Point2f const& pt) const
{
return (size_t)(pt.x*100 + pt.y);
}
};
//be in shekl mishe estefade kard;
hash h;
h(Point2f(4,5));//mese seda zadan function
که برای استفاده از unordered_set ازش استفاده شده .
یکی دیگه از جاهایی که از operator overloading استفاده میشه سربارگذاری operator های new , delete[] هست برای برگردوندن حافظه align شده
و خیلی چیزای دیگه ....
داخل این تگ هم مثال هایی هست operator overloading