【发布时间】:2014-01-07 07:54:17
【问题描述】:
首先,我想了解为什么我在输出中得到第 (5) 行和第 (6) 行,而不仅仅是其中一个。
其次,为什么mc1.print() 打印有效值? _ms 不应该指向 mc1(&MyStruct(mc2)) 之后的未定义位置,因为创建 MyStruct 的位置(在 cast 运算符中)已经展开?
struct MyStruct
{
int w;
int h;
MyStruct()
{
cout << "MyStruct" << endl;
}
~MyStruct()
{
cout << "~MyStruct: w=" << w << "h=" << h << endl;;
}
};
class MyClass1
{
public:
MyClass1(MyStruct* ms)
:_ms(ms)
{
cout << "MyClass1" << endl;;
}
~MyClass1()
{
cout << "~MyClass1" << endl;
}
void print()
{
cout << "print: w=" << _ms->w << "h=" << _ms->h << endl;
}
MyStruct* _ms;
};
class MyClass2
{
public:
MyClass2()
{
cout << "MyClass2" << endl;
}
~MyClass2()
{
cout << "~MyClass2" << endl;
}
operator MyStruct()
{
MyStruct ms;
ms.h = 11;
ms.w = 22;;
return ms;
}
};
int main()
{
MyClass2 mc2;
MyClass1 mc1(&MyStruct(mc2));
mc1.print();
return 0;
}
输出是
1. MyClass2
2. MyStruct
3. ~MyStruct: w=22h=11
4. MyClass1
5. ~MyStruct: w=22h=11
6. ~MyStruct: w=22h=11
7. print: w=22h=11
【问题讨论】:
-
您所做的事情会导致未定义的行为,因为您取消引用指向
print中的临时值的指针。它可能看起来有效,也可能无效。一切皆有可能。 -
考虑复制构造函数。
标签: c++ operator-overloading destructor