如何从另一个构造函数调用 C++ 类构造函数 [重复]
Posted
技术标签:
【中文标题】如何从另一个构造函数调用 C++ 类构造函数 [重复]【英文标题】:How to call a C++ class Constructor from another Constructor [duplicate] 【发布时间】:2017-01-05 01:23:45 【问题描述】:我正在尝试在 C++ 中创建一个需要多个对象构造函数的对象。说Foo()
和Foo(int)
,其中Foo(int)
然后调用Foo()
。简化代码如下:
#include <iostream>
class Foo
private:
int iX;
public:
void printX(string sLabel)
cout << sLabel << " : " << " Foo::iX = " << Foo::iX << endl;
;
void setX(int iX)
Foo::iX = iX;
Foo::printX("setX(void) Method");
;
Foo()
Foo::iX = 1;
Foo::printX("Foo(void) Constructor");
;
Foo(int iX)
Foo::setX(iX);
Foo::printX("Foo(int) Constructor");
Foo::Foo();
Foo::printX("Foo(int) Constructor");
;
;
int main( int argc, char** argv )
Foo bar(2);
return 0;
输出是
setX(void) Method : Foo::iX = 2
Foo(int) Constructor : Foo::iX = 2
Foo(void) Constructor : Foo::iX = 1
Foo(int) Constructor : Foo::iX = 2
结果表明setX
方法按预期工作。 Foo::iX
等于该函数范围内外的2
。
但是,当从 Foo(int)
构造函数中调用 Foo(void)
构造函数时,Foo::iX
仅在该构造函数中保持等于 1
。一旦退出该方法,它就会恢复为2
。
所以我的问题是 2 倍的:
-
为什么 C++ 会出现这种行为(在没有赋值的情况下,不能从另一个构造函数中调用构造函数)?
如何创建多个构造函数签名,但又没有多余的重复代码做同样的事情?
【问题讨论】:
了解委托构造函数。还阅读了成员初始化。例如here. 【参考方案1】:Foo::Foo(int)
中的Foo::Foo();
未按预期调用当前对象的默认构造函数。它只是构造了一个临时的Foo
,与当前对象无关。
您可以像这样使用delegating constructor(C++11 起):
Foo(int iX) : Foo()
// ...
;
请注意,Foo::Foo()
将在 Foo::Foo(int)
的主体之前被调用。
避免重复代码的另一种方法是使用setX()
作为常见的初始化方法。 (如果不合适,也可以制作一个新的。)
Foo()
setX(1);
// ...
;
Foo(int iX)
setX(iX);
// ...
;
【讨论】:
@songyuanyaho : 你如何定义临时的?在一般意义上或更技术意义上?请解释。谢谢。 @WoodMath 在更技术意义上。默认构造函数被显式调用以创建一个临时对象,该对象立即被丢弃。【参考方案2】:如果您能够使用 C++11 编译器,则可以使用委托构造函数。
// Use Foo(int) to initialize the object when default constructor is used.
Foo() : Foo(1)
【讨论】:
【参考方案3】:可以从另一个构造函数中调用构造函数。您只是忘记分配返回值。
*this = Foo::Foo();
对于问题2,您需要delegating constructors。
Foo(int iX) : Foo()
...
【讨论】:
*this = Foo:Foo()
仅在分配可以处理部分构造的对象时才有效。 (所有成员和基都将被正确构造,但构造函数尚未完成,因此对象本身的生命周期尚未开始。)以上是关于如何从另一个构造函数调用 C++ 类构造函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章