这个程序给出了正确的输出,但我无法理解.如何在声明对象时调用默认构造函数?
#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;
}
Run Code Online (Sandbox Code Playgroud)
此构造函数具有默认参数:
GuessMe(int x=0)
Run Code Online (Sandbox Code Playgroud)
这意味着当a GuessMe是默认构造时,就好像它是用带有值的参数调用的一样0.请注意,构造函数参数不用于代码中的任何内容.另请注意,p此处设置为指向未初始化的整数:
p = new int;
Run Code Online (Sandbox Code Playgroud)
所以在调用GetX()之前调用SetX()会产生未定义的行为.可以设想您要使用以下值x来设置p:
GuessMe(int x=0)
{
p = new int(x);
}
Run Code Online (Sandbox Code Playgroud)
或者,使用初始化而不是赋值,
GuessMe(int x=0) : p(new int(x))
{
}
Run Code Online (Sandbox Code Playgroud)
另外,阅读三条规则以避免双重删除.然后学习编码而不用指向动态分配对象的原始指针.
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |