Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;指针对象与非指针对象_C++_Pointers_Object - Fatal编程技术网

C++ C++;指针对象与非指针对象

C++ C++;指针对象与非指针对象,c++,pointers,object,C++,Pointers,Object,可能重复: 为什么要创建Test2类型的指针对象?为什么不直接做非指针版本的Test2呢?为什么我要做指针对象 在这里找到答案: 如果您需要一个对象在其创建的范围之外生存,那么解决方案之一就是在堆上创建它。在这种情况下,您需要一个指针。还有其他原因,这是最常见的 使用指针的另一个原因是用于“out”参数。当然,您可以使用引用,但许多人更喜欢使用指针,因为它避免了在调用站点修改参数foo(var)vsfoo(&var) 此外,指针可用于传递或返回可能存在或不存在的对象。例如:T*f

可能重复:

为什么要创建Test2类型的指针对象?为什么不直接做非指针版本的Test2呢?为什么我要做指针对象

在这里找到答案:


如果您需要一个对象在其创建的范围之外生存,那么解决方案之一就是在堆上创建它。在这种情况下,您需要一个指针。还有其他原因,这是最常见的

使用指针的另一个原因是用于“out”参数。当然,您可以使用引用,但许多人更喜欢使用指针,因为它避免了在调用站点修改参数<代码>foo(var)vs
foo(&var)

此外,指针可用于传递或返回可能存在或不存在的对象。例如:
T*foo();//返回指向对象的指针,如果不存在,则返回NULL


这个列表真的是层出不穷。

任何类型的动态数据结构(列表、二叉树、堆栈等)都必须使用指向对象的指针。

使用动态存储的原因包括(但可能不限于)

  • 手动控制对象的生命周期-对象将一直存在,直到您明确销毁它
  • 如果只在运行时知道对象的最终数量(如树中的节点数或数组中的元素数),则根据需要创建尽可能多的对象
  • 对象类型的运行时控件(如多态对象的实际类型)

  • 如果没有区别,最好使用
    t3
    方法创建对象。除非必须,否则不要使用动态内存。但是有时候你真的必须这样做(参见上面的原因)。

    一个常见的(但不是必需的)实现是在堆栈上分配局部变量。堆栈是有限的,可能有一个对象太大而无法在堆栈上分配。

    如果您有一个非常大的对象(例如一个具有非常大的缓冲区作为成员的对象),您可能不想在堆栈上分配它,因为堆栈空间有限,在这种情况下,您可以使用运算符new在堆上进行分配。

    为您提供一些类似的问题:


    主要区别在于它在内存中的位置。“非指针版本”位于堆栈上,这意味着一旦函数返回,它将无效,而“指针版本”位于堆上,这意味着它将一直处于活动状态,直到有人对其调用
    delete
    。通常认为最好的做法是尽可能将对象放在堆栈上,并且仅在需要时才放在堆上。需要堆上的对象的一个很好的例子如下

    Obj* f()
    {
      return new Obj();
    }
    
    newobj()
    在堆上创建一个
    Obj
    对象,并返回指向该对象的指针,然后从函数返回该指针

    例如,这是行不通的

    Obj* f()
    {
      Obj o1;
      return &o1;  //BAD!!
    }
    

    由于指针值
    &o1
    引用堆栈上的内存,而此时f()从堆栈中清除,谁知道会发生什么。肯定没什么好的。

    你能列举一些其他原因吗?不正确。对象声明为
    statictest2t3将比创建它的作用域更有效。“但它不是在堆上创建的”。@安德烈:好的,我将修改我的答案。谢谢;我是java和C++程序员,但是我的类从来没有过堆栈/堆…你应该把这个作为注释添加到问题中,然后投票结束。很多重复,首先是(从Firas Assaad回答)我现在意识到了。然而,问这个问题是困难的。现在我想我明白了D
    
    Obj* f()
    {
      Obj o1;
      return &o1;  //BAD!!
    }