1. 程式人生 > >C++(筆記)淺析運算子過載&例項

C++(筆記)淺析運算子過載&例項

一、什麼是運算子過載

過載的運算子是具有特殊名字的函式:它們的名字由關鍵字operator和其要定義的運算子共同組成。例如:operator+()。和其他函式一樣,過載的運算子也包含返回型別、引數列表、函式體
函式型別 operator運算子符號(形參列表)
{
對運算子的過載處理
}

二、為什麼要運算子過載

1.運算子過載的作用

它允許你為類的使用者提供一種直覺的介面,允許C/C++的運算子在使用者定義型別(類)上擁有一個使用者定義的意義

2.運算子過載有什麼好處

通過過載類上標準運算子,你可以發掘類的使用者的直覺,使使用者程式所用的語言面向問題而不是機器,使得減少錯誤率

三、哪些運算子能被過載,哪些不能被過載

1.可被過載

C++本身內部運算子大部分可被過載

2.不可被過載

“ .”:類屬關係運算符
”.*”:成員指標運算子
”::”:作用域運算子
“?:”:三目運算子
“sizeof”:測佔位元組運算子(也是關鍵字但主要這個不是函式)

3.通常情況下不應該被過載

逗號,取地址&,邏輯與和邏輯或運算子,因為C++已經定義了這些運算子特殊的含義,這一點 與大多數不同

4.淺析運算子有兩個操作符在作為成員函式時引數只有一個,而作為非成員函式卻迴歸正常有兩個

1.例如”+“號運算子,過載時實際上有兩個引數,但由於過載函式是類中的成員函式,所以有一個引數是隱含著的,運算子函式是用this指標隱含訪問資料成員
C1+C2可以看出C1.operator+(C2);,即看成在C1中用C1的資料成員和引用C2物件的資料成員相加
2.而作為友元就可以堂堂正正有兩個引數了

四、運算子過載如何實現

1.當運算子函式作為成員函式(幾個常見例項)

(一).“+”,“-”,“*”,“/”

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h>
#include <math.h>
#include <cmath>
#include <iostream>
using namespace std;

class A{
public:
    A();
    A(double
_x); A operator+(A &a); A operator-(A &b); A operator*(A &c); A operator/(A &d); void show() { cout<<(double)x<<endl; } private: double x; }; A::A(double _x):x(_x) { } A A::operator+(A &a) { A obj1(1); obj1.x=x+a.x; return A(obj1.x); } A A::operator-(A &a) { A obj1(1); obj1.x=x-a.x; return obj1.x; } A A::operator*(A &a) { A obj1(1); obj1.x=x*a.x; return obj1.x; } A A::operator/(A &a) { A obj1(1); obj1.x=x/a.x; return obj1.x; } int main() { A obj2(1.1); A obj3(2.2); A obj4(0.0); obj4=obj2+obj3; obj4.show(); obj4=obj3-obj2; obj4.show(); obj4=obj2*obj3; obj4.show(); obj4=obj3/obj2; obj4.show(); return 0; }

(二).“=”,“==”,“+=”,“-=”

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h>
#include <math.h>
#include <cmath>
#include <iostream>
using namespace std;

class A{
public:
    A();
    A(int _x);
    A &operator=(A &a);
    bool operator==(A &b);
    A &operator+=(A &c);
    A &operator-=(A &d);
    void show()
    {
        cout<<x<<endl;
    }
private:
    int x;  
};

A::A()
{
    x=0;
}
A::A(int _x):x(_x)
{

}
A &A::operator=(A &a)
{
    x=a.x;
//  return x;
}
bool A::operator==(A &b)
{
    if(x==b.x)
    {
        return 1;
    }
    else 
    {
        return 0;
    }
}
A &A::operator+=(A &c)
{
    x=x+c.x;
    //return A(x);
}
A &A::operator-=(A &d)
{
    x=x-d.x;
    //return A(x);
}

int main()
{
    A obj2(1);
    A obj3(2);
    A obj4;
    obj3+=obj2;
    obj3.show();

    obj3-=obj2;
    obj3.show();

    if(obj3==obj2)
    {
        obj3.show();
    }
    else 
    {
        obj3=obj2;
        obj3.show();
    }
    return 0;
}

(三).”++“,”- -“(a++有參,++a無參)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h>
#include <math.h>
#include <cmath>
#include <iostream>
using namespace std;

class A{
public:
    A();
    A(int _x,int _y);
    A &operator++();
    A &operator++(int);
    A &operator--();
    A &operator--(int);
    friend ostream &operator<<(ostream &output,A &m);
private:
    int x;
    int y;
};
A::A()
{
    x=0;
    y=0;
}
A::A(int _x,int _y):x(_x),y(_y)
{

}
A &A::operator++(int)//返回的是自增之前的值 
{
    A obj1(*this);
    ++(*this);
    return obj1;
}
A &A::operator++()//返回自增之後的值 
{
    x++;
    y++;
    return *this;   
} 
A &A::operator--(int)//返回的是自減之前的值 
{
    A obj1(*this);
    --(*this);
    return obj1;
}
A &A::operator--()//返回自減自之後的值 
{
    x--;
    y--;
    return *this;
} 
ostream &operator<<(ostream &output,A &m)
{
    output<<m.x<<"--"<<m.y<<endl;
    return output;
}
int main()
{
    A obj2(1,1);
    cout<<obj2++;

    A obj3(1,1);
    cout<<++obj3;

    A obj4(1,1);
    cout<<obj4--;

    A obj5(1,1);
    cout<<--obj5;

    return 0;
}

三、當運算子函式作為非成員函式(友元)

(一).友元“+”

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h>
#include <math.h>
#include <cmath>
#include <iostream>
using namespace std;

class A{
public:
    A();
    A(int _x);
    friend A operator+(A &a,A &b);
    void show()
    {
        cout<<x<<endl;
    }
private:
    int x;  
};

A::A()
{
    x=0;
}
A::A(int _x):x(_x)
{

}
A operator+(A &a,A &b)
{
    A obj;
    obj.x=a.x+b.x;
    return obj.x;
}

int main()
{
    A obj2(1);
    A obj3(2);
    A obj4;
    obj4=obj3+obj2;
    obj4.show();
    return 0;
}

(二).“<<”、“>>”(輸入輸出運算子必須是非成員函式)

1.cout << XXX 這種情況是cout在呼叫operator<<而不是XXX在呼叫operator<< .如果你要把operator<<設為成員函式就只能用 XXX << cout 這種形式
2.假設輸入輸出運算子是某個類的成員,則它們也必須是istream或ostream的成員。然而,這兩個類屬於標準庫,並且我們無法給標準庫中的類新增任何成員

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h>
#include <math.h>
#include <cmath>
#include <iostream>
using namespace std;

class A{
public:
    A();
    A(int _x);
    friend ostream &operator<<(ostream &output,A &a);
    friend istream &operator>>(istream &intput,A &b);   
private:
    int x;
};
A::A()
{
    x=0;
}
A::A(int _x):x(_x)
{

}
ostream &operator<<(ostream &output,A &a)
{
    output<<a.x;
    return output;
}
istream &operator>>(istream &input,A &b)
{
    input>>b.x;
    return input;
}

int main()
{
    A obj1;
    cin>>obj1;
    cout<<obj1;
    return 0;
}

相關推薦

C++筆記淺析運算子過載&例項

一、什麼是運算子過載 過載的運算子是具有特殊名字的函式:它們的名字由關鍵字operator和其要定義的運算子共同組成。例如:operator+()。和其他函式一樣,過載的運算子也包含返回型別、引數列表、函式體 函式型別 operator運算子符

C++筆記例項

//定義一個Person類,成員變數age(年齡),和name(姓名),成員函式getName(),getAge(),setAge(int newAge),完成該類測試 #include <iostream> #include "Person.h"

C++:函式過載

5. 函式過載 5.1 概念 函式過載:是函式的一種特殊情況,C++允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的 形參列表(引數個數 或 型別 或 順序)必須不同,常用來處理實現功能類似資料型別不同的問題。 int Add(int left, int r

C++筆記容器(vector)作為函式引數如何傳參

一、大致以下型別 void 函式名( vector< int> obj ); void 函式名( vector< int>* pobj ); void

運算子過載2———流運算子過載函式

流插入運算子 << class Coordinate{ friend ostream& opeartor<<(ostream &out,const Coordinate &coor); public:

C++筆記檔案操作練習流類庫與輸入輸出

1、什麼叫做流?流的提取和插入是指什麼?I/O流在C++中起著怎樣的作用? 解: 流是一種抽象,它負責在資料的生產者和資料的消費者之間建立聯絡,並管理資料的流動,一般意義下的讀操作在流資料抽象中被稱為(從流中)提取,寫操作被稱為(向流中)插入。作

C++筆記三種繼承機制

在實際程式設計中其實公有繼承佔絕大多數,但其他也是都需要了解的 首先要知道子類繼承了基類的所以資料成員和全部函式成員(除了構造、析構器),但它們的繼承方式不同,訪問許可權也會不一樣

C++筆記淺談protected

一個類使用protected關鍵字來宣告是希望與派生類分享但是不想被其他公共訪問使用的成員。所以protected可以看做public和private的中間產物 解析protected

C++拷貝建構函式和運算子過載VC實現

String.h檔案: #ifndef STRING_H #define STRING_H #include <ostream> using namespace std; class String { public: String(){ m_pStr = nullptr

C++菜鳥學習筆記系列12——算術運算子

C++菜鳥學習筆記系列(12) 本期主題:算術運算子 C++語言為我們提供了一套豐富的運算子,並定義了這些運算子用於內建型別的運算物件時所執行的操作。同時當運算物件時類型別時,C++語言也允許我們指定上述運算子的含義(運算子的過載)。 在介紹後面的算術運算子之前

c語言學習筆記8運算子,++,--運算子的用法

摘要:總結了位運算子,++,--運算子的用法,給出了一個使用異或方法巧解面試題的例子,分析了貪心法的規則。 一、位運算子用法     c語言中的位運算子主要有以下幾種:         使用的時候主

C/C++學習筆記2.C++中vector的使用

alt double space ons 說明 info 部分 所有 con 說明:vector是C++中一個非常方便的容器類,它用於存放類型相同的元素,利用成員函數及相關函數可以方便的對元素進行增加或刪除,排序或逆序等等,下面將對這些功能一一敘述。 一.vector的第一

第一章 程序設計和C語言筆記

deb 第一章 bug 總結 warn 標準 war 包含 基本 一、程序和程序語言 程序:完成某項事務所預設的活動方式和活動過程。 程序設計:人們描述計算機要做的工作。 對於工作過程的細節動作描述就是一個“程序”。 在一個程序描述中,總有一批預先假定的“基本動作”,是執行

Cocos2d-x學習筆記淺析動作類CCAction(3)

【1】動作管理類CCActionManager: 動作管理類CCActionManager是一個管理所有動作的單例,可以對動作進行一系列的操作,如:新增動作、刪除動作、暫停動作、重啟動作,這個單例可以通過CCDirector::sharedDirector()->getActionMa

Cocos2d-x學習筆記淺析動作類CCAction(2)

有關CCAction其它動作類簡介: (1)攝像機動作類CCOrbitCamera:  攝像機動作是環繞中心螢幕旋轉所形成的動作,其旋轉座標採用球座標描述。  Create()函式原型CCOrbitCamera* create(fl

Cocos2d-x學習筆記淺析動作類CCAction(1)

Cocos2d-x的動作類CCAction並不是一個在螢幕中顯示的物件,動作必須要依託於CCNode類及其子類的例項才能發揮作用。CCAction繼承於物件類CCObject,有三個子類:有限時間動作、跟隨、移動速度,其中有限時間動作子類CCActionInterVal會形成動畫過程。

Java開發筆記一元運算子的技巧

前面講到賦值運算子的時候,提到“x = x+7”可以被“x += 7”所取代,當然Java程式設計中給某個變數自加7並不常見,常見的是給某變數自加1,就像走臺階,一般都是一級一級臺階地走,犯不著一下子跳上七級臺階。那麼對於變數自加1的情況,既可以寫成“x = x+1”,也可以寫成“x +

機器人作業系統ROS淺析肖軍浩 博士 譯 學習筆記第六章到第十章

第 6 章 啟動檔案  利用啟動檔案一次性配置和執行多個節點 。  roslaunch :這是一個自適應工具,如果啟動多節點時沒有節點管理器執行,它會自動啟動節點管理器;如果已經有一個節點 管理器在執行,則會使用已有的。     利用啟動檔案一次性配

機器人作業系統ROS淺析肖軍浩 博士 譯 學習筆記第一章到第五章

機器人作業系統(ROS)淺析(肖軍浩 博士 譯) 學習筆記 第一章: 第 1 章 緒論 1.1 選擇 ROS 的理由  分散式計算 現代機器人系統往往需要多個計算機同時執行多個 程序,例如:   (1)一些機器人搭載多臺計算機,每臺計算機用於控制機器人的 部分驅動器或感測器

NFS筆記NFS伺服器配置例項

一、NFS伺服器配置例項 實驗拓撲 二、實驗要求及環境 2.1實驗環境 NFS伺服器 IP:192.168.8.5 環境: [[email protected] ~]# uname -a Linux server7.ctos.zu 3.10.0-514.el7.