C++基礎(chǔ)之重載賦值運(yùn)算符
重載賦值運(yùn)算符
為了解決上面的問題,我們應(yīng)該寫一個(gè)特殊的賦值運(yùn)算符函數(shù)來處理這類問題。當(dāng)需要為同一個(gè)類的兩個(gè)對(duì)象相互賦值時(shí),就可以重載運(yùn)算符函數(shù)。這個(gè)方法可以解決類的賦值和指針的釋放。
下面的程序中,類中的賦值函數(shù)用new運(yùn)算符從堆中分配了一個(gè)不同的指針,該指針獲取賦值對(duì)象中相應(yīng)的值,然后拷貝給接受賦值的對(duì)象。
在類中重載賦值運(yùn)算符的格式如下:
- void operator = (const Date&)
后面我們回加以改進(jìn)。目前,重載的運(yùn)算符函數(shù)的返回類型為void。它是類總的成員函數(shù),在本程序紅,是Date類的成員函數(shù)。它的函數(shù)名始終是operator =,參數(shù)也始終是同一個(gè)類的對(duì)象的引用。參數(shù)表示的是源對(duì)象,即賦值數(shù)據(jù)的提供者。重載函數(shù)的運(yùn)算符作為目標(biāo)對(duì)象的成員函數(shù)來使用。
- #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類加入了一個(gè)重載運(yùn)算符函數(shù),這個(gè)程序和上面的一個(gè)程序是相同的。賦值運(yùn)算符函數(shù)首先取得所需的數(shù)據(jù),然后用delete把原來的month指針?biāo)加玫膬?nèi)存返還給堆。接著,如果源對(duì)象的month指針已經(jīng)初始化過,就用new運(yùn)算符為對(duì)象重新分配內(nèi)存,并把源對(duì)象的month字符串拷貝給接受方。
重載的Date類賦值運(yùn)算符函數(shù)的***個(gè)語句比較了源對(duì)象的地址和this指針。這個(gè)操作取保對(duì)象不會(huì)自己給自己賦值。
希望通過以上內(nèi)容對(duì)重載運(yùn)算的介紹,希望能夠給你帶來幫助。