1

在 C++ 中,实现 1 与实现 2 相比有什么优势,如下所示。由于两者都是通过引用传递的,在这两种情况下,内存不会从 HEAP 分配吗?如果是这样的话,一个比另一个有什么优势。

其次,哪种方法更好——按价值传递或按参考传递。什么时候应该使用按值传递,什么时候应该使用按引用传递。

实施1:

main()  
{        
    struct studentInfo { int Id;  int Age; };    

    *studentInfo tom;  
    populateInfo (tom );  

    printf ("Tom's Id = %d, Age = %d\n", tom.Id, tom.Age);  
}

void populateInfo ( struct studentInfo & student )  
{  
    student.Id = 11120;  
    student.Age = 17;  
    return;  
}  

实施2:

main()  
{  
    struct studentInfo { int Id; int Age; };   

    *studentInfo *tom = new studentInfo;
    populateInfo (tom );  

    printf ("Tom's Id = %d, Age = %d\n", tom->Id, tom->Age);  
}  

void populateInfo( struct studentInfo *student )  
{
    student->Id = 11120;  
    student->Age = 17;  
    return;  
};    
4

3 回答 3

2

内存分配与形式参数的类型无关。两种功能,

void populateInfo ( struct studentInfo & student ); //1
void populateInfo ( struct studentInfo * student ); //2

可以使用在堆或堆栈中创建的对象来调用。第一个意味着对象已经创建,第二个允许空参数。
通过引用传递通常更好,因为您避免复制对象。char但是,对于像,等内置类型,int从这个角度来看并没有什么区别。此外,通过引用传递可以更改参数的值。

于 2011-04-22T17:05:20.347 回答
2

通过地址/指针传递和通过引用传递之间可能存在一个主要区别:

  • 引用不能为空。

哪种方法可能是一个优势取决于您可能需要做什么。

还有其他一些可能会产生影响的事情:

  • 传递一个指针可以在调用站点更明显地表明该对象可能被修改。我认为这是支持按地址传递语法的原因,所有其他条件都相同。

  • 不能“重新定位”引用来引用不同的对象。可以使指针指向其他东西(除非您传入一个ObjectType* const指针,这非常罕见)。

  • 重载决议可能是一个因素。例如,使运算符重载自然工作是添加对 C++ 的引用的动机之一。

于 2011-04-22T17:00:16.867 回答
0

您使用指针的实现将更有资源效率,因为该函数仅复制要使用的对象的引用(指针)。

传递对象的实现将创建对象的副本以在您的函数中使用它(因此分配更多内存)。

如果您不打算在函数中修改它,我建议您在函数中使用对对象的 const 引用:

于 2011-04-22T17:05:11.857 回答