如何在C ++中声明类字段?

时间:2016-11-30 15:29:32

标签: c++ class initialization field declaration

我需要将一个向量声明并初始化为一个名为PixelOperator的类的字段。

我在这两种声明方法之间徘徊,第一种是#34;在堆#34;上,第二种是#34;在堆栈上#34; (或者至少,这是我的解释)。

  1. vector<int>* field = new vector<int>();
  2. vector<int> field = vector<int>();
  3. 如果我选择在样式编号1中声明,我需要在类的析构函数中调用delete。

    我应该选择哪一个?为什么?

    另外,如果在堆上初始化类(即PixelOperator* op = new PixelOperator();),那么在堆上初始化的字段上是否初始化了字段?

3 个答案:

答案 0 :(得分:3)

选择方法2.这会将对象放在堆栈上,但是向量的实现很可能将内容放在堆上。

另外,你的意思是相反的。 1在堆上,2在堆栈上。 1将需要删除。

答案 1 :(得分:2)

在这种情况下,你的直觉是错误的。方法(2)不一定将矢量放在堆栈上。如果PixelOperator对象在本地声明并因此放在堆栈上,那么向量也会放在堆栈上,但是如果使用new运算符将PixelOperator对象放在堆上,则该向量也会作为该对象的一部分放在堆上/ strong>即可。这种情况的不同之处在于,在方法(2)中,向量是连续的内存块与其​​他对象字段的一部分,并且在方法(1)中,包含对象的内存块在其中具有另一个块的地址内存,包含向量。当然,在方法(1)中,无论PixelOperator对象是放在堆上还是放在堆栈上,向量都会在堆上结束。方法(2)通常是更理想的,因为它允许更透明地确定对象的分配位置。

答案 2 :(得分:1)

没有什么可以绊倒的。永远不会有理由在堆上分配Pattern pattern = Pattern.compile("\\p{Cntrl}"); Matcher matcher = pattern.matcher(str); String controlChar = matcher.group(); String replace = "\\" + controlChar; result = result.replace(controlChar, replace); (或任何其他标准容器)。只是永远不要这样做,你会没事的。