Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > передача параметров


Автор: itan 21.9.2006, 09:50
Добрый день! У кого какие соображения по поводу того, когда лучше использовать передачу параметра по ссылке, а когда по указателю ? Т.к. особой разницы между этими двумя подходами нет, то может существует какой-нибудь хороший стиль написания ? 
Например, я вижу различие, только в том, что ссылка, в отличие от указателя не может быть NULL, поэтому те параметры (объекты), существование которых обязательно, должны всегда передаваться по ссылке.
Еще что-нибудь?

Автор: Damarus 21.9.2006, 10:11
ИМХО, передавать по указателю надо только тогда, когда нет другого выхода. Во всех остальных случаях - по ссылке.

Автор: Romikgy 21.9.2006, 10:13
все зависит от того что передаешь! 

Автор: Damarus 21.9.2006, 10:17
Цитата(Romikgy @  21.9.2006,  11:13 Найти цитируемый пост)
все зависит от того что передаешь! 

И какая разница smile 

Автор: vinter 21.9.2006, 10:29
ИМХО по ссылке удобнее при передаче по ссылке, переменную внутри ф-ии можно исп. с именем какое ей дано
пр.
Код

 f(int &n)
{
   n=6;
}

а указатель надо разыменововать
Код

 f(int *n)
{
   *n=6;
}

Автор: itan 21.9.2006, 10:35
Вот, для примера, создаю я объекты класса
Код

class Alpha{}

class Betta{}

Alpha a();
Betta* b = new Betta();


Как лучше оформить функции принимающие объекты классов Alpha и Betta в качестве параметров ?
Так:
Код

void fun (const Alpha& a, Betta* b)

или так:
Код

void fun(Alpha* a, const Betta& b)


или еще как ?

Автор: vinter 21.9.2006, 10:55
Код

void fun (const Alpha& a, Betta* b)

кстати а зачем const??

Автор: EvgenZ 21.9.2006, 11:09
Цитата(vinter @ 21.9.2006,  10:55)
Код

void fun (const Alpha& a, Betta* b)

кстати а зачем const??

Затем что const не даст изменять объект а.

Автор: Daevaorn 21.9.2006, 11:14
itan, если в функции ты не собираешься освобождать указатель или ещё что-то с ним делать, а тебе нужен только объект, тогда зачем передавать указатель? Ссылки(особенно константные) скорей всего проще оптимизировать компилятору. Хотя всё зависит от ситуации и от результата который ты хочешь получить.

Автор: vinter 21.9.2006, 11:30
Цитата

Затем что const не даст изменять объект а.

что такое const я знаю smile 

Автор: EvgenZ 21.9.2006, 11:41
Ну а что тогда не понятно, если тебе не требуется изменять объект, то ставится const. Это идет как показатель, что объект изменяться не будет и защитит от неумышленного изменения...

Автор: 0x07L 21.9.2006, 11:49
Указатель надо использовать тогда, когда может быть передано какое-нибудь специальное значение. Вместо реального указателя можно передать ноль, ссылка такое осуществить не позволяет. Например, в MFC:

CWnd* SetParent(
   CWnd* pWndNewParent 
);

Здесь указатель, а не ссылка, для того чтобы мог быть передан ноль.

Автор: vinter 21.9.2006, 11:57
просто вообще не вижу смысла передачи константных ссылок..

Автор: EvgenZ 21.9.2006, 12:10
Передача константной ссылки экономит на создании копий и т.д. и гарантирует сохранность объекта. Когда передаешь по значению, создается копия и все действия выполняются над ней, самже объект не изменяется. По ссылке не создается никаких копий (что есть хорошо), но зато любое изменение в функции объекта отразится на нем самом, чтобы не произошло изменения и гарантировать сохранность ставится конст.

Автор: maxim1000 21.9.2006, 12:29
слышал такой аргумент:
при передаче по неконстантной ссылке возможно (и, обычно, предполагается) изменение объекта
однако, в точке вызова это никак не отражено
т.е. человек посмотрит на func(a,b) и для того, чтобы сказать, будут ли изменены объекты a и b, нужно лезть смотреть описание функции
а когда вместо неконстантной ссылки всегда используется передача по указателю, то & уже обращает на себя внимание, а если его нет, то можно быть уверенным, что передаваемый объект не изменится...

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

Автор: Romikgy 21.9.2006, 12:34
Цитата(Damarus @  21.9.2006,  09:17 Найти цитируемый пост)
И какая разница

попробуй передать в копирующий конструктор указатель smile

А вообще имхо просто разница в обращении к этой переменной, в смысле написания буковок в коде, (почти )все что можно написать юзая ссылку , можно также реализовать и через указатель

Автор: EvgenZ 21.9.2006, 12:39
Использование ключевого слова const позволяет функции работать как с постоянными объектами, так и с переменными.

Автор: vinter 21.9.2006, 13:02
EvgenZ не убедил smile 
ИМХО хочешь чтобы обьект менялся, передавай по ссылке, не хочешь, передавай просто так(можно и с идентификатором const, чтобы выглядело красивей smile )..

Автор: EvgenZ 21.9.2006, 13:09
Цитата

не хочешь, передавай просто так


к примеру у тебя объект не объект класса точка, а какой-нибудь супер объект, содержащий поля из объектов других классов в большом колличестве. При передаче по значению у тебя для каждого такого поля будет создаваться копия... будут вызванны конструкторы для каждого(а если еще и поле  из составного класса то и далее...) это очень затратно и расточительно.

Автор: vinter 21.9.2006, 13:16
Цитата

супер объект,

 smile  smile  smile 
Убедил  smile 

Автор: Rockie 22.9.2006, 01:12
При передаче по указателю используется косвенный доступ, а при передаче по ссылке - прямой. 
Код
#include<iostream>

using namespace std;

struct MyStruct
{
 int x;
};

int main(){

 MyStruct* ptr = new MyStruct;   // pointer
 ptr->x = 3;
 cout<<ptr->x<<'\n';

 MyStruct & ref = *ptr;          // reference
 ref.x = 5;
 cout<<ref.x<<'\n';

 system("pause");
 return 0;
}


imho вроде как по указателю стоит передавать текстовые массивы, так как указатель обозначает начало массива.

Автор: Earnest 22.9.2006, 07:20
Цитата(Rockie @  22.9.2006,  02:12 Найти цитируемый пост)
При передаче по указателю используется косвенный доступ, а при передаче по ссылке - прямой. 

Это всего лишь форма записи, внутренний механизм в любом случае один - указатель и косвенный доступ.

Так что разница число семантическая. Действительно, как уже здесь писали, имеет смысл передавать ссылку, когда объект обязан быть, и указатель, если возможно отсутствие объекта. Ну есть еще некоторые случаи, когда со сложными шаблонами проще использовать указатель, а не ссылку... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)