成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

細(xì)談C++的運(yùn)算符重載

什么是運(yùn)算符重載?

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)淇縣,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):13518219792

      顧名思義就是將原本的操作符以我們的方式定義出來(lái),方便我們使用。

為什么要進(jìn)行運(yùn)算符重載?

      簡(jiǎn)單的理由就是將減少程序員的工作量,首先先看一個(gè)簡(jiǎn)單的例子:

class A{
public:
    A(int data):data(data){};
    void show(){
        cout << "data = " << data << endl;
    }   
private:
    int data;
};
int main(int ac, char *av[])
{
    A a1(100), a2(200);

    (a1+a2).show(); //請(qǐng)注意這一句我們可以這樣嗎?編譯一下看看                                                                                            
    return 0;
}      
編譯結(jié)果:
[root@anna-laptop day11]# cc.sh overload_operator.cpp 
========================   C++_program Compling  =====================       
overload_operator.cpp: In function ‘int main(int, char**)’:
overload_operator.cpp:17: error: no match for ‘operator+’ in ‘a(chǎn)1 + a2’
             ERROR g++ -o  overload_operator.cpp -g -lpthread

      這樣的結(jié)果并不是我們想要的,我們只是想相加一下兩個(gè)對(duì)象里面數(shù)據(jù)并且將結(jié)果顯示出來(lái),但是操作符“+”的左右兩邊的變量必須是內(nèi)置變量類(lèi)型。所以為了方便,我們可以為我們自定義類(lèi)型的對(duì)象對(duì)操作符“+”進(jìn)行運(yùn)算符重載,進(jìn)行如下更改:

class A{
public:
    A(int data):data(data){};
    void show(){
        cout << "data = " << data << endl;
    }  
    // 運(yùn)算符重載函數(shù) 
    A operator+(const A& a){ 
        return A(data + a.data);
    }   
private:
    int data;
};
int main(int ac, char *av[])
{
    A a1(100), a2(200);

    (a1+a2).show();
    return 0;
}

      如我們所愿,進(jìn)行如上更改我們完成了直接讓兩個(gè)類(lèi)對(duì)象進(jìn)行直接相加,大大減少了程序員的工作量。下來(lái)我們細(xì)細(xì)談一下運(yùn)算符重載函數(shù)的具體內(nèi)容:

 運(yùn)算符重載函數(shù)的定義和調(diào)用分為兩種:

       1、以友元函數(shù)定義

            定義格式: friendreturn_val   operatorOPT(type& name...);

            調(diào)用格式:operatorOPT(obj_list);

                             obj1 OPTobj2;

           友元不是成員,不能直接在友元函數(shù)中使用對(duì)象的成員變量,也不能使用this指針,所以在進(jìn)行函數(shù)調(diào)用的時(shí)候,需要將對(duì)象的成員函數(shù)傳進(jìn)去。

      2、以成員函數(shù)函數(shù)定義

           定義格式:return_val   operatorOPT(type& name...);

                  注意:在使用成員函數(shù)進(jìn)行調(diào)用的時(shí)候,如果使用對(duì)象的成員變量,不用將成員變量再傳入函數(shù)中,直接在成員函數(shù)中使用就可以。

          調(diào)用格式:obj1.operatorOPT(obj2);

                           obj1 OPTobj2;

下面舉例來(lái)進(jìn)行說(shuō)明:

class F{
public:
    F(int n = 0, int d = 1):n(n), d(d){}
    // 以成員函數(shù)對(duì)操作符進(jìn)行重載
    F operator*(const F& o)const{
        return F(o.n * n, o.d * d); 
    }  
    // 以友元函數(shù)對(duì)操作符進(jìn)行重載,友元函數(shù)的聲明 
    friend F operator/(const F& obj1, const F& obj2);
private:
    int n;
    int d;
};

// 友元函數(shù)的定義
F operator/(const F& obj1, const F& obj2)
{
    return(obj1.n * obj2.d, obj1.d * obj2.n);
}
int main(int ac, char *av[])
{
    F f1(1,2);
    F f2(3,4);
    F f3;
    
    f3 = f1.operator*(f2);
    f3.show();
    (f1*f2).show();
    f3 = operator/(f1, f2);
    f3.show();
    (f1/f2).show();
    
    return 0;
}

在進(jìn)行運(yùn)算符重載的時(shí)候我們需要注意兩個(gè)問(wèn)題:

  1、在運(yùn)算符的操作數(shù),必須至少含有一個(gè)自定義類(lèi)型的變量。

  2、盡量使用成員函數(shù)對(duì)運(yùn)算符進(jìn)行重載,但是有的運(yùn)算符只能使用友元函數(shù)進(jìn)行重載。

      比如對(duì)于"<<" 和“>>”的重載,如下:

class F{
public:
    F(int n = 0, int d = 1):n(n), d(d){}
    friend ostream& operator<<(ostream& os, const F& f){
        os << f.n << '/' << f.d;
        return os;
    }
    friend istream& operator>>(istream& is, F& f){
        char ch;
        is >> f.n >> ch >> f.d;
        return is;
    }
    F operator*(const F& o)const{
        return F(o.n * n, o.d * d);
    }
    friend F operator/(const F& obj1, const F& obj2);
private:
    int n;
    int d;
};

F operator/(const F& f1, const F& f2)
{
    return(f1.n * f2.d, f1.d * f2.n);
}
int main(int ac, char *av[])
{
    F f1(1,2);
    F f2(3,4);

    cout << f1 << "*" << f2 << "=" << f1*f2 << endl;
    cout << f1 << "/" << f2 << "=" << f1/f2 << endl;
    cout << "enter 2 number : \n";
    cin >> f1 >> f2;
    cout << "f1 = " << f1 << endl;
    cout << "f2 = " << f2 << endl;
    
    return 0;
}        
運(yùn)行結(jié)果:
[root@anna-laptop overload_operator]# ./muldiv
[1/2]*[3/4]=[3/8]
[1/2]/[3/4]=[4/6]
enter 2 number : 
123 / 456
234/ 7645
f1 = [123/456]
f2 = [234/7645]

      以上的操作符全是對(duì)于雙目運(yùn)算符的重載,下面簡(jiǎn)單介紹幾個(gè)單目運(yùn)算符的例子,如"++"和"--"

因?yàn)?+有前置++和后置++兩種,--也是如此,對(duì)于前置++我們直接將++后的結(jié)果直接返回即可,對(duì)于后置++,為了方便區(qū)別于前置++,通常認(rèn)為++后面仍然含有一個(gè)int類(lèi)型的數(shù)組。進(jìn)行如下操作:

class A{
public:
    A(int data = 0):data(data){}
    friend ostream& operator<<(ostream& os, const A& a){
        os << a.data;
        return os;
    }
    friend istream& operator>>(istream& is, A& a){
        is >> a.data;
        return is;
    }
    // 前置 ++;
    friend A& operator++(A& a){
         a.data += 10;
        return a;
    }
    // 前置 --
    A& operator--(){
        data -= 10;
        return *this;
    }
    // 后置 ++;
    friend A operator++(A& a, int){
        A old(a);
        a.data += 5;
        return old;
    }
    // 后置 --
    A operator--(int){
        A old(*this);
        data -= 5;
        return old;
    }
private:
    int data;
};
int main(int ac, char *av[])
{
    A a1(100);
    A a2(100);

    cout << "a1 = " << a1 << endl; 
    cout << "a2 = " << a2 << endl; 
    ++a1;
    --a2;
    cout << "++a1 = " << a1 << endl; 
    cout << "--a2 = " << a2 << endl; 
    cout << "a1++ = " << a1++ << endl; 
    cout << "a2-- = " << a2-- << endl; 
    cout << "a1 = " << a1 << endl; 
    cout << "a2 = " << a2 << endl; 
    return 0;
}

  當(dāng)然還有以下操作符不能進(jìn)行重載:

     1、三目運(yùn)算符不能進(jìn)行重載;

     2、"."成員運(yùn)算符不能重載;

     3、成員指針運(yùn)算符不能進(jìn)行重載;

     4、"::"這是對(duì)于類(lèi)的運(yùn)算符,不能進(jìn)行重載。

================= 以上就是對(duì)于運(yùn)算符重載的介紹 =======================

分享名稱(chēng):細(xì)談C++的運(yùn)算符重載
分享網(wǎng)址:http://jinyejixie.com/article2/pggioc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、企業(yè)建站、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)定制網(wǎng)站、網(wǎng)站設(shè)計(jì)公司域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
南宁市| 望江县| 新邵县| 峨边| 聊城市| 新余市| 蓝田县| 个旧市| 平舆县| 荥阳市| 永德县| 楚雄市| 庆阳市| 阜康市| 阳原县| 丹凤县| 安顺市| 靖边县| 孝感市| 修水县| 白银市| 明星| 黄平县| 襄城县| 交城县| 墨竹工卡县| 府谷县| 四平市| 海南省| 阿克陶县| 象州县| 贡觉县| 泰州市| 达州市| 张掖市| 吕梁市| 南京市| 呼玛县| 东台市| 济阳县| 青阳县|