Life of xhu

About

运算符重载以及友元的实际应用

Mar 29, 2014

  |   #C++

前几天看了一下C++的运算符重载部分,当然还包括后面的友元,感觉就这样干看着不实际写一下没什么印象,说干就干,立马拿前几天AC的一道HOJ水题练手。

在实际写的过程中,感觉到C++引入string字符串类型变量真是比C的char*方便了好多,虽然内在的也是指针实现,但是在写代码的过程中,特别是引用某个字符串的时候,使用变量名明显比使用指针简单,而且更不容易出错。

上代码:

//HOJ 1474
//使用运算符重载和友元实现以前的函数的功能
#include <iostream>
#include <string>
using namespace std;

//声明存储斐波那契数的类
class Str{
    public:
        string data;
        //重载的两个后面需要用到的操作符
        Str operator+(Str s);
        bool operator>(string str);
        //声明友元,因为后面有string > Str的操作
        friend bool operator>(string str, Str s);
};

//重载+运算符,参数为一个Str类型的对象
Str Str::operator+(Str s){
    int len1 = data.length(), len2 = s.data.length(), plus = 0, tmp;
    Str result;
    result.data = "";
    if(len1 > len2){
        for(int i = 0; i < len1 - len2; i++)
            s.data = "0" + s.data;
    }else if(len2 > len1){
        for(int i = 0; i < len2 - len1; i++)
            data = "0" + data;
        len1 = len2;
    }
    for(int i = len1 - 1; i >= 0; i--){
        tmp = plus ? (int)data[i] + (int)s.data[i] - (int)'0' * 2 + 1 : (int)data[i] + (int)s.data[i] - (int)'0' * 2;
        if(tmp > 9){
            result.data = (char)(tmp - 10 + '0') + result.data;
            plus = 1;
        }else{
            result.data = (char)(tmp + '0') + result.data;
            plus = 0;
        }
    }
    if(plus)
        result.data = "1" + result.data;
    return result;
}

//重载>运算符,参数为一个Str类型的对象
bool Str::operator>(string str){
    if(data.length() > str.length()){
        return true;
    }else if(data.length() < str.length()){
        return false;
    }else{
        for(int i = 0; i < data.length(); i++){
            if(data[i] > str[i])
                return true;
            else if(str[i] > data[i])
                return false;
        }
    }
    return true;
}

//友元,注意因为友元不是成员函数,所有用不到作用域操作符::
bool operator>(string str, Str s){
    if(str.length() > s.data.length()){
        return true;
    }else if(str.length() < s.data.length()){
        return false;
    }else{
        for(int i = 0; i < str.length(); i++){
            if(str[i] > s.data[i])
                return true;
            else if(s.data[i] > str[i])
                return false;
        }
    }
    return true;
}

int main(){
    string a, b;
    Str nums[500];
    nums[0].data = "1";
    nums[1].data = "2";
    for(int i = 2; i < 500; i++)
        nums[i] = nums[i - 1] + nums[i - 2];     //这里使用的重载的+操作符
    while(cin >> a >> b && !(a == "0" && b == "0")){
        int count = 0;
        for(int i = 0; i < 500; i++){
            if(nums[i] > a){       //这里使用的是重载的>操作符
                if(b > nums[i])    //这里使用的是友元
                    count++;
                else
                    break;
            }
        }
        cout << count << endl;
    }
}