1. 程式人生 > 其它 >C++第05課 運算子過載

C++第05課 運算子過載

1.基本過載

+ 友元函式的方式實現過載
+ 類成員函式的方式實現過載

過載函式的基本語法: 過載函式的返回值型別 operator 要過載的運算子(引數){函式體;};

引數個數:

+ 友元過載 過載函式的引數個數等於運算子的運算元
+ 類成員函式過載,過載函式引數個數是等於運算子的運算元-1

class MM {
    //友元過載+
    friend MM operator+(MM obj1, MM obj2);
public:
    MM() {}
    MM(string name,int age):name(name),age(age){}
    //類的成員函式過載-
MM operator-(MM obj); void print() { cout << name << "\t" << age << endl; } protected: string name; int age; }; MM operator+(MM obj1, MM obj2) { return MM(obj1.name + obj2.name, obj1.age + obj2.age); } MM MM::operator-(MM obj) { return MM(this
->name, this->age - obj.age); } int main() { MM mm("小可愛", 14); MM mm1("小寶貝", 18); MM obj = mm + mm1; //等價於:MM obj=operator+(mm+mm1); obj.print(); //小可愛小寶貝 32 MM obj1 = mm1 - mm; //等價於:MM obj=mm1.operator-(mm); obj1.print(); //小寶貝 4 //cout << obj << endl;
return 0; }

注意項:

  1.習慣上,單目採用類的成員函式過載,雙目採用友元方式過載

  2.一般在過載運算子的時候,儘量不要違背本意(加法就是加法,不要把加法過載減法的效果)

  3.有些運算子不能過載: ?: . :: # .* ->*

  4.有些運算子必須採用類成員函式過載:() [] =

  5.流過載必須採用友元過載

2.特殊過載

+ ++ -- 前置和後置的一個過載
+ 後置的++ 或者-- 一定要加個int作為標記

class Num {
public:
    Num(int num=0) :num(num) {}
    void print()
    {
        cout << num << endl;
    }
    //前置++
    Num operator++();
    //後置++
    Num operator++(int);
protected:
    int num;
};
Num Num::operator++()
{
    return Num(this->num++);
}
Num Num::operator++(int)
{
    return Num(this->num++);
}

int main()
{
    Num a(1);
    Num b = a++;
    b.print();
    Num c = ++a;
    c.print();
    return 0;
}

+ 流運算子過載
+ 流物件: ostream : 輸出流 cout就是ostream類的物件 istream:輸入流, cin就是istream類的物件
+ 流過載 ,必須採用的引用的方式,必須採用友元的方式

class MM {
    //友元實現
    friend ostream& operator<<(ostream& out, MM& mm);
    friend istream& operator>>(istream& in,MM& mm);
public:
    MM() {}
    MM(string name, int age) :name(name), age(age) {}
    //類的成員函式實現
protected:
    string name;
    int age;
};
ostream& operator<<(ostream& out, MM& mm)
{
    out << mm.name << "\t" << mm.age;
    return out;
}
istream& operator>>(istream& in, MM& mm) {
    in >> mm.name >> mm.age;
    return in;
}
int main()
{
    MM mm;
    cin >> mm;                //cin:istream
    cout << mm << endl;        //cout:ostream
    return 0;
}

+ 字尾的過載(文字過載)

//字尾過載    文字過載
unsigned long long operator"" _h(unsigned long long num)
{
    return num * 60 * 60;
}
int main()
{
    int a = 1_h;
    cout << a << endl;    //3600
    return 0;
}

3.隱式轉換

實現物件與其他型別的一個隱式轉換

基本語法: operator 要轉的型別() { return 返回相應型別的資料;};

//隱式轉換
class GG {
public:
    GG() {}
    GG(string name, int age) :name(name), age(age) {}
    //基本語法: operator 要轉的型別() { return  返回相應型別的資料;};
    operator int()
    {
        return this->age;
    }
protected:
    string name;
    int age;
};
int main()
{
    GG gg("小可愛", 19);
    int num = gg;    //自定義型別不存在賦值的直接隱式轉換,需要自己寫
    cout << num << endl;
    return 0;
}