如何使用类似于“对象”的方式使用构造函数初始化“对象数组”

时间:2015-04-28 17:33:58

标签: c++ arrays

如果有一个对象,我们可以用构造函数按以下方式初始化它 -

class obj{
int x;

public:
obj(int n) {x=n;}
};

int main()
{
   obj p(2);
}

对象数组是否有完全相同的方式;我的意思是完全一样的。

我知道用构造函数初始化对象的另外两种方法 -

obj p = obj(2);
obj p = 2; // for one parameter constructor

并且有相同的方法来初始化对象数组 -

obj p = {obj(1), obj(2), obj(3), obj(4)};
obj p[] = {1, 2, 3, 4};

但我找不到类似的方法来初始化单个对象的第一个代码中显示的对象数组。

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题......

// Initialize array member varible - method 1
struct Foo
{
   int a[3] = {1, 2, 3};
};

// Initialize array member varible - method 2
struct Bar
{
   Bar() : a{1, 2, 3} {}
   int a[3];
};

// Can't do this.
struct Foo
{
   int a[] = {1, 2, 3};
};

答案 1 :(得分:0)

这样做:

#include <array>
class obj{
  int x;

 public:
  obj(int n) {x=n;}
};

int main()
{
   std::array<obj,3> p = {3, 7, 11};
}

std :: array提供与基本数组类型相同的语义,但有资格作为c ++ 容器。你可能最好使用std :: vector,它提供了动态的重新调整大小和更多的保护:

#include <vector>
...
std::vector<obj> p = {obj(1), obj(2), obj(4)};

使用通用容器的好处是你可以经常互换地使用它们:

#include <vector>
//#include <array>
#include <algorithm>
...
int main()
{
   std::vector<obj> p = {obj(1), obj(2), obj(4)};     
   // or the following:
   // std::array<obj,3> p = {obj(1), obj(2), obj(4)};

   // either one of the above will work here
   std::for_each(begin(p), end(p), 
                [](obj const & o){ std::cout << o.x << " "; });
                std::cout << std::endl;
   //           ^^^ yes, this only works if x is public
}

请注意,std :: array的大小是在编译时调整的,所以它需要告诉它元素的数量。

您还可以重写原始类以使用初始化列表构造,如下所示:

class obj{
  int x;
 public:
  obj(int n) : x(n) { }
};

即使在此示例中,它也可能会有所帮助,因为它可以让您x const。一般来说,它有很多好处,是一个很好的习惯。