C++ 数组构造函数

Posted

技术标签:

【中文标题】C++ 数组构造函数【英文标题】:C++ Array Constructor 【发布时间】:2009-12-22 06:58:36 【问题描述】:

我只是想知道,类的数组成员是否可以在类构造时立即创建:

class C

      public:
          C(int a) : i(a) 

      private:
          int i;
;

class D

 public:
        D() : a(5, 8) 
        D(int m, int n) : a(m,n) 

     private:
     C a[2];

;

据我谷歌搜索,在上面的构造函数中创建数组在 C++ 中是不可能的。或者,可以在 Constructor 块中初始化数组成员,如下所示。

class D
    
     public:
         D()  
               a[0] = 5;
               a[1] = 8; 
             
         D(int m, int n)  
                           a[0] = m;
                           a[1] = n; 
                         
         private:
         C a[2];

    ;

但是,它不再是数组创建,而是数组赋值。数组元素由编译器通过其默认构造函数自动创建,随后手动将它们分配给 C'tor 块中的特定值。什么烦人;对于这样的解决方法,C 类必须提供一个默认构造函数。

有任何想法可以帮助我在构造时创建数组成员。我知道使用 std::vector 可能是一种解决方案,但由于项目条件,我不允许使用任何标准、Boost 或第三方库。

【问题讨论】:

你必须等待C++0x,它允许这个。 【参考方案1】:

数组——一个比 C++ 本身更早的概念,直接从 C 继承——实际上并没有可用的构造函数,正如您基本上注意到的那样。考虑到您提到的奇怪约束(没有标准库?!?!?),您几乎没有解决方法——您可以让a 成为 C 的 指针 而不是C 的数组,为其分配原始内存,然后用“placement new”初始化每个成员(至少可以解决 C 没有默认构造函数的问题)。

【讨论】:

C 数组在大小固定的情况下往往优于向量; C++ 向量也没有“从内联数据构造”功能(尽管 C++0x 有,如前所述,您可以声明一个常量数组并从迭代器初始化)。【参考方案2】:

您可以创建一个类来包装数组并根据需要进行构造。这是一个开始;除了您看到的内容之外,此代码未经测试。

#include <iostream>
using namespace std;

template< class T, int N >
struct constructed_array 
        char storage[ sizeof( T[N] ) ]; // careful about alignment
        template< class I >
        constructed_array( I first ) 
                for ( int i = 0; i < N; ++ i, ++ first ) 
                        new( &get()[i] ) T( *first );
                
        
        T *get() const  return reinterpret_cast< T const* >( storage ); 
        T *get()  return reinterpret_cast< T * >( storage ); 
        operator T *() const  return get(); 
        operator T *()  return get(); 
;

char const *message[] =  "hello", ", ", "world!" ;

int main( int argc, char ** argv ) 
        constructed_array< string, 3 > a( message );
        for ( int i = 0; i < 3; ++ i ) 
                cerr << a[i];
        
        cerr << endl;
        return 0;

【讨论】:

只是说:boost::array boost.org/doc/libs/1_41_0/doc/html/boost/array.html

以上是关于C++ 数组构造函数的主要内容,如果未能解决你的问题,请参考以下文章

函数调用或构造函数调用中的 C++ 数组初始化

C++根据构造函数参数初始化数组

c++ 隐式复制构造函数是不是复制数组成员变量? [复制]

C++中数组的构造函数初始化列表

C++ 数组对复制构造函数和赋值运算符

在 C++ 构造函数中为结构数组分配存储[关闭]