做为C#开发人员,我习惯于遍历构造函数: ide
class Test { public Test() { DoSomething(); } public Test(int count) : this() { DoSomethingWithCount(count); } public Test(int count, string name) : this(count) { DoSomethingWithName(name); } }
有没有办法在C ++中作到这一点? 函数
我尝试调用类名称并使用'this'关键字,但均失败。 this
我相信您能够从构造函数中调用构造函数。 它将编译并运行。 我最近看到有人这样作,它能够在Windows和Linux上运行。 spa
它只是不作您想要的。 内部构造函数将构造一个临时本地对象,一旦外部构造函数返回,该本地对象将被删除。 它们也必须是不一样的构造函数,不然您将建立递归调用。 code
参考: https : //isocpp.org/wiki/faq/ctors#init-methods 对象
调用构造函数时,它其实是从堆栈或堆中分配内存。 所以,在另外一个构造函数中调用一个构造函数将建立一个本地副本。 所以,咱们正在修改另外一个对象,而不是咱们正在关注的对象。 递归
我建议使用private friend
方法,该方法实现构造函数的应用程序逻辑,并被各类构造函数调用。 这是一个例子: 内存
假设咱们有一个名为StreamArrayReader
的类, StreamArrayReader
包含一些私有字段: 开发
private: istream * in; // More private fields
咱们要定义两个构造函数: get
public: StreamArrayReader(istream * in_stream); StreamArrayReader(char * filepath); // More constructors...
第二个只使用第一个(固然,咱们不想重复前一个的实现)。 理想状况下,您但愿执行如下操做:
StreamArrayReader::StreamArrayReader(istream * in_stream){ // Implementation } StreamArrayReader::StreamArrayReader(char * filepath) { ifstream instream; instream.open(filepath); StreamArrayReader(&instream); instream.close(); }
可是,这在C ++中是不容许的。 所以,咱们能够以下定义一个私有的方法,该方法实现第一个构造函数应该执行的操做:
private: friend void init_stream_array_reader(StreamArrayReader *o, istream * is);
如今,此方法(由于它是一个朋友)能够访问o
的私有字段。 而后,第一个构造函数变为:
StreamArrayReader::StreamArrayReader(istream * is) { init_stream_array_reader(this, is); }
请注意,这不会为新建立的副本建立多个副本。 第二个变为:
StreamArrayReader::StreamArrayReader(char * filepath) { ifstream instream; instream.open(filepath); init_stream_array_reader(this, &instream); instream.close(); }
也就是说, 不是让一个构造函数调用另外一个构造函数 , 而是两个都称为私人朋友!
若是我正确理解了您的问题,那么您在问是否能够在C ++中调用多个构造函数?
若是这是您要寻找的,那么不会-那是不可能的。
您固然能够有多个构造函数,每一个构造函数都有惟一的参数签名,而后在实例化一个新对象时调用所需的构造函数。
您甚至能够拥有一个带有默认参数的构造函数。
可是您可能没有多个构造函数,而后分别调用它们。
不,在C ++中,您不能从构造函数调用构造函数。 正如沃伦指出的,您能够作的是:
请注意,在第一种状况下,不能经过从另外一个构造函数调用另外一个代码来减小代码重复。 固然,您能够有一个单独的私有/受保护的方法来执行全部初始化,并让构造函数主要处理参数处理。