254 Часть II. Программирование на C++
struct TWO{
int a, b;
} two;
TWO ModifyTwo( struct TWO t) (
t.a = 5;
t.b = 6;
return t;
}
Такой подход работоспособен. Копия TWO модифицируется и возвращается функцией ModifyTwo. Иногда этого достаточно, чтобы реализовать ваши замыслы. Однако вы вряд ли захотите городить лишние структуры только для того, чтобы изменить несколько значений. Кроме того, нередко бывает необходимо модифицировать сам передаваемый объект, а не его копию.
Итак, если вам надо модифицировать более одного значения и к тому же сами объекты, а не их копии, передавайте аргументы по ссылке (по ранее изложенным причинам предпочтительнее ссылка через операцию получения адреса). Допустим, необходимо изменить два объекта — для простоты они будут целочисленными — передаваемые в качестве аргументов функции. Определим функцию следующим образом:
void ModifyTwo( int & a, int & b) {
а = 5;
b = 6;
}
void main() (
int j = 1;
int k = 2;
ModifyTwo( j, k);
cout « j « " " « k; //Выводит 5 и 6 }
Если бы аргументы передавались функции ModifyTwo по значению, то функция main вывела бы 1 и 2 соответственно, потому что вместо а и b изменились бы их копии.
Списки аргументов переменной длины
г
Списки аргументов переменной длины (variadic arguments) исторически используются в таких функциях, как printf и scanf. Многоточие на месте параметров указывает на то, что число и тип аргументов неизвестны функции до времени ее исполнения. Такая гибкость не дается даром, поскольку при вызове подобной функции приходится производить дополнительную