调用默认构造函数

Moh*_*taq 0 c++

这个程序给出了正确的输出,但我无法理解.如何在声明对象时调用默认构造函数?

#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)

jua*_*nza 5

此构造函数具有默认参数:

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)

另外,阅读三条规则以避免双重删除.然后学习编码而不用指向动态分配对象的原始指针.