我能够在C ++中从另外一个构造函数调用构造函数(进行构造函数连接)吗?

做为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


#1楼

我相信您能够从构造函数中调用构造函数。 它将编译并运行。 我最近看到有人这样作,它能够在Windows和Linux上运行。 spa

它只是不作您想要的。 内部构造函数将构造一个临时本地对象,一旦外部构造函数返回,该本地对象将被删除。 它们也必须是不一样的构造函数,不然您将建立递归调用。 code

参考: https : //isocpp.org/wiki/faq/ctors#init-methods 对象


#2楼

调用构造函数时,它其实是从堆栈或堆中分配内存。 所以,在另外一个构造函数中调用一个构造函数将建立一个本地副本。 所以,咱们正在修改另外一个对象,而不是咱们正在关注的对象。 递归


#3楼

我建议使用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();
}

也就是说, 不是让一个构造函数调用另外一个构造函数而是两个都称为私人朋友!


#4楼

若是我正确理解了您的问题,那么您在问是否能够在C ++中调用多个构造函数?

若是这是您要寻找的,那么不会-那是不可能的。

您固然能够有多个构造函数,每一个构造函数都有惟一的参数签名,而后在实例化一个新对象时调用所需的构造函数。

您甚至能够拥有一个带有默认参数的构造函数。

可是您可能没有多个构造函数,而后分别调用它们。


#5楼

不,在C ++中,您不能从构造函数调用构造函数。 正如沃伦指出的,您能够作的是:

  • 使用不一样的签名重载构造函数
  • 在参数上使用默认值,以使“更简单”的版本可用

请注意,在第一种状况下,不能经过从另外一个构造函数调用另外一个代码来减小代码重复。 固然,您能够有一个单独的私有/受保护的方法来执行全部初始化,并让构造函数主要处理参数处理。

相关文章
相关标签/搜索