此程序提供正确的输出,但我无法理解。如何在声明对象时调用默认构造函数?
#include <iostream>
using namespace std;
class GuessMe {
private:
int *p;
public:
GuessMe(int x=0)
{
p = new int;
}
int GetX()
{
return *p;
}
void SetX(int x)
{
*p = x;
}
~GuessMe()
{
delete p;
}
};
int main() {
GuessMe g1;
g1.SetX(10);
GuessMe g2(g1);
cout << g2.GetX() << endl;
return 0;
}
答案 0 :(得分:5)
此构造函数具有默认参数:
GuessMe(int x=0)
这意味着当默认构造GuessMe
时,就好像它是使用值为0
的参数调用的。请注意,构造函数参数不用于代码中的任何内容。另请注意,p
设置为指向未初始化的整数:
p = new int;
所以在调用GetX()
之前调用SetX()
会产生未定义的行为。您希望使用x
的值来设置p
:
GuessMe(int x=0)
{
p = new int(x);
}
或者,使用初始化而不是赋值,
GuessMe(int x=0) : p(new int(x))
{
}
另外,请阅读the rule of three以避免双重删除。然后学习编码而不用指向动态分配对象的原始指针。