调用默认构造函数

时间:2015-04-21 15:09:14

标签: 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;
}

1 个答案:

答案 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以避免双重删除。然后学习编码而不用指向动态分配对象的原始指针。