繁体   English   中英

何时在C ++中使用指针

[英]When to use pointers in C++

我刚开始学习C ++中的指针,我不太确定何时使用指针,何时使用实际对象。

例如,在我的一个赋值中,我们必须构造一个gPolyline类,其中每个点由gVector定义。 现在我的gPolyline类的变量如下所示:

private:
vector<gVector3*> points;

如果我有矢量<gVector3>点 ,它会有什么不同? 此外,是否有使用指针的一般经验法则? 提前致谢!

一般的经验法则是在需要时使用指针,并在可能时使用值或引用。

如果使用vector<gVector3>插入元素将复制这些元素,并且元素将不再连接到您插入的项目。 存储指针时,向量仅引用您插入的对象。

因此,如果您希望多个向量共享相同的元素,以便元素中的更改反映在所有向量中,则需要向量包含指针。 如果您不需要这样的功能,存储值通常会更好,例如它可以使您免于担心何时删除所有这些指向对象的内容。

在现代C ++中通常要避免使用指针。 现在指针的主要目的是围绕指针可以是多态的事实,而显式对象则不是。

如果你现在需要多态,虽然最好使用智能指针类 - 比如std::shared_ptr (如果你的编译器支持C ++ 0x扩展), std::tr1::shared_ptr (如果你的编译器不支持C) ++ 0x但支持TR1)或boost::shared_ptr

通常,在必要时使用指针是个好主意,但是在可能的情况下引用或替代对象(想到值)。

首先,您需要知道gVector3满足标准容器的要求,即gVector3类型gVector3复制和可分配。 如果gVector3也是默认可构造的,那么它很有用(参见下面的更新说明)。 假设它有,那么你有两个选择,直接在std::vector存储gVector3对象

std::vector<gVector3> points;
points.push_back(gVector(1, 2, 3)); // std::vector will make a copy of passed object

或手动管理gVector3对象的创建(以及破坏)。

std :: vector points; points.push_back(new gVector3(1,2,3)); // ...

当不再需要points组时,记住要遍历所有元素并在其上调用delete运算符。

现在,您可以选择将gVector3作为对象进行操作(您可以假设将它们视为值或值对象),因为(如果,请参阅上述条件)由于复制构造函数和赋值运算符的可用性,可以执行以下操作:

gVector3 v1(1, 2, 3);
gVector3 v2;
v2 = v1; // assignment
gVector3 v3(v2); // copy construction

或者您可能希望或需要使用new运算符在动态存储中分配gVector3对象。 这意味着,您可能希望或需要自己管理这些对象的生命周期。

顺便说一下,您可能也想知道我何时应该使用引用,何时应该使用指针?

更新:这是关于默认构造性的说明的解释。 感谢Neil指出它最初还不清楚。 正如Neil正确地注意到的那样,C ++标准并不要求它,但是我指出了这个特性,因为它是一个重要且有用的特性。 如果类型T不是默认可构造的,那么C ++标准不需要,那么用户应该意识到我试图在下面说明的潜在问题:

#include <vector>
struct T
{
    int i;
    T(int i) : i(i) {}
};
int main()
{
    // Request vector of 10 elements
    std::vector<T> v(10); // Compilation error about missing T::T() function/ctor
}

你可以使用指针或对象 - 它在一天结束时真的是一样的。

如果你有一个指针,你需要为任何方式为实际对象分配空间(然后指向它)。 在一天结束时,如果您有一百万个对象,无论您是存储指针还是对象本身,您将拥有在内存中分配一百万个对象的空间。

何时使用指针代替? 如果您需要自己传递对象,请在数据结构中修改单个元素,而不必每次都检索它们,或者如果您使用自定义内存管理器来管理分配,取消分配和清除对象。

将对象本身放在STL结构中更容易,更简单。 它需要较少的*和 - >运算符,您可能会发现它们难以理解。 某些STL对象需要让对象本身而不是默认格式的指针(即需要对条目进行哈希处理的哈希表 - 并且您希望对对象进行哈希处理,而不是指向它的指针)但是您始终可以通过重写功能等

底线:在有意义的时候使用指针。 否则使用对象。

通常你使用对象。
它比苹果更容易吃苹果(2米棒,因为我喜欢糖果苹果)。

在这种情况下,只需将其设为向量<gVector3>即可

如果你有一个向量<g3Vector *>,这意味着你正在动态分配g3Vector的新对象(使用new运算符)。 如果是这样,那么你需要在某些时候调用这些指针上的删除,并且std :: Vector不是为此而设计的。

但每条规则都是例外。

如果g3Vector是一个巨大的对象,复制成本很高(很难说明你的文档),那么存储指针可能更有效。 但在这种情况下,我会使用boost :: ptr_vector <g3Vector>,因为这会自动管理对象的生命周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM