是否可以从方法调用类构造函数
Can a class constructor be called from a method?
如果我有以下一个类:
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.
但请注意,此处可能与纯复制构造函数存在细微差别,例如,如果您有一些引用成员。
相关文章:
- 在c++中使用向量时,如何调用构造函数和析构函数
- C++:考虑但不调用构造函数的特殊性
- 对象实例化调用构造函数的次数太多
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C ++:通过大括号调用构造函数?
- 不能调用构造函数
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在模板化类的构造函数中调用构造函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 我不明白在这个例子中什么时候调用构造函数
- 调用c++构造函数的不同方法
- 调用构造函数与将内联常量定义为默认参数
- 如何通过 Rust FFI 调用C++构造函数?
- "new"运算符是否总是调用构造函数?
- 无法调用构造函数
- 使用 "()" 调用构造函数不同于"{}"
- 确定是调用构造函数还是强制转换运算符的因素