在阅读了一些教程后,我得出的结论是,应该总是使用指针来表示对象.但是我在阅读一些QT教程(http://zetcode.com/gui/qt4/painting/)时也看到了一些例外,其中QPaint对象是在堆栈上创建的.所以现在我很困惑.我什么时候应该使用指针?
如果您不知道何时应该使用指针,请不要使用它们.
当你需要使用它们时,每种情况都会有所不同.在应该使用时简明扼要地总结起来并不容易.不要养成"总是使用对象指针"的习惯,这肯定是不好的建议.
使用指针的主要原因:
控制对象寿命;
不能使用引用(例如,你想在向量中存储不可复制的东西);
你应该将指针传递给某些第三方函数;
也许是一些优化原因,但我不确定.
我不清楚你的问题是ptr-to-obj vs stack-based-obj还是ptr-to-obj vs reference-to-obj.还有一些用途不属于任何一种类别.
关于vs stack,这似乎已经在上面讨论了.有几个原因,最明显的是对象的生命周期.
关于vs引用,总是努力使用引用,但有些事情你只能用ptrs做,例如(有很多用途):
遍历数组中的元素(例如,在标准数组[]上行进)
当被调用的函数分配某些东西并通过ptr返回它时
最重要的是,指针(和引用,而不是自动/基于堆栈和静态对象)支持多态.指向基类的指针实际上可能指向派生类.这是C++支持的OO行为的基础.
首先,问题是错误的:困境不在指针和堆栈之间,而是在堆和堆栈之间.您可以在堆栈上有一个对象,并将指针传递给该对象.我假设你真正要问的是你是否应该声明一个指向类或类实例的指针.
答案是,这取决于你想要对象做什么.如果在控件离开函数后对象必须存在,则必须使用指针并在堆上创建对象.例如,当您的函数必须将指针返回到创建的对象或将对象添加到调用函数之前创建的列表时,您将执行此操作.
另一方面,如果对象是函数的本地对象,那么最好在堆栈上使用它.这使得编译器可以在控件离开函数时调用析构函数.