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++ 运算符重载问题的主要内容,如果未能解决你的问题,请参考以下文章