Int类的运算符重载

时间:2015-08-25 12:27:21

标签: c++ class int operator-overloading

我正在编写一个简单的Int类并使用运算符重载来使对象的行为方式与“int”类似。我将整个程序分成3个文件,1)头文件:包含类声明2)所有运算符重载函数的定义3)包含main的测试文件 这三个在这里以相同的顺序提到

#include <iostream>
using namespace std;

class Int
{
private:
    int i;
public:
    Int(): i(0) { }
    Int(int in) : i(in) { }
    void show() const
    {
        cout<<"value: "<<i<<endl;
    }
    Int operator +(const Int&) const;
    Int operator -(const Int&) const;
    Int operator *(const Int&) const;
    Int operator /(const Int&) const;
    //Int add(const Int&) const; 
};

功能定义

#include <iostream>
#include <climits>
#include <cassert>
#include "int.h"
using namespace std;
typedef unsigned long long ull;

Int Int::operator +(const Int &i1) const
{

    ull result;
    result = i+ i1.i;
    //cout<< result<<'\n';
    if (result>INT_MAX)
    {
        cout<<"Out of int range.\n";
        //assert(0);
    }
    else
        return Int(int(result));
}

Int Int::operator -(const Int &i1) const
{
    //typedef unsigned long long ull;
    ull result;
    result = i - i1.i;
    //cout<< result<<'\n';
    if (result < INT_MIN)
    {
        cout<<"Out of int range.\n";
        //assert(0);
    }
    else
        return Int(int(result));
}

Int Int::operator *(const Int &i1) const
{
    //typedef unsigned long long ull;
    ull result;
    result = i* i1.i;
    //cout<< result<<'\n';
    if (result >INT_MAX)
    {
        cout<<"Out of int range.\n";
        //assert(0);
    }
    else
        return Int(int(result));
}

Int Int::operator /(const Int &i1) const
{
    //typedef unsigned long long ull;
    ull result;
    result = i/ i1.i;
    //cout<< result<<'\n';
    if (result < INT_MIN)
    {
        cout<<"Out of int range.\n";
        //assert(0);
    }
    else
        return Int(int(result));
}

用main编译测试程序:

#include <iostream>
#include "int.h"

int main(int argc, char const *argv[])
{
    Int i1;
    Int i2(4);Int i3(2);
    i1 = i2 + i3;
    i1.show();
    i1 = i2 - i3;
    i1.show();
    i1 = i2 * i3;
    i1.show();
    i1 = i2 / i3;
    i1.show();
    return 0;
}

预期输出为:

Value : 6,
Value : 2,
value : 8
Value : 2.

但是我得到的输出是这样的:

value: 6
Out of int range.
value: 6
value: 8
Out of int range.
value: 8

我尝试了很多我出错但无法找到的地方。 任何领导都会有很大的帮助。

3 个答案:

答案 0 :(得分:3)

问题是无符号值与有符号值的比较:

if (result < INT_MIN)

更重要的是,当你想表现得像签名unsigned long long时,为什么你希望结果为int

我理解你为什么要使用long long进行范围检查int操作(虽然这样做并不是完全可移植的)但是unsigned的选择似乎只是一个错误。

答案 1 :(得分:0)

如果您打印cout<<"Out of int range.\n";,则不会返回任何值。

此外,您应该使用longlong long作为类型。 int可能不是32位。 使用unsigned类型会产生错误的结果(想想-1 * -1)

你需要的是这样的东西:

#include <iostream>
using namespace std;

class Int
{
private:
    long i;
public:
    Int() : i(0) { }
    Int(long in) : i(in) { }
    Int(const Int& other) :i(other.i) {}

    void show() const
    {
        cout << "value: " << i << endl;
    }


    Int& operator+=(const Int& other) 
    {
        long long result = i;
        result += other.i;
        if (result >= LONG_MIN && result <= LONG_MAX)
        {
            i = result;
        }
        else
        {
            cout << "Out of int range." << endl;
        }
        return *this;
    }

    Int operator-=(const Int& other) {
        long long result = i;
        result -= other.i;
        if (result >= LONG_MIN && result <= LONG_MAX)
        {
            i = result;
        }
        else
        {
            cout << "Out of int range." << endl;
        }
        return *this;
    }

    Int operator*=(const Int& other) 
    {
        long long result = i;
        result *= other.i;
        if (result >= LONG_MIN && result <= LONG_MAX)
        {
            i = result;
        }
        else
        {
            cout << "Out of int range." << endl;
        }
        return *this;
    }

    Int operator/=(const Int& other) 
    {
        long long result = i;
        result /= other.i;
        if (result >= LONG_MIN && result <= LONG_MAX)
        {
            i = result;
        }
        else
        {
            cout << "Out of int range." << endl;
        }
        return *this;
    }

    Int operator+(const Int& other) const
    {
        return Int(*this) += other;
    };

    Int operator-(const Int& other) const
    {
        return Int(*this) -= other;
    };

    Int operator*(const Int& other) const
    {
        return Int(*this) *= other;
    };

    Int operator/(const Int& other) const
    {
        return Int(*this) /= other;
    };
};

答案 2 :(得分:0)

我发现您的代码存在两个问题。

首先,将无符号值(结果)与有符号常量(INT_MIN)进行比较。

其次,如果你注释掉“断言”。在越界检查中,您仍必须从函数返回一个值。有些编译器可能会用这样的事情警告你:&#34;控制到达非空函数的末尾。&#34;这可能不会立即显示,但是当您开始捕获错误时,您的程序很可能会崩溃。