溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中的一元、二元運(yùn)算符重載

發(fā)布時(shí)間:2021-08-23 11:56:33 來源:億速云 閱讀:169 作者:chen 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“C++中的一元、二元運(yùn)算符重載”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C++中的一元、二元運(yùn)算符重載”吧!

運(yùn)算符重載,就是對已有的運(yùn)算符重新進(jìn)行定義,賦予其另一種功能,使他適應(yīng)不同的數(shù)據(jù)類型。

運(yùn)算符重載的本質(zhì):函數(shù)重載       關(guān)鍵字:operator

一、一元運(yùn)算符重載
一元運(yùn)算符就是對一個(gè)數(shù)進(jìn)行操作

一元運(yùn)算符重載利用成員函數(shù)進(jìn)行重載時(shí),就不用給()內(nèi)傳參數(shù)了,()內(nèi)有隱藏的*this

負(fù)號運(yùn)算符的重載
定義一個(gè)Coordinate坐標(biāo)類,分別通過成員函數(shù)和友元函數(shù)對負(fù)號運(yùn)算符進(jìn)行重載

通過成員函數(shù)對負(fù)號運(yùn)算符進(jìn)行重載:

#include<iostream>
using namespace std;
 
/******************************************
一元運(yùn)算符重載
要求:
定義一個(gè)Coordinate坐標(biāo)類
成員函數(shù):構(gòu)造、getX、getY,數(shù)據(jù)成員:m_iX,m_iY
1、負(fù)號運(yùn)算符重載(成員函數(shù),友元函數(shù))
2、++運(yùn)算符重載(前置++,后置++)
*******************************************/
 
class Coordinate
{
    Coordinate(int x,int y);
 
        //通過成員函數(shù)對符號運(yùn)算符進(jìn)行重載 
    Coordinate &operator-();//讓他返回出來的是它本身,這樣才能讓他再進(jìn)行負(fù)號運(yùn)算符的運(yùn)算,所以返回值寫成Coordinate &
 
    int getX();
    int getY();
private:
    int m_iX;
    int m_iY;
};
 
Coordinate::Coordinate(int x,int y)
{
    m_iX = x;
    m_iY = y;
}
int Coordinate::getX()
{
    return m_iX;
}
int Coordinate::getY()
{
    return m_iY;
}
 
//成員函數(shù)實(shí)現(xiàn)負(fù)號運(yùn)算符重載
Coordinate &Coordinate::operator-()
{
    this->m_iX = -(this->m_iX);//m_iX = -m_iX;
    this->m_iY = -(this->m_iY);
 
    return *this;//返回的是一個(gè)對象
}
 
 
int main()
{
    Coordinate coor1(1,3);
    cout<<coor1.getX()<<","<<coor1.getY()<<endl;
    -coor1;//coor1.operator-();成員函數(shù)
    cout<<coor1.getX()<<","<<coor1.getY()<<endl;
 
    return 0;
}
運(yùn)行結(jié)果:

通過友元函數(shù)對負(fù)號運(yùn)算符進(jìn)行重載:

 
#include<iostream>
using namespace std;
 
/******************************************
一元運(yùn)算符重載
要求:
定義一個(gè)Coordinate坐標(biāo)類
成員函數(shù):構(gòu)造、getX、getY,數(shù)據(jù)成員:m_iX,m_iY
1、負(fù)號運(yùn)算符重載(成員函數(shù),友元函數(shù))
2、++運(yùn)算符重載(前置++,后置++)
*******************************************/
 
class Coordinate
{
    friend Coordinate &operator-(Coordinate &c);//friend Coordinate &operator-(Coordinate c);
    //()內(nèi)要傳入?yún)?shù),其實(shí)就是在成員函數(shù)重載中要傳入的*this,所以應(yīng)該是Coordinate的一個(gè)對象,為了傳遞效率,也可以傳入一個(gè)對象的引用
public:
    Coordinate(int x,int y);
    int getX();
    int getY();
private:
    int m_iX;
    int m_iY;
};
 
Coordinate::Coordinate(int x,int y)
{
    m_iX = x;
    m_iY = y;
}
int Coordinate::getX()
{
    return m_iX;
}
int Coordinate::getY()
{
    return m_iY;
}
 
Coordinate &operator-(Coordinate &c)//友元函數(shù)重載符號運(yùn)算符
{
    c.m_iX = -c.m_iX;
    c.m_iY = -c.m_iY;
 
    return c;
}
 
int main()
{
    Coordinate coor1(1,3);
    cout<<coor1.getX()<<","<<coor1.getY()<<endl;
 
    operator-(coor1);//-coor1;
    cout<<coor1.getX()<<","<<coor1.getY()<<endl;
 
    return 0;
}
運(yùn)行結(jié)果:

前置++、后置++重載
#include<iostream>
using namespace std;
 
Coordinate
{
public:
    Coordinate(int x,int y);
    Coordinate &operator++();//前置++的運(yùn)算符重載,返回的是一個(gè)Coordinate的引用
    Coordinate operator++(int);//后置++的運(yùn)算符重載,參數(shù)int只是為了表示當(dāng)前的++是后置++
//返回的是一個(gè)對象而不是引用,是因?yàn)楹笾?+是在下一行代碼再去訪問這個(gè)對象的時(shí)候才會返回++之后的值,如果返回引用的話,函數(shù)結(jié)束后,引用就會被釋放
    int getX();
    int getY();
private:
    int m_iX;
    int m_iY;
};
 
Coordinate::Coordinate(int x,int y)
{
    m_iX = x;
    m_iY = y;
}
int Coordinate::getX()
{
    return m_iX;
}
int Coordinate::getY()
{
    return m_iY;
}
 
Coordinate &Coordinate::operator++()//前置++
{
    ++m_iX;
    ++m_iY;
 
    return *this;
}
Coordinate Coordinate::operator++(int)//后置++
{
    Coordinate old(*this);//利用默認(rèn)拷貝構(gòu)造函數(shù)構(gòu)造一個(gè)臨時(shí)對象old,將++之前的值存儲在臨時(shí)對象old中
    this->m_iX++;
    this->m_iY++;
 
    return old;//當(dāng)前這個(gè)表達(dá)式是他++之前的值,下一行代碼再去訪問這個(gè)對象的時(shí)候,才是++之后的值
}
 
 
int main()
{
    Coordinate coor1(1,3);
    cout<<coor1.getX()<<","<<coor1.getY()<<endl;//1,3
 
    coor1.operator++(0);//參數(shù)0只是標(biāo)識是后置++
    cout<<coor1.getX()<<","<<coor1.getY()<<endl;//2,4
    
    cout<<(coor1++).getX()<<",";//2
    cout<<(coor1++).getY()<<endl;//5
 
    return 0;
}
運(yùn)行結(jié)果:

二、二元運(yùn)算符重載
1、“+號”運(yùn)算符重載(成員函數(shù),友元函數(shù))
2、“<<”輸出運(yùn)算符重載
3、“[]索引”運(yùn)算符重載

#include<iostream>
using namespace std;
 
/******************************************
二元運(yùn)算符重載
要求:
定義一個(gè)Coordinate坐標(biāo)類
成員函數(shù):構(gòu)造、getX、getY,數(shù)據(jù)成員:m_iX,m_iY
1、“+號”運(yùn)算符重載(成員函數(shù),友元函數(shù))
2、“<<”輸出運(yùn)算符重載
3、“[]索引”運(yùn)算符重載
*******************************************/
 
class Coordinate
{
    //“<<”輸出運(yùn)算符重載
    friend ostream& operator<<(ostream &output,const Coordinate &c);//返回值是ostream
 
    //“+號”運(yùn)算符通過友元函數(shù)重載
    friend Coordinate operator+(const Coordinate &c1,const Coordinate &c2);
public:
    Coordinate(int x,int y);
 
    //“+號”運(yùn)算符通過成員函數(shù)重載,不能傳引用,要傳對象
    //Coordinate operator+(const Coordinate &c);
 
    //“[]索引”運(yùn)算符重載
    int operator[](int index);
 
    int getX();
    int getY();
private:
    int m_iX;
    int m_iY;
};
 
Coordinate::Coordinate(int x,int y)
{
    m_iX = x;
    m_iY = y;
}
int Coordinate::getX()
{
    return m_iX;
}
int Coordinate::getY()
{
    return m_iY;
}
 
/*“+號”運(yùn)算符通過成員函數(shù)重載
Coordinate Coordinate::operator+(const Coordinate &c)
{
    Coordinate temp(0,0);
    temp.m_iX = this->m_iX + c.m_iX;
    temp.m_iY = this->m_iY + c.m_iY;
    return temp;
}
*/
 
//“+號”運(yùn)算符通過友元函數(shù)重載
Coordinate operator+(const Coordinate &c1,const Coordinate &c2)
{
    Coordinate temp(0,0);
    temp.m_iX = c1.m_iX + c2.m_iX;
    temp.m_iY = c1.m_iY + c2.m_iY;
 
    return temp;
}
 
//“<<”輸出運(yùn)算符重載
ostream& operator<<(ostream &output,const Coordinate &c)//返回值為ostream&,const Coordinate &c為要進(jìn)行輸出的對象
{
    output<<c.m_iX<<","<<c.m_iY<<endl;
    return output;
}
 
//“[]索引”運(yùn)算符重載
int Coordinate::operator[](int index)
{
    if(0 == index)
    {
        return m_iX;
    }
    if(1 == index)
    {
        return m_iY;
    }
}
 
int main()
{
    Coordinate coor1(1,3);
    Coordinate coor2(2,4);
    Coordinate coor3(0,0);
    coor3 = operator+(coor1,coor2);
    //coor3 = coor1 + coor2;
    cout<<coor3.getX()<<","<<coor3.getY()<<endl;//3,7
 
    operator<<(cout,coor1);//1,3
    cout<<coor2;//2,4
 
    cout<<coor2[0];//2
    cout<<coor2[1];//4
 
    return 0;
}
運(yùn)行結(jié)果:

注:

“<<”輸出運(yùn)算符重載不能用成員函數(shù)進(jìn)行重載,只能用友元函數(shù)進(jìn)行重載;因?yàn)樵诔蓡T函數(shù)中重載第一個(gè)參數(shù)為隱藏的*this,而“<<”輸出運(yùn)算符重載第一個(gè)參數(shù)為ostream &output
“[]索引”運(yùn)算符重載不能用友元函數(shù)進(jìn)行重載,只能用成員函數(shù)進(jìn)行重載;因?yàn)椤癧]索引”運(yùn)算符重載第一個(gè)參數(shù)必須為*this,通過*this才能訪問到該對象的數(shù)據(jù)
賦值運(yùn)算符重載函數(shù)不能被繼承
因?yàn)橄噍^于基類,派生類往往要添加一些自己的數(shù)據(jù)成員和成員函數(shù),如果允許派生類繼承基類的賦值運(yùn)算符重載函數(shù),那么,在派生類不提供自己的賦值運(yùn)算符重載函數(shù)時(shí),就只能調(diào)用基類的,但基類版本只能處理基類的數(shù)據(jù)成員,在這種情況下,派生類自己的數(shù)據(jù)成員怎么辦?                        所以,C++規(guī)定,賦值運(yùn)算符重載函數(shù)不能被繼承。

賦值運(yùn)算符重載函數(shù)只能是類的非靜態(tài)的成員函數(shù),不能是靜態(tài)成員函數(shù),也不能是友元函數(shù)
 

其實(shí),之所以不是靜態(tài)成員函數(shù),是因?yàn)殪o態(tài)成員函數(shù)只能操作類的靜態(tài)成員,不能操作非靜態(tài)成員。如果我們將賦值運(yùn)算符重載函數(shù)定義為靜態(tài)成員函數(shù),那么,該函數(shù)將無法操作類的非靜態(tài)成員,這顯然是不可行的。

到此,相信大家對“C++中的一元、二元運(yùn)算符重載”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI