标题:这代码为什么可以运行呢?
取消只看楼主
后卿
Rank: 4
来 自:网络
等 级:业余侠客
帖 子:297
专家分:295
注 册:2016-10-22
结帖率:82.28%
已结贴  问题点数:20 回复次数:2 
这代码为什么可以运行呢?
程序代码:
#include <iostream>
class hint
{
private:
    char* mem[4]{};
public:
    hint(int val);
    operator int();
    void operator =(int f_gold);
    ~hint();
};
hint::hint(int val)
{
    mem[0] = new char;
    mem[1] = new char;
    mem[2] = new char;
    mem[3] = new char;
    *this = val;
}
hint::~hint()
{
    delete mem[0];
    delete mem[1];
    delete mem[2];
    delete mem[3];
}
hint::operator int()
{
    int val{};
    char* read = (char*)&val;
    read[0] = mem[1][0];
    read[1] = mem[3][0];
    read[2] = mem[2][0];
    read[3] = mem[0][0];
    return  val;
}
void hint::operator=(int val)
{
    char* p = (char*)&val;
    mem[0][0] = p[3];
    mem[1][0] = p[0];
    mem[2][0] = p[2];
    mem[3][0] = p[1];
}
int main()
{
    hint gold{ 100 };
    while (1)
    {
        std::cout << "gold的数量为===>" <<gold;
        system("pause");
        gold = gold + 100;
    }
    system("pause");
}

这代码我脑补了一下过程
最开始,初始化对象gold赋值100,调用了hint(int val),然后hint()调用了operator=(int val),把100拆分赋值给了gold
当<<gold时,进行了类型转换,把gold转成了100进行输出
下面的gold=gold+100
有两种可能性
1.先进行gold+100,将gold转换成了int类型,此时gold成了一个未知的int值,加上100后,赋值给gold
通过下面的代码
程序代码:
void hint::operator=(int val)
{
    char* p = (char*)&val;
    mem[0][0] = p[3];
    mem[1][0] = p[0];
    mem[2][0] = p[2];
    mem[3][0] = p[1];
}

又将这个。。这里说不清了
2.将100转成了hint类型,调用了hint(int val)和operator=(int val),
程序代码:
void hint::operator=(int val)
{
    char* p = (char*)&val;
    mem[0][0] = p[3];
    mem[1][0] = p[0];
    mem[2][0] = p[2];
    mem[3][0] = p[1];
}

又把100打乱了,然后两个hint类型相加、
从以上两点来看,这个程序根本不可能成功啊,为什么它能运行呢??
它的结果反而正是100,200,300,
真的应了这张图了
搜索更多相关主题的帖子: operator char int 代码 read 
2023-04-27 21:49
后卿
Rank: 4
来 自:网络
等 级:业余侠客
帖 子:297
专家分:295
注 册:2016-10-22
得分:0 
回复 2楼 rjsp
理解了,非常感谢大佬
2023-04-28 20:59
后卿
Rank: 4
来 自:网络
等 级:业余侠客
帖 子:297
专家分:295
注 册:2016-10-22
得分:0 
回复 2楼 rjsp
请问,这段代码的默认复制构造函数是什么样的呢
他们说这段代码,再
hint gold{ 100 };
hint gold1=gold;

这样运行就会出错,是因为复制构造导致了gold和gold1拥有同样内存的mem
而析构却有两次,导致出错
我试了一下吗,并不会出错,奇怪,我的为什么不出错呢?
另外,如果我在后面继续添加代码
gold1=200;

这样,就会调用hint::hint(int val)
这样,就能重新给mem开辟内存,这样的话是不是又避免了这个错误呢

[此贴子已经被作者于2023-4-29 16:30编辑过]

2023-04-29 16:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-512066-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022277 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved