программирование на с++ базовая вещь

У меня простой вопрос, потому что я не правильно понимаю функциональность. Имея такой код:

int function(a, b)
{
 return a*b;
}

для меня ясно, что если a и b являются int, то он возвращает результат. Однако имея такие:

int function1(arg1, arg2)
{
 //something
 if (B)
 {
  //do something
  return;
  }
 arg1[0] = variable1;
 arg1[1] = variable2;
 arg2 = variable3;
 return;
}

Я хочу назвать интерфейсы, то есть входы и выходы, и поместить тело функции в «черный ящик». Входные данные — это те, которые являются аргументами функции, я прав? Затем выводятся целочисленные массивы arg1 и целочисленные arg2, верно? Если да, то как ввод может быть выводом, или, если я ошибаюсь, как его идентифицировать? Кроме того, что произойдет, если B истинно в точке возврата? function1 ничего не возвращает? Если да, то почему не тип void? извините за небольшой хаос и такой забавный пример, но благодаря этому я смогу понять концепцию.


person berndh    schedule 26.11.2012    source источник
comment
Не понятно, что вы хотите сказать. Что такое черный ящик?   -  person Coding Mash    schedule 26.11.2012
comment
Аргументы вашей функции не имеют типов. Это псевдокод?   -  person Cameron    schedule 26.11.2012
comment
Я думаю, что он сбит с толку идиомой в C/C++, где некоторые входные данные изменяются и, таким образом, также являются выходными по сравнению с одним выходным по типу возвращаемого значения.   -  person im so confused    schedule 26.11.2012
comment
Пробовали ли вы скомпилировать реальный код C++, который выглядит так? Я примерно на 72% уверен, что компилятор не позволит вам ничего вернуть, если вы сказали, что возвращаете целое число (по крайней мере, за пределами main).   -  person cHao    schedule 26.11.2012
comment
Я хочу распознавать входы-выходы, знать правило этого (черный ящик — это что-то внутри, тело функции), это мой псевдокод, где я хотел сразу указать на все непонятные для меня вещи. Я также уверен, что он не скомпилируется :) дело в том, почему входные данные могут быть выходными и как это распознать. В матлабе это так просто.   -  person berndh    schedule 26.11.2012
comment
Входы могут быть выходами только в том случае, если функция принимает их по указателю или ссылке. Вы узнаете, возможно ли это, по [], * или & (и, как правило, по отсутствию const) в объявлении для данного параметра. Однако вы узнаете наверняка, только прочитав код или какую-нибудь достойную документацию.   -  person cHao    schedule 26.11.2012
comment
В C++ все аргументы являются входными данными. Однако некоторые аргументы могут указывать или ссылаться на другие объекты, которые функция может изменять. В общем, вы не можете сказать, учитывая только интерфейс, изменяет ли что-либо данная функция. Для этого вам нужна отдельная документация, написанная людьми на естественном языке.   -  person n. 1.8e9-where's-my-share m.    schedule 26.11.2012
comment
ах, хорошо, идея состоит в том, чтобы отправить ввод по указателю или ссылке, если я хочу его обновить. Сначала очистите, затем введите новое значение, и оно не обязательно должно быть в выражении return в конце функции, верно? могу ли я сделать такое в функции, возвращающей void? если да, то для чего мне нужна функция с возвратом? вероятно, при использовании этой функции как части некоторого уравнения, где я хотел бы получить какое-то целое число вместо нее, хорошо ли я думаю?   -  person berndh    schedule 26.11.2012
comment
Предпочитайте функции, которые ничего не изменяют и возвращают результат с помощью оператора return. Передавайте по ссылке, когда вам нужно изменить значение, которое слишком дорого или неудобно копировать в функцию и обратно. Полностью избегайте указателей, пока не изучите язык побольше (и даже тогда предпочтите умные указатели необработанным).   -  person n. 1.8e9-where's-my-share m.    schedule 26.11.2012


Ответы (2)


Этот код на самом деле недействителен C++:

int function(a, b)
{
 return a*b;
}

Это неверно, потому что параметры функции должны иметь тип, а a и b не имеют указанного типа. Это будет действительным:

int function(int a, int b)
{
 return a*b;
}

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

template<class Val>  Val function(Val a, Val b)
{
  return a*b;
}

Это будет работать для любого типа (например, int), если этот тип имеет смысл при использовании с operator*, как и с a*b. Например, std::string не будет работать.

В C++ все функции, объявленные для возврата типа, должны возвращать этот тип в каждой точке возврата. Это делает этот код также недействительным:

int function1(arg1, arg2)
{
 //something
 if (B)
 {
  //do something
  return;
  }
 arg1[0] = variable1;
 arg1[1] = variable2;
 arg2 = variable3;
 return;
}

Вы не можете вернуть void из функции, объявленной для возврата int. Если вам нужно «убежать» от функции, которая объявлена ​​возвращающей что-то, вы можете создать исключение:

int function1(arg1, arg2)
{
 //something
 if (B)
 {
  //do something
  throw std::runtime_error("whoops");
  }
 arg1[0] = variable1;
 arg1[1] = variable2;
 arg2 = variable3;
 throw std::runtime_error("whoops 2");
}

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

person John Dibling    schedule 26.11.2012
comment
У меня есть некоторые знания С++, в смысле, я знаю, например, использование шаблонов. Я только что немного запутался с вводом-выводом, и когда у меня так много возвратов, некоторые из них вложены в условия if. Не подскажете, как поставить часть исключения try и catch в таком случае? Если я правильно понимаю, при выполнении условия B выдается возглас, и он выпрыгивает из функции 1 ... в место, где находится ловушка или попытка? - person berndh; 26.11.2012
comment
Я на самом деле не думаю, что исключения являются подходящим инструментом для этой работы, учитывая мое понимание того, чего вы пытаетесь достичь. Однако, чтобы ответить на ваш вопрос, вы заключаете вызов function в блок try, а сразу за ним следует серия блоков catch. Опять же, я очень сомневаюсь, что это то, что вам нужно. - person John Dibling; 26.11.2012

Если B равно true, функция возвращает значение до заполнения выходного массива, но вам все равно нужно вернуть что-то, поскольку функция имеет тип возвращаемого значения "int".

Что касается того, являются ли параметры входными параметрами или выходными параметрами, это зависит от вас. Однако соглашение в C++ заключается в том, что входные параметры являются константными (если они являются указателями или ссылками) и непостоянными, если они являются выходными параметрами:

int function1(const int* arg1, int* arg2) // arg1 is an in param, arg2 is an out param
person user1610015    schedule 26.11.2012
comment
спасибо! Могу ли я быть уверен в таком случае, что, читая аргументы function1, я могу построить свой интерфейс ввода и вывода? Потому что я думаю, что функция также может изменять какую-то глобальную переменную, которой нет среди аргументов. так ли это? - person berndh; 26.11.2012