是否可以从方法调用类构造函数

Can a class constructor be called from a method?

本文关键字:调用 构造函数 方法 是否      更新时间:2023-10-16

如果我有以下一个类:

class A {
private:
    int *x;
public:
    A() { x = new int; *(A::x) = 0; }
    A(const int *y) { x = new int; *(A::x) = *y; }
    ~A() { delete x; }
    void operator = (const int *y) { A(y); }
};
int main() {
    A a;
    int y = 3;
    a = &y;
    return 0;
}

我希望赋值语句调用 = 方法,该方法又将通过调用相应的构造函数来设置 x 成员。但是,似乎在分配之后,x的值仍然NULL并且y的值没有分配。

那么,从方法调用构造函数是定义的操作吗?如果是这样,我的代码中会遗漏什么?使用调试器,我验证了构造函数实际上是被调用的,只是一旦流从构造函数返回 = 方法,复制的值就不会保留。

No.构造函数用于创建对象,不能在现有对象上再次调用它们。

对象开始其生存期一次

,结束其生存期(最多(一次。你想做的就像出生两次,这听起来很混乱。

当你像以前一样调用构造函数时,它被解释为一个表达式,它创建一个类 A 的匿名对象。 此匿名对象在创建它的语句末尾销毁。 所以什么也没发生。

我建议你做以下改变:

class A {
private:
    int *x;
public:
    A() { x = new int; *x = 0; }    // No need of A:: 
    A(const int *y) { x = new int; *x = *y; }
    ~A() { delete x; }
    A& operator= (const int *y) { *x=*y; return *this;  } // x was already iniatilized, so we keep it
};

但实际上,您在这里不需要指针,因此您可以进一步简化:

class A {
private:
    int x;
public:
    A() :x(0) { }  
    A(int y) : x(y) { }
    ~A() { }
    A& operator= (const int y) { x=y; return *this;  } 
};

编辑:

在评论中,您解释说您需要指针,并且您的目的是避免代码重复。 然后我向你提出另一种选择。

如前所述,您不能在 operator=() 中调用构造函数。 但根据标准,您可以做相反的事情(第 12.7/4 节:成员函数,包括虚函数,可以在构建或销毁期间调用(。 然后,您可以将其与委托构造函数机制结合使用:

A(const int *y) : A() { *this = y; }   // calls default constructor and then uses assignment to do copy. 

但请注意,此处可能与纯复制构造函数存在细微差别,例如,如果您有一些引用成员。