В C ++, в чем преимущество доступа к классу / структуре по указателю ИЛИ по экземпляру - PullRequest
1 голос
/ 22 апреля 2011

В C ++, что является преимуществом реализации 1 по сравнению с реализацией 2, указанной ниже.Поскольку оба являются своего рода передачей по ссылке, не будет ли выделяться память из HEAP, в обоих случаях?Если это так, то в чем преимущество одного перед другим.

Во-вторых, какая методика лучше - передача по значению ИЛИ передача по ссылке.Когда нужно использовать Pass by Value, а когда нужно использовать Pass by reference.

Реализация 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;  
};    

Ответы [ 3 ]

2 голосов
/ 22 апреля 2011

Распределение памяти не имеет ничего общего с типом формальных параметров. Обе функции,

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

можно вызвать с объектом, созданным в куче или в стеке. Первое подразумевает, что объект уже создан, второе допускает нулевой аргумент.
Передача по ссылке обычно лучше, потому что вы избегаете копирования объектов. Однако для встроенных типов, таких как char, int и т. Д., Это не имеет значения с этой точки зрения. Кроме того, передача по ссылке позволяет изменить значение аргумента.

2 голосов
/ 22 апреля 2011

Вероятно, есть одно основное отличие между передачей по адресу / указателю и передачей по ссылке:

  • Ссылка не может быть нулевой.

Какой метод может быть преимуществом, зависит от того, что вам может понадобиться.

Есть пара других вещей, которые могут иметь значение:

  • передача указателя делает более очевидным на сайте вызова, что объект может быть изменен.Я считаю, что это является причиной для предпочтения синтаксиса передачи по адресу, при прочих равных условиях.

  • ссылка не может быть «переустановлена» для ссылки на другой объект.Можно сделать указатель, указывающий на что-то другое (если вы не передадите указатель ObjectType* const, что довольно редко).

  • Разрешение перегрузки может быть фактором.Например, чтобы перегрузки операторов работали естественным образом, это было одной из причин для добавления ссылок на C ++.

0 голосов
/ 22 апреля 2011

Ваша реализация с указателем будет более ресурсоэффективной, поскольку функция копирует только ссылку (указатель) объекта для работы.

Реализация с передачей объекта создаст копию объекта для использования.это в вашей функции (поэтому выделите больше памяти).

Я предлагаю вам использовать константную ссылку на ваш объект в вашей функции, если вы не собираетесь изменять ее в своей функции:

...