这代码为什么可以运行呢?
程序代码:
#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,
真的应了这张图了