c++ 运算符重载问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 运算符重载问题相关的知识,希望对你有一定的参考价值。

我写了个加法的重载

运行加法都没错 但返回类的对象后就出错了

源代码 :
头文件struct_big_num.h

class bignum

private:
unsigned int *bit;
public:
bignum(int n)

bit=new unsigned int[n];for(int a=0;a<n;a++)bit[a]=0;

~bignum()

delete[] bit;


void input();
//friend unsigned __int64 operator +(bignum &a,bignum &b);
friend bignum operator +(bignum &a,bignum &b);
;

void bignum::input()

for(int a=0;;a++)

cin>>hex>>bit[a];
if(bit[a]==0)break;



bignum operator+ (bignum &a,bignum &b)

bignum rt(10);
unsigned __int64 c=0;
for(int i=0;i<10;i++)

rt.bit[i]+=c>>32;
c = unsigned __int64(a.bit[i])+b.bit[i];
rt.bit[i]+=c;

//bignum rt(10);
return rt;


主函数:

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

void main()

bignum a(10),b(10),c(10);
a.input();b.input();
//a=b;
c=a+b;


测试数据:
fffffffe
0
00000003
0
具体的加法运算重载的内容 就不用了解了
写的很乱

就告诉你们运算加法重载运算符后结果:(用我给的测试数据)
运算后对象rt的 bit[0]是1 bit[2]是1 其他都为0
返回rt对象就出错了

有个奇怪的问题:
运行返回rt对象后 rt对象的变量bit的值都改变了

需要添加拷贝构造函数和重载赋值操作符,我帮你改了一下,不过好像其它地方还有错,你最好仔细检查一下整个程序。

#include <iostream.h>

class bignum

private:
unsigned int *bit;
//需要添加一个变量记录数组的长度
int num;
public:
bignum(int n)

num = n;
bit=new unsigned int[n];for(int a=0;a<n;a++)bit[a]=0;

bignum(bignum &rhs)

num = rhs.num;
bit=new unsigned int[num];for(int a=0;a<num;a++)bit[a]=rhs.bit[a];

bignum &operator=(bignum &rhs)

if (this == &rhs)
return *this;

num = rhs.num;
delete[] bit;
bit=new unsigned int[num];for(int a=0;a<num;a++)bit[a]=rhs.bit[a];

~bignum()

delete[] bit;


void input();
//friend unsigned __int64 operator +(bignum &a,bignum &b);
friend bignum operator +(bignum &a,bignum &b);
;

void bignum::input()

//bit数组的长度有限,不能随意存放任何个数的数字
for(int a=0;a < num;a++)

cin>>hex>>bit[a];
if(bit[a]==0)break;



bignum operator+ (bignum &a,bignum &b)

bignum rt(10);
unsigned __int64 c=0;
for(int i=0;i<10;i++)

c = unsigned __int64(a.bit[i])+b.bit[i];
rt.bit[i]+=c>>32;
rt.bit[i]+=c;

//bignum rt(10);
return rt;


void main()

bignum a(10),b(10),c(10);
a.input();b.input();
//a=b;
cout << " ok " << endl;
c=a+b;
参考技术A 从我的分析来看,可能死在了赋值上面

bignum& operator = (bignum &b)

//将b的数据拷贝到本对象
//这里我们重新分配内存就不会有问题了,现在编译器提供的相当于 c.bit = (a+b).bit;那(a+b).bit被释放掉了,c.bit就没了,释放会出错
//因为我不知道bit的大小,所以没帮你写这个函数
return *this;


而你没有这样的重载操作符

编译器会帮你生成一个赋值的操作
这个操作的错误是致命的

因为他是按位将+的结果赋值给c
里面包含指针,也就是说c的指针指向了a+b的结果的一个临时对象,这个临时对象释放后,c指向的空间是非法的了

所以会在c的析构时候死掉

建议你完善一下我上面提到的重载

C++重载'--'后缀运算符

【中文标题】C++重载\'--\'后缀运算符【英文标题】:C++ Overloading '--' postfix operatorC++重载'--'后缀运算符 【发布时间】:2012-06-27 03:48:56 【问题描述】:

我正在尝试重载“--”后缀运算符。我有这个代码:

class Counter

 private:
    int count;
 public:
    Counter()
     count = 0; 
    Counter(int c)
     count = c; 

    void setCount(int c)
     count = c; 
    int getCount()
     return count; 

    int operator--()
    
       int temp = count;
       count = count - 1;
       return temp;
    
;

然后在main我有这个函数调用:

 Counter a; 
 a.setCount(5); 
 cout << a-- << endl;

这给了我这个错误: error: no ‘operator--(int)’ declared for postfix ‘--’, trying prefix operator instead

但是当我像这样调用operator-- 函数时,它工作得很好:

 cout << a.operator--() << endl;

什么给了?它应该可以正常工作。

【问题讨论】:

那是因为a.operator--() 等价于--a 【参考方案1】:

对于重载后缀运算符,您需要在函数签名中指定一个虚拟的int 参数,即还应该有一个operator--(int)。您定义的是前缀减量运算符。有关详细信息,请参阅此FAQ。

【讨论】:

如果你(OP)想知道为什么,那是因为他们只是需要一些方法来区分后缀和前缀。 (也许这很明显) 谢谢,我忘记了,谢谢你的回答。 @BenjaminLindley Gotcha,所以这只是一个遵循的规则,有道理,谢谢! @BenjaminLindley 它是定义后缀和前缀版本的标准吗?我的意思是为什么我不能用带前缀版本的 int 参数定义 operator++?【参考方案2】:

后缀运算符将int 作为参数以区别于前缀运算符。

后缀:

int operator--(int)


前缀:

int operator--()


【讨论】:

以上是关于c++ 运算符重载问题的主要内容,如果未能解决你的问题,请参考以下文章

什么是C++重载?

c语言,c++,哪些运算符不能重载?

C++运算符重载

C++:使用类|| 运算符重载友元

C++重载'--'后缀运算符

C++的函数重载