|
本文介绍的是C++中的重载运算符,希望对你有帮助,一起来看。
重载赋值运算符
为了解决上面的问题,我们应该写一个特殊的赋值运算符函数来处理这类问题。当需要为同一个类的两个对象相互赋值时,就可以重载运算符函数。这个方法可以解决类的赋值和指针的释放。
下面的程序中,类中的赋值函数用new运算符从堆中分配了一个不同的指针,该指针获取赋值对象中相应的值,然后拷贝给接受赋值的对象。
在类中重载赋值运算符的格式如下:
- void operator = (const Date&)
后面我们回加以改进。目前,重载的运算符函数的返回类型为void。它是类总的成员函数,在本程序红,是Date类的成员函数。它的函数名始终是operator =,参数也始终是同一个类的对象的引用。参数表示的是源对象,即赋值数据的提供者。重载函数的运算符作为目标对象的成员函数来使用。
#include \"iostream.h\" - #include \"string.h\"
class Date - {
int mo,da,yr; - char *month;
public: - Date(int m=0, int d=0, int y=0);
~Date(); - void operator=(const Date&);
void display() const; - };
- Date::Date(int m, int d, int y)
{ - static char *mos[] =
{ - \"January\",\"February\",\"March\",\"April\",\"May\",\"June\",
\"July\",\"August\",\"September\",\"October\",\"November\",\"December\" - };
mo = m; da = d; yr = y; - if (m != 0)
{ - month = new char[strlen(mos[m-1])+1];
strcpy(month, mos[m-1]); - }
else month = 0; - }
Date::~Date() - {
delete [] month; - }
void Date::display() const - {
if (month!=0) cout<<month<<\' \'<<da<<\",\"<<yr<<endl; - }
void Date::operator=(const Date& dt) - {
if (this != &dt) - {
mo = dt.mo; - da = dt.da;
yr = dt.yr; - delete [] month;
if (dt.month != 0) - {
month = new char [std::strlen(dt.month)+1]; - std::strcpy(month, dt.month);
} - else month = 0;
} - }
int main() - {
Date birthday(8,11,1979); - birthday.display();
Date newday(12,29,2003); - newday.display();
newday = birthday; - newday.display();
return 0; - }
除了为Date类加入了一个重载运算符函数,这个程序和上面的一个程序是相同的。赋值运算符函数首先取得所需的数据,然后用delete把原来的month指针所占用的内存返还给堆。接着,如果源对象的month指针已经初始化过,就用new运算符为对象重新分配内存,并把源对象的month字符串拷贝给接受方。
重载的Date类赋值运算符函数的第一个语句比较了源对象的地址和this指针。这个操作取保对象不会自己给自己赋值。
希望通过以上内容对重载运算的介绍,希望能够给你带来帮助。
|
|