Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;C中的构造函数初始化列表替代方案? 在C++中,类构造函数可以使用初始化列表,我知道这是一个通过避免额外的赋值来改进的性能特征。因此,我想知道,在C中是否有类似的方法可以实现基本相同的功能,将结构初始化为C++类构造函数? 我对C++中的特征如何工作有点不清楚,因此对该主题的任何附加信息也会被理解。C没有任何类似的特性,但是,由于C还没有构造函数,所以不存在不必要的分配危险。_C++_C_Constructor_Initialization - Fatal编程技术网

C++;C中的构造函数初始化列表替代方案? 在C++中,类构造函数可以使用初始化列表,我知道这是一个通过避免额外的赋值来改进的性能特征。因此,我想知道,在C中是否有类似的方法可以实现基本相同的功能,将结构初始化为C++类构造函数? 我对C++中的特征如何工作有点不清楚,因此对该主题的任何附加信息也会被理解。C没有任何类似的特性,但是,由于C还没有构造函数,所以不存在不必要的分配危险。

C++;C中的构造函数初始化列表替代方案? 在C++中,类构造函数可以使用初始化列表,我知道这是一个通过避免额外的赋值来改进的性能特征。因此,我想知道,在C中是否有类似的方法可以实现基本相同的功能,将结构初始化为C++类构造函数? 我对C++中的特征如何工作有点不清楚,因此对该主题的任何附加信息也会被理解。C没有任何类似的特性,但是,由于C还没有构造函数,所以不存在不必要的分配危险。,c++,c,constructor,initialization,C++,C,Constructor,Initialization,更大的原则是,在语言中引入一个特性通常需要额外的特性来增强原始特性。一个简单的例子是线程。如果线程作为一种功能内置到该语言中,那么直接的问题就是如何同步它们。因此,还需要同步。因此,您可以看到没有内置线程或同步的语言(如C),以及既有线程又有同步的语言,但不是一种没有另一种的语言。在这里,构造函数是线程,就像同步是列出初始值设定项一样。C没有任何类似的功能,但是因为C也没有构造函数,所以没有不必要的赋值的危险 更大的原则是,在语言中引入一个特性通常需要额外的特性来增强原始特性。一个简单的例子是线

更大的原则是,在语言中引入一个特性通常需要额外的特性来增强原始特性。一个简单的例子是线程。如果线程作为一种功能内置到该语言中,那么直接的问题就是如何同步它们。因此,还需要同步。因此,您可以看到没有内置线程或同步的语言(如C),以及既有线程又有同步的语言,但不是一种没有另一种的语言。在这里,构造函数是线程,就像同步是列出初始值设定项一样。

C没有任何类似的功能,但是因为C也没有构造函数,所以没有不必要的赋值的危险


更大的原则是,在语言中引入一个特性通常需要额外的特性来增强原始特性。一个简单的例子是线程。如果线程作为一种功能内置到该语言中,那么直接的问题就是如何同步它们。因此,还需要同步。因此,您可以看到没有内置线程或同步的语言(如C),以及既有线程又有同步的语言,但不是一种没有另一种的语言。这里,构造函数是线程,就像同步是列出初始值设定项一样。

在C中没有这样的功能。最接近的是。

在C中没有这样的功能。最接近的是。

您可以编写一个单独的函数,在从类创建对象时调用它,然后将它传递给它:

C:

也可以在C++中执行此操作:

struct mine{
        int x;
        void initialize()
        {
                x = 4; //initialization
        }
};



void main(void)
{
        mine me;
        me.initialize();
        printf("%d",me.x);
}

这将输出
4
作为结果。

您可以编写一个单独的函数,在从类创建对象时调用它,然后将其传递给它:

C:

也可以在C++中执行此操作:

struct mine{
        int x;
        void initialize()
        {
                x = 4; //initialization
        }
};



void main(void)
{
        mine me;
        me.initialize();
        printf("%d",me.x);
}

<>这将输出<代码> 4代码>代码> C++中的构造函数

,初始化列表允许C++编译器在成员变量的位置上适当地构造成员,而不是使用赋值操作符、复制构造函数或移动构造函数初始化成员变量。有关更多详细信息,请参阅

在C中,C编译器不提供此类自动操作。这意味着程序员直接控制所有初始化,不需要特殊的语言特性来避免这些额外的操作

更清楚一些,考虑在C++构造函数中使用赋值初始化时发生的事情:

  • 成员变量首先使用默认构造函数构造
  • 构建了一个临时对象
  • 调用赋值或移动赋值运算符以使用临时变量重新初始化成员变量
  • 临时调用析构函数
  • 虽然有些编译器可以在某些情况下优化这一点,但是你的里程可能会有所不同,没有C++编译器可以在所有情况下优化这些步骤。现在,考虑程序员如何在C:

    中准确地复制这些步骤。
    void my_struct_init(struct my_struct* sp)
    {
      member_init_default(&sp->the_member);  /* default constructor for member */
    
      struct member memb; /* temporary on stack */
      member_init_other(&memb, ...params...);  /* initialize memb */
      member_assign(&sp->the_member,&memb);    /* assign member */
      member_finalize(&memb);                  /* finalize the temporary */
    }
    
    很少有C程序员会这样做(没有充分的理由)。相反,他们会自动编写优化代码:

      member_init_other(&sp->the_member, ...params...);
    

    <>这个特性存在于C++中,因为编译器为程序员做了很多自动化的事情。这通常会使程序员的工作更轻松,但需要初始化列表等功能来帮助编译器生成最佳代码。C编译器呈现了一个更简单的底层机器模型,自动地做更少的事情,因此需要更少的特征(虽然不一定是更少的工作)来生成类似的最佳代码。在C++构造函数中,

    < P>,初始化列表允许C++编译器在成员变量的位置上适当地构造成员,复制构造函数或移动构造函数来初始化成员变量,而不是使用赋值运算符。有关更多详细信息,请参阅

    在C中,C编译器不提供此类自动操作。这意味着程序员直接控制所有初始化,不需要特殊的语言特性来避免这些额外的操作

    更清楚一些,考虑在C++构造函数中使用赋值初始化时发生的事情:

  • 成员变量首先使用默认构造函数构造
  • 构建了一个临时对象
  • 调用赋值或移动赋值运算符以使用临时变量重新初始化成员变量
  • 临时调用析构函数
  • 虽然有些编译器可以在某些情况下优化这一点,但是你的里程可能会有所不同,没有C++编译器可以在所有情况下优化这些步骤。现在,考虑程序员如何在C:

    中准确地复制这些步骤。
    void my_struct_init(struct my_struct* sp)
    {
      member_init_default(&sp->the_member);  /* default constructor for member */
    
      struct member memb; /* temporary on stack */
      member_init_other(&memb, ...params...);  /* initialize memb */
      member_assign(&sp->the_member,&memb);    /* assign member */
      member_finalize(&memb);                  /* finalize the temporary */
    }
    
    很少有C程序员会这样做(没有充分的理由)。相反,他们会自动编写优化代码:

      member_init_other(&sp->the_member, ...params...);
    

    <>这个特性存在于C++中,因为编译器为程序员做了很多自动化的事情。这通常会使程序员的工作更轻松,但需要初始化列表等功能来帮助编译器生成最佳代码。C编译器提供了一种更简单的底层机器模型,自动执行的操作更少,因此生成类似最优代码所需的功能也更少(尽管不一定需要更少的工作)。

    我怀疑这是一种性能功能。如果