如何初始化类类型变量的成员数组

How to initialize a member-array of class type variables?

本文关键字:成员 数组 类型变量 初始化      更新时间:2023-10-16

我想创建一个 10 个Foo的成员数组,每个成员数组初始化为 Foo(8, "10") ,如下所示:

Foo bar = new Foo(8, "10")[10]; //like this

我怎样才能做到这一点?

假设你想初始化 10 个 Foo 类型的对象,你应该在C++中使用一个vector

std::vector<Foo> foos( 10, Foo(8, "10"));

最简单的方法是使用这样的std::vector

struct A {
   std::vector<Foo> bar;
   A() : bar(10, Foo(8, "10")) {}
};

std::vector可以像普通数组一样使用,再加上此处记录的一些简洁的额外功能。

如果vector证明的动态分配太慢,并且10数是编译时常量,则可以改用std::array。但是,语法并不那么漂亮,差异很可能可以忽略不计。

如果数组的大小恒定且较小,则可以使用:

foo array_of_foos[3] = 
{
    foo(8, "10"),
    foo(8, "10"),
    foo(8, "10")
};

唯一的另一种方法是使用 for() 循环,但要使其正常工作,foo还必须具有无参数构造函数(又名 foo()

Xtofl 使用向量的答案也有效,假设您可以使用向量而不是数组。

如果数组的大小较小,则可以为数组的每个元素显式指定初始值设定项。

例如

#include <iostream>
struct A
{
    A( int x, int y ) : x( x ), y( y ) {}
    int x, y;
};    
int main()
{
    const size_t N = 10;
    A *a = new A[N] 
    { 
        { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 }, 
        { 5, 5 }, { 6, 6 }, { 7, 7 }, { 8, 8 }, { 9, 9 }
    };
    for ( size_t i = 0; i < N; i++ ) std::cout << a[i].x << ' ' << a[i].y << std::endl;
    delete [] a;
}    

程序输出为

0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9

但是,如果您要动态分配数组,那么更好的方法是使用在标头 <vector> 中声明的标准类std::vector

您可以使用与示例相同的初始值设定项列表

    std::vector<A> v = 
    { 
        { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 }, 
        { 5, 5 }, { 6, 6 }, { 7, 7 }, { 8, 8 }, { 9, 9 }
    };

或者您可以先使用默认值初始化所有元素

std::vector<A> v( N, { 0, 0 } );

然后使用例如标准算法(如std::fillstd::generate等)重新分配它们。