类的数组。堆栈还是堆?

时间:2010-02-19 12:12:26

标签: c++ arrays pointers

class temp;

temp *t;

void foo() { temp foo2; t[1] = foo2; }

int main() { 
    t = new temp[100];
    foo();
    //t[1] is still in memory?
}
  • 如果我想要这样的类数组,我将不得不使用 指向指针的指针(并使用'new' 在数组中的每个元素上)E.G: temp **t;
  • 如果我想做一个 100 ptr到ptr的数组我有todo temp **t = new temp[100][1]; 是 有没有更好的方法来做到这一点 4个方括号?

3 个答案:

答案 0 :(得分:12)

代码:

t = new temp[100];

构造一个类型为temp的数组100个对象。做同样事情的更安全的方法是:

std::vector <temp> t(100);

这使你无需在数组上调用delete []。

答案 1 :(得分:4)

在你确切知道自己在做什么之前,尽量避免使用新的东西。

std::vector<temp> t(100);

将以完美的方式完成工作。您仍然可以使用[]运算符访问它,就像您的解决方案一样。

temp foo2; t[1] = foo2;

将调用temp类的赋值运算符。 使用&amp;用于将变量传递给函数。

void foo1(std::vector<temp>& lt)
{
}

void foo2(temp& lt)
{
}

foo1(t);
foo2(t[1]);

答案 2 :(得分:1)

首先,我支持其他人的建议,以避免新的和使用std :: vector。 std :: vector可以避免由指针和数组引起的许多麻烦。数组是一个非常C的解决方案,而不是C ++解决方案。

回答你的问题:这里你不需要指向指针的类型。原因是数组是由指针自然寻址的。

当你说t = new temp[100];两件事情发生时:

  • 从免费商店(或“堆”)
  • 分配新数组
  • t设置为指向新数组的第一个元素。

当您使用p[i]运算符时,它实际上是*(p + i)的语法糖。例如:

  • t[0]相当于*(t + 0),它只是*t,或t指向的元素:数组的第一个元素。
  • t[1]相当于*(t + 1)。由于t是指向数组第一个元素的指针,因此t + 1是指向第一个元素之外的元素的指针:第二个元素。因此*(t + 1)为您提供了第二个元素。

使用此系统,temp *指针可用于引用整个temp数组,而不只是一个temp实例。

如果你真的想学习数组和指针,你可能会比阅读comp.lang.c FAQ的第6章更糟糕。但请注意,这是C资源,而不是C ++资源;这是因为在C ++中,通常不使用数组,因为您有更好的可用功能:std :: vector。我强烈建议你学习std :: vector比学习指针和数组更重要。

相关问题