hongdouhong 发表于 2022-8-12 21:30:24

<<重载类对象++

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;
像这样重载<<第一次能让他显示对象原来的值,第二次显示++之后的值

人造人 发表于 2022-8-12 22:04:33

提问题之前先把代码格式化好

hongdouhong 发表于 2022-8-13 13:32:50

#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输出,但是不知道怎样释放这个堆内存了,或者有别的更好的办法

lhgzbxhz 发表于 2022-8-13 16:52:15

这个视频教程不大靠谱啊。。。按照《More Effective C++》中的建议,后置++应当返回const XXX类型,这里他没有加const。你那个XXX&就更离谱了。
试想一下,如果对一个int型变量n连续调用数次后置++操作结果会如何?
n++++++
表面看来,n好像被累加了三次;但实际上,第二次++作用在第一次++的返回值——一个临时对象上,导致n实际上被累加了一次;而对临时变量的累加是没有意义的。所以连续使用后置++是错误的——事实上,这种代码过不了编译。
所以说,我们为自己的类型重载后置++时也要遵循类似守则,办法便是返回const XXX型的值。像他那样的写法会导致连续后置++能通过编译,但没有实际效果。这样是不对的。

hongdouhong 发表于 2022-8-14 21:38:44

你知道那个是我的吗,我把他弄在了堆里,现在的问题是不知道怎样释放他,他的那个应该是有点问题,返回的是值,所以在主函数中要求定义一个去接收在显示,我感觉也是麻烦,他的视频其实还有后半段,对象哪里加了个static,就安全返回了,也不用在接收了,其实这个问题现在我不多关心,因为我已经知道他的原理了,我关系的是我的那个,我的那个运行的效果感觉比较接近,但是也知道那个堆没有delete,肯定是有问题的,但是学习吗,现在感觉很开心,自己在制造问题,你看看能不能帮我解决一下,能不能在哪里释放,在里面释放肯定就不行了,在外面呢,目前我找不到怎么释放
页: [1]
查看完整版本: <<重载类对象++