<<重载类对象++
class Data{
int a;
int b;
public:
Data(){
a=0,b=0}
Data(int a,int b){
this->a=a;
this->b=b;}
};
int main(){
Data data(10,20);
cout<<data++<<endl;
cout<<data<<endl;
system("pause");
return 0;
像这样重载<<第一次能让他显示对象原来的值,第二次显示++之后的值 提问题之前先把代码格式化好
#include<iostream>
#include<string>
using namespace std;
class Data
{
friend ostream& operator<<(ostream& out, Data& ob);
private:
int mA;
int mB;
public:
Data()
{
mA = 0;
mB = 0;
}
Data(int a, int b):mA(a),mB(b){}
~Data()
{
}
void printData()
{
cout << "mA=" << mA << "\t" << "mB=" << mB << endl;
}
#if 0
Data operator++(int)//后置++千峰原文
{//在主函数中要定义一个对象接受这个没有加引用的值
Data old = *this;
this->mA++;
this->mB++;
return old;
}
#endif
#if 1
Data& operator++(int)//自己想的后置++
{//注意这两个函数重载的不同一个返回的是引用,一个没有引用
Data* data = new Data;
data->mA = this->mA;
data->mB = this->mB;
mA++;
mB++;
return *data;
}
#endif
};
ostream& operator<<(ostream& out, Data& ob)
{
cout << "mA=" << ob.mA << "\t" << "mB=" << ob.mB << endl;
return out;
}
void test()
{
Data data(10, 20);
cout << data;
cout << data++;
cout << data;
}
int main()
{
test();
system("pause");
return 0;
}//现在是从vs中把代码拷贝过来的,里面的重载后置++运算符一个是别人的视频教程,但是在主函数中要有一个对象接收,有一个我把对象定义在堆里面了,可以直接用cout输出,但是不知道怎样释放这个堆内存了,或者有别的更好的办法 这个视频教程不大靠谱啊。。。按照《More Effective C++》中的建议,后置++应当返回const XXX类型,这里他没有加const。你那个XXX&就更离谱了。
试想一下,如果对一个int型变量n连续调用数次后置++操作结果会如何?
n++++++
表面看来,n好像被累加了三次;但实际上,第二次++作用在第一次++的返回值——一个临时对象上,导致n实际上被累加了一次;而对临时变量的累加是没有意义的。所以连续使用后置++是错误的——事实上,这种代码过不了编译。
所以说,我们为自己的类型重载后置++时也要遵循类似守则,办法便是返回const XXX型的值。像他那样的写法会导致连续后置++能通过编译,但没有实际效果。这样是不对的。 你知道那个是我的吗,我把他弄在了堆里,现在的问题是不知道怎样释放他,他的那个应该是有点问题,返回的是值,所以在主函数中要求定义一个去接收在显示,我感觉也是麻烦,他的视频其实还有后半段,对象哪里加了个static,就安全返回了,也不用在接收了,其实这个问题现在我不多关心,因为我已经知道他的原理了,我关系的是我的那个,我的那个运行的效果感觉比较接近,但是也知道那个堆没有delete,肯定是有问题的,但是学习吗,现在感觉很开心,自己在制造问题,你看看能不能帮我解决一下,能不能在哪里释放,在里面释放肯定就不行了,在外面呢,目前我找不到怎么释放
页:
[1]