Здесь я пишу программу, которая возвращает несколько значений (более двух значений) в c ++. Эта программа является исполняемой в c ++ 14 (G ++ 4.9.2). Программа похожа на калькулятор.
# include <tuple>
# include <iostream>
using namespace std;
tuple < int,int,int,int,int > cal(int n1, int n2)
{
return make_tuple(n1/n2,n1%n2,n1+n2,n1-n2,n1*n2);
}
int main()
{
int qut,rer,add,sub,mul,a,b;
cin>>a>>b;
tie(qut,rer,add,sub,mul)=cal(a,b);
cout << "quotient= "<<qut<<endl;
cout << "remainder= "<<rer<<endl;
cout << "addition= "<<add<<endl;
cout << "subtraction= "<<sub<<endl;
cout << "multiplication= "<<mul<<endl;
return 0;
}
Итак, вы можете четко понимать, что таким образом вы можете вернуть несколько значений из функции. используя std :: pair, могут возвращаться только 2 значения, а std :: tuple может возвращать более двух значений.
new
и delete
операторы могут воздействовать на классы и структуры, тогда как malloc
и free
только работа с блоками памяти, которая должна быть брошена.
Используя new/delete
поможет улучшить Ваш код, поскольку Вы не должны будете бросать выделенную память к необходимой структуре данных.
Если Вы не вынуждены использовать C, Вы должны никогда использование malloc
. Всегда используйте new
.
, Если Вам нужен большой блок данных просто, делают что-то как:
char *pBuffer = new char[1024];
Быть осторожным, хотя это не корректно:
//This is incorrect - may delete only one element, may corrupt the heap, or worse...
delete pBuffer;
Вместо этого необходимо сделать это при удалении массива данных:
//This deletes all items in the array
delete[] pBuffer;
new
ключевое слово является C++ способ сделать его, и это гарантирует, что Ваш тип будет иметь , конструктор звонил . new
ключевое слово - также больше безопасный с точки зрения типов , тогда как malloc
не безопасно с точки зрения типов вообще.
единственный способ, которым я мог думать, что это будет выгодно для использования malloc
, состоял бы в том, если бы Вы должны были к [1 128] изменить размер своего буфера из данных. new
ключевое слово не имеет аналогичного пути как [1 111]. Эти realloc
функция могла бы быть в состоянии расширить размер блока памяти для Вас более эффективно.
стоит упомянуть, что Вы не можете смешаться new
/ free
и malloc
/ delete
.
Примечание: Некоторые ответы в этом вопросе недопустимы.
int* p_scalar = new int(5); // Does not create 5 elements, but initializes to 5
int* p_array = new int[5]; // Creates 5 elements
Если у Вас есть код C, Вы хотите портировать на C++, Вы могли бы оставить любой malloc () вызовами в нем. Для любого нового кода C++ я рекомендовал бы использовать новый вместо этого.
Всегда используйте новый в C++. При необходимости в блоке невведенной памяти можно использовать оператор, новый непосредственно:
void *p = operator new(size);
...
operator delete(p);
От C++ FQA, Облегченный :
[16.4], Почему я должен использовать новый вместо защищенного старого malloc ()?
FAQ: новый/удаленный вызов конструктор/деструктор; новый безопасно с точки зрения типов, malloc не; новый может быть переопределен классом.
FQA: достоинства новых, упомянутых FAQ, не являются достоинствами, потому что конструкторы, деструкторы и перегрузка оператора являются мусором (см. то, что происходит, когда у Вас нет сборки "мусора"?), и проблема безопасности типов является действительно крошечным здесь (обычно, необходимо бросить пустоту* возвращенный malloc к правильному типу указателя для присвоения ее введенной переменной указателя, которая может быть раздражающей, но совсем не "небезопасной").
, О, и использование защищенного старого malloc позволяет использовать одинаково защищенный & старое перевыделение. Слишком плохо у нас нет новейшего оператора, возобновляют или что-то.
однако, новый не достаточно плохо для выравнивания по ширине отклонения от общего стиля, используемого всюду по языку, даже когда язык является C++. В частности, классы с нетривиальными конструкторами будут неправильно себя вести фатальными способами если Вы просто malloc объекты. Итак, почему бы не использовать новый всюду по коду? Люди редко перегружают новый оператор, таким образом, он, вероятно, не войдет Ваш слишком очень. И если они действительно перегружаются новый, можно всегда просить, чтобы они остановились.
Извините, я просто не мог сопротивляться.:)
Используйте malloc
и free
[только 115] для выделения памяти, которая будет управляемой c-centric библиотеками и API. Используйте new
и delete
(и []
варианты) для всего, чем Вы управляете.