Прежде чем я дам ответ на ваш вопрос (вы найдете его в конце этого поста), вот краткое описание возможностей, которые вы имеете для передачи аргументов в функцию:
1.Объекты копирования (передача по значению):
void cp(point p);
Это передача по значению.Временный объект point
создается и копируется из любого объекта point
, который вы передаете в cp
.Как только выполнение покидает функцию cp
, временный объект уничтожается.
Обратите внимание, что поскольку функция работает с копией всего, что было передано функции, вы можете изменить этот локальный объект point
столько, сколькоВы хотите, оригинальный объект звонящего не будет затронут.Невозможно изменить это поведение с помощью параметров передачи по значению.
2.Ссылки на объекты (передача по ссылке):
void cp(point& p);
Это передача по ссылке.Фактический объект, переданный функции, доступен (и потенциально может быть изменен) внутри функции.Если вы не хотите, чтобы функция могла изменять переданный объект, объявите параметр как const point&
:
void cp(const point& p);
3.Указатели на объекты (передача по ссылке):
void cp(point* p);
Это также передача по ссылке, с небольшими различиями.Одно заметное отличие состоит в том, что вы можете передать нулевой указатель на функцию.Это невозможно с ссылками, поскольку ссылки должны быть инициализированными и не могут быть переустановлены впоследствии.- Как и в случае со ссылками, если вы хотите запретить cp
изменять переданный point
, объявите его как const:
void cp(const point* p);
Ответ на свой вопрос:
Параметры передачи по значению не являются плохими по своей природе.Конечно, существуют типы, для которых копирование является дорогостоящим (например, очень большие или сложные объекты), или когда оно имеет определенные побочные эффекты (например, с std::auto_ptr
).В этих случаях вы должны быть осторожны.В противном случае это просто еще одна особенность C ++, которая имеет вполне разумное применение.