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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Опциональный ссылочный аргумент функции - C++

23.02.2014, 09:46. Просмотров 869. Ответов 24
Метки нет (Все метки)

Некоторые аргументы функции можно сделать опциональными, просто поставив значение по умолчанию, а затем проверяя, изменилось ли оно :
C++
1
2
3
4
5
6
7
void someFoo(int important, int *additional = NULL)
{
if (additional != NULL)
{
//do someFoo
}
}
Можно ли сделать так же для ссылочного типа?
C++
1
2
3
4
5
6
7
void someFoo(int important, int &additional) // ???
{
if (additional) //  ??? -> PROFIT
{
//do someFoo
}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2014, 09:46     Опциональный ссылочный аргумент функции
Посмотрите здесь:

Передача функции в аргумент - C++
Есть три функции: void MainMenu(); void MainMenu_MilkMenu(); bool ErrorMenu(void (*pf)()); Все прототипы находятся в...

Не читается аргумент функции - C++
void recursReverse(char* str, size_t len) { static size_t len2 = len; while (len2 > 1) { std::swap(*str, *(str + len2 - 1)...

Безымянный аргумент функции - C++
функция принимает аргумент, но у него нет имени void f(int) { cout << "Hello world!"; } int main() { int n =...

Непонятный аргумент функции - C++
Кто-нибудь может подсказать, что принимает такая функция в качестве аргумента? void foo(int (**i)(double)) { ..... }

Аргумент в виде шаблонной функции - C++
void Function(любая_функция_с_одним_параметром){} Как при помощи шаблона всунуть в аргумент функции, любую функцию с одним параметром,...

Класс как аргумент функции - C++
Доброго времени суток:) Набрёл на такой пример в openGL и не могу понять как он робит, подскажите. Вот описание ф-ции: void...

Локальные переменные в функции и её аргумент - C++
Привет! Пишу функцию перевода десятичного числа в текст (не обсуждайте зачем и правильно ли я делаю) Суть такова, начало функции: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
23.02.2014, 09:47     Опциональный ссылочный аргумент функции #2
Нет, ссылка должна быть инициализирована и не имеет null-семантики (простите за варварские формулировки)
igorrr37
1640 / 1268 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
23.02.2014, 10:27     Опциональный ссылочный аргумент функции #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
void Func(int const& num = 0)
{
    int& num1 = const_cast<int&>(num);
    num1 = 120;
    std::cout << "Func: " << num << '\n';
}
 
 int main ()
 {
     int num = 390;
     Func(num);
     std::cout << num << '\n';
     return 0;
 }
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 11:56     Опциональный ссылочный аргумент функции #4
igorrr37, всё-таки речь шла о неконстантной ссылке. Тем более, если в 12 строке будет:
C++
1
const int num
, то получите UB из-за const_cast.
Если нужно просто сделать ссылочное значение по умолчанию, достаточно такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int i = 42;
 
void Func(int& num = i)
{
    std::cout << "Func: " << num << '\n';
}
 
int main()
{
    int num = 390;
    Func(num);
    Func();
    return 0;
}
http://ideone.com/qjbjEj
Но, как уже сказал 0x10 ссылка должна быть инициализирована, т.е. указывать на объект.

А если хочется сделать код максимально похожий на код ТС, то можно предложить такой вариант:
C++
1
2
3
4
5
6
7
8
int i = 0;
void someFoo(int important, int &additional = i) 
{
    if (additional) 
    {
        
    }
}
Однако, здесь не стоит путать нулевое значение целого аргумента и отсутствие значения (как можно было бы интерпретировать с nullptr).
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
24.02.2014, 18:44  [ТС]     Опциональный ссылочный аргумент функции #5
Tulosba, безопасно ли делать нечто подобное?
C++
1
2
3
4
5
6
7
8
9
10
11
12
string Foo(string & str = string())
{
//something to exit
Foo(str);
//something to calc
return str;
}
 
int main()
{
Foo();
}
Вроде как должно же быть? По сути, объект создатся локально один раз, будет отправлен по ссылке в рекурсию, после чего вернется в свою проматерь, где создастся его копия, которая вернется в return, а сам он помрет?

Добавлено через 6 минут
Если это нормально, то, выходит, впорядке будет и такое:
C++
1
2
3
4
void Foo(double & x = double(0))
{
//те же условия
}
? Точнее, должно быть впорядке, однако создать подобным образом аргумент примитивного типа не выйдет, а создавать глобавльную переменную - не выход.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.02.2014, 20:14     Опциональный ссылочный аргумент функции #6
nexen, во-первых, рекурсия бесконечная. Во-вторых, чтобы это собиралось, надо хотя бы ссылку сделать константной. Ну и с double отличий тогда не будет никаких от варианта со string.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
24.02.2014, 20:27  [ТС]     Опциональный ссылочный аргумент функции #7
Tulosba, в рекурсии я в комментах написал, что есть условие на выход.
Без константной ссылки собирается. Проверено.
А double(0) не собирается для неконстантной ссылки, так что тут другое. А хотелось бы, чтобы собиралось
DrOffset
6909 / 4102 / 933
Регистрация: 30.01.2014
Сообщений: 6,896
24.02.2014, 20:36     Опциональный ссылочный аргумент функции #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Во-вторых, чтобы это собиралось, надо хотя бы ссылку сделать константной
Это так в соответствии со стандартом (нельзя привязывать не константную ссылку к rvalue), однако студия 2010 и ниже нарушала это правило и позволяла эту конструкцию (как расширение языка).

Добавлено через 19 секунд
Цитата Сообщение от nexen Посмотреть сообщение
Без константной ссылки собирается. Проверено.
См. мой ответ
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.02.2014, 20:53     Опциональный ссылочный аргумент функции #9
Цитата Сообщение от DrOffset Посмотреть сообщение
однако студия 2010 и ниже
судя по всему и 2012 допускает.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
24.02.2014, 20:55  [ТС]     Опциональный ссылочный аргумент функции #10
Tulosba, DrOffset, но что же тогда делать? Хочется ведь не передавать лишних параметров в функцию, а сделать для рекурсии локальную карту (std::map) для некоторых внутренних нужд, которая должна быть доступна из любого уровня рексии. 2008 студия позволила сделать то, что я описывал выше, благодоря чему такой финт с map работал, но с const map<>& такое не сработает, ибо константа..
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.02.2014, 20:59     Опциональный ссылочный аргумент функции #11
Цитата Сообщение от nexen Посмотреть сообщение
для некоторых внутренних нужд, которая должна быть доступна из любого уровня рексии.
Так может быть это должно быть полем класса?
DrOffset
6909 / 4102 / 933
Регистрация: 30.01.2014
Сообщений: 6,896
24.02.2014, 21:02     Опциональный ссылочный аргумент функции #12
Цитата Сообщение от Tulosba Посмотреть сообщение
судя по всему и 2012 допускает.
Да. Однако странная разница в поведении, когда меняется тип с встроенного на не встроенный.

Добавлено через 2 минуты
Цитата Сообщение от nexen Посмотреть сообщение
но что же тогда делать?
В С++11 есть rvalue references.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
25.02.2014, 15:00  [ТС]     Опциональный ссылочный аргумент функции #13
DrOffset, можете пример с r-ref показать?
DrOffset
6909 / 4102 / 933
Регистрация: 30.01.2014
Сообщений: 6,896
25.02.2014, 15:09     Опциональный ссылочный аргумент функции #14
Цитата Сообщение от nexen Посмотреть сообщение
можете пример с r-ref показать?
C++
1
2
3
4
string Foo(string && str = string())
{
    return str;
}
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
25.02.2014, 16:24  [ТС]     Опциональный ссылочный аргумент функции #15
DrOffset, а она разве в случае, когда нужно сделать рекурсию с внутренними данными поможет?
DrOffset
6909 / 4102 / 933
Регистрация: 30.01.2014
Сообщений: 6,896
25.02.2014, 16:30     Опциональный ссылочный аргумент функции #16
Цитата Сообщение от nexen Посмотреть сообщение
а она разве в случае, когда нужно сделать рекурсию с внутренними данными поможет?
Честно говоря не очень понята эта формулировка.
Но смысл она (rvalue reference) несет тот же, что и в записи с неконстантной ссылкой. Временный объект не копируется, привязывается к ссылке с именем str.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
25.02.2014, 17:07  [ТС]     Опциональный ссылочный аргумент функции #17
DrOffset, я про то, что писал выше:
C++
1
2
3
4
5
6
7
8
9
10
11
12
string Foo(string & str = string())
{
//something to exit
Foo(str);
//something to calc
return str;
}
 
int main()
{
Foo();
}
Мне изначально это нужно было, чтобы вызывать функцию без аргументов да так, чтобы внутри неё формировался некоторый массив ответов (в примере это строка), а затем уже возвращалась копия того локального массива, который создавался в функции (конечно, жаль, что копия, а не сам объект, но что поделать). Разве в этом случае && мне поможет?
DrOffset
6909 / 4102 / 933
Регистрация: 30.01.2014
Сообщений: 6,896
25.02.2014, 19:05     Опциональный ссылочный аргумент функции #18
Цитата Сообщение от nexen Посмотреть сообщение
Разве в этом случае && мне поможет?
За исключением того, что в твоем примере изначально бесконечная рекурсия, не вижу причин почему нет?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
25.02.2014, 20:42  [ТС]     Опциональный ссылочный аргумент функции #19
DrOffset, как я уже отвечал выше, я же в комментариях написал, что есть нечто, для выхода из функции "//something to exit" - 3 строка.
То есть && может выполнять ту же функцию, что и &?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2014, 21:04     Опциональный ссылочный аргумент функции
Еще ссылки по теме:

Аргумент функции - массив строк - C++
есть массив строк string *conns = new string; нужно сделать функцию, которая его бы изменяла void func( ??? ) {}

Аргумент argv в функции main() - C++
Здравствуйте. Возникли некоторые непонимания при работе с аргументом argv и указателями в целом. Мне сказали, что, при передаче...

Произвольный объект как аргумент функции - C++
Здравствуйте! Подскажите, пожалуйста, можно ли функции передавать произвольный объект? В Java есть такая конструкция: public...

Указатель массива как аргумент функции - C++
Я прочитал несколько алгоритмов сортировки массивов, но не совсем понял, если массив чисел будет передан в аргумент функции через...

Абстрактный класс, как аргумент функции - C++
добрый день. есть базовый класс Tag внем строковое поле Name есть производные от него класы SmplTag со строковым полем Value и класс...


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

Или воспользуйтесь поиском по форуму:
DrOffset
6909 / 4102 / 933
Регистрация: 30.01.2014
Сообщений: 6,896
25.02.2014, 21:04     Опциональный ссылочный аргумент функции #20
Цитата Сообщение от nexen Посмотреть сообщение
DrOffset, как я уже отвечал выше, я же в комментариях написал, что есть нечто, для выхода из функции "//something to exit" - 3 строка.
То есть && может выполнять ту же функцию, что и &?
Может быть стоит попробовать, а потом задать вопросы, если не получится?
Yandex
Объявления
25.02.2014, 21:04     Опциональный ссылочный аргумент функции
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru