Форум программистов, компьютерный форум CyberForum.ru

Ссылочный тип - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
amor1k
Студент
 Аватар для amor1k
147 / 147 / 24
Регистрация: 18.01.2011
Сообщений: 469
20.10.2011, 21:13     Ссылочный тип #1
Есть ли разница и как лучше писать
C++
1
void sum(int &a, int &b);
или

C++
1
void sum(int a ,int b);
Что лучше, и почему? Обьясните
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
20.10.2011, 21:17     Ссылочный тип #2
Если хотите в аргументы запихать значения, которые сохранятся по завершению функции - первый вариант. Если не хотите - второй вариант.

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

Не забывает про const где нужно.
mikhail_g
 Аватар для mikhail_g
187 / 142 / 4
Регистрация: 02.05.2011
Сообщений: 467
21.10.2011, 09:32     Ссылочный тип #3
В обоих вариантах внутри функции создаются локальные экземпляры переменных-аргументов, которые уничтожатюся после завершения работы функции.

В первом случае вы передаете адреса ячеек памяти в которых хранятся переменные, поэтому внутри функции создаются НЕ ССЫЛКИ А УКАЗАТЕЛИ на область памяти. Далее можно применить оператор * - разыменования адреса, и получить доступ к значению самой переменной и далее изменить его. Этот вариант используется если ваша функция должна иметь полный доступ (запись/чтение) к переменным объявленным вне тела функции, например к глобальным переменным, или переменным объявленным в теле вызывающей функции.

Во-втором случае внутри функции создаются экземпляры перемнных-аргументов заданных типов инициализированные значениями передаваемых аргументов. В этом случае на внешние переменные мы повлиять никак не можем. Вот вам пример:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void sum (int *sum, int a, int b)
{
*sum=a+b;
}
 
int sum2 (int a, int b)
{
return (a+b);
}
 
void main ()
{
int sum, a, b;
sum=sum2(a+b);
sum(&sum, a, b)
}
Добавлено через 37 секунд
Ссылки в VB
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
21.10.2011, 09:38     Ссылочный тип #4
mikhail_g, у вас имя функции и имя указателя совпадают, разве так можно? Причем void main() это как-то нехорошо, так как main() возвращает по стандарту целое число
mikhail_g
 Аватар для mikhail_g
187 / 142 / 4
Регистрация: 02.05.2011
Сообщений: 467
21.10.2011, 09:49     Ссылочный тип #5
Да нельзя чтобы в данном контексте совпали имена. Вы правы. Я поторопился когда писал.
вот так вот правильно.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void sum1 (int *sum, int a, int b)
{
*sum=a+b;
}
 
int sum2 (int a, int b)
{
return (a+b);
}
 
int main (void)
{
int sum, a, b;
sum=sum2(a+b);
sum1(&sum, a, b);
}
Bers
Заблокирован
21.10.2011, 09:49     Ссылочный тип #6
Цитата Сообщение от mikhail_g Посмотреть сообщение
В первом случае вы передаете адреса ячеек памяти в которых хранятся переменные, поэтому внутри функции создаются НЕ ССЫЛКИ А УКАЗАТЕЛИ на область памяти.
Вы ничего не путаете?

C++
1
void Foo(SCoord &test){    test.Clear();   }
test - это указатель? или все таки ссылка?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
21.10.2011, 10:29     Ссылочный тип #7
Человек перепутал указатели и ссылки думаю
Небольшая выдержка.

Во многих языках программирования имеются два способа передачи аргументов функциям: передача по значению и передача по ссылке. Когда аргумент передается по значению, создается копия аргумента, и последняя передается (через стек вызовов) вызываемой функции. Изменения копии не влияют на значение исходной переменной вызывающего.
...
Ссылочный параметр является псевдонимом соответствующего аргумента в вызове функции. Для указания того, что параметр функции передается по ссылке, просто поставьте символ амперсанда (&) после типа параметра в прототипе функции; то же самое относится к типу в списке параметров заголовка функции. ... В вызове функции достаточно указать имя переменной, и она будет передана по ссылке. Тогда обращение к переменной по имени параметра в теле вызываемой функции будет в действительности относиться к исходной переменной вызывающего, и исходная переменная может изменяться вызываемой функцией непосредственно. Как обычно, прототип и заголовок функции должны согласовываться друг с другом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2011, 10:43     Ссылочный тип
Еще ссылки по теме:

Узнать тип значения, зная тип указателя C++
Опциональный ссылочный аргумент функции C++
Как сконвертировать свой тип в тип double? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
21.10.2011, 10:43     Ссылочный тип #8
Правило очень простое:
Если вы передаете в функцию объект по значению, внутри функции будит создана копия этого объекта.

Если вы передаете в функцию ссылку, внутри функции будит создана копия этой ссылки.
Если вы передаете в функцию указатель, внутри функции будит создана копия этого указателя.
Если вы передаете в функцию ссылку на указатель, внутри функции будит создана копия этой ссылки на указатель.

Пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
 //Модифицирована будит локальная копия указателя. 
void Foo( void* ptr) { int A; ptr= &A; } 
//после того, как функция отработает, 
//копия будит уничтожена. 
//Значение оригинального ptr останется прежним.
//Если нужно, что бы функция могла модифицировать
//оригинальный указатель нужно использовать ссылку на указатель:
 
void Foo2( void* &ptr) { int A; ptr= &A; } //оригинал будит изменен
 
//ps Естейственно не нужно возвращать наружу данные о локальных переменных. 
//В примере я это сделал исключительно для иллюстрации
Yandex
Объявления
21.10.2011, 10:43     Ссылочный тип
Ответ Создать тему
Опции темы

Текущее время: 00:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru