我刚开始学习C ++中的指针,我不太确定何时使用指针,何时使用实际对象。
例如,在我的一个赋值中,我们必须构造一个gPolyline类,其中每个点都由gVector定义。现在我的gPolyline类的变量如下所示:
private:
vector<gVector3*> points;
如果我有 vector&lt; gVector3&gt;而相反,它会有什么不同?此外,是否有使用指针的一般经验法则?提前谢谢!
答案 0 :(得分:2)
一般的经验法则是在需要时使用指针,并在可能时使用值或引用。
如果使用vector<gVector3>
插入元素,则会复制这些元素,并且这些元素将不再连接到您插入的项目。存储指针时,向量仅引用您插入的对象。
因此,如果您希望多个向量共享相同的元素,以便元素中的更改反映在所有向量中,则需要向量包含指针。如果你不需要这样的功能,那么存储值通常会更好,例如它可以让你免于担心何时删除指向对象的所有这些。
答案 1 :(得分:1)
现代C ++中通常要避免使用指针。现在指针的主要目的是围绕指针可以是多态的,而显式对象不是。
如果你现在需要多态,虽然最好使用智能指针类 - 例如std::shared_ptr
(如果你的编译器支持C ++ 0x扩展),std::tr1::shared_ptr
(如果你的编译器没有支持C ++ 0x但支持TR1)或boost::shared_ptr
。
答案 2 :(得分:1)
通常,在必要时使用指针是一个好主意,但是在可能的情况下引用或替代对象(想到值)。
首先,您需要知道gVector3
是否满足标准容器的要求,即类型gVector3
是否可复制和可分配。如果gVector3
也是默认可构造的,则非常有用(请参阅下面的更新说明)。
假设确实如此,那么您有两个选择,直接在gVector3
中存储std::vector
对象
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
的对象。这意味着,您可能希望或需要自己管理这些对象的生命周期。
顺便说一句,您可能也想知道When should I use references, and when should I use pointers?
更新:以下是对默认构造性的说明的解释。感谢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
}
答案 3 :(得分:0)
你可以使用指针或对象 - 它在一天结束时真的是一样的。
如果你有一个指针,你需要为任何方式为实际对象分配空间(然后指向它)。在一天结束时,如果您有一百万个对象,无论您是存储指针还是对象本身,您将拥有在内存中分配一百万个对象的空间。
何时使用指针代替?如果您需要自己传递对象,请在数据结构中修改单个元素,而不必每次都检索它们,或者如果您使用自定义内存管理器来管理分配,取消分配和清除对象。
将对象本身放在STL结构中更容易,更简单。它需要更少的*和 - &gt;您可能会发现难以理解的运营商。某些STL对象需要让对象本身而不是默认格式的指针(即需要对条目进行哈希处理的哈希表 - 并且您希望对对象进行哈希处理,而不是指向它的指针)但是您始终可以通过重写功能等。
底线:在有意义的时候使用指针。否则使用对象。
答案 4 :(得分:0)
通常你会使用物体 它更容易吃苹果而不是苹果棒(2米棒,因为我喜欢糖果苹果)。
在这种情况下,只需将其设为向量&lt; gVector3&gt;
即可如果你有一个矢量&lt; g3Vector *&gt;这意味着您正在动态分配g3Vector的新对象(使用new运算符)。如果是这样,那么你需要在某些时候调用这些指针上的删除,并且std :: Vector不是为此而设计的。
但每条规则都是例外。
如果g3Vector是一个巨大的对象,复制成本很高(很难说阅读你的文档),那么存储指针可能更有效。但在这种情况下,我会使用boost :: ptr_vector&lt; g3Vector&gt;因为这会自动管理对象的生命周期。