Передача и возврат объектов в функциях C++
Передача и возврат объектов в функциях C++
Это руководство объясняет, как передавать объекты в функции и возвращать их из функций в C++, с практическими примерами и рекомендации по лучшим практикам.
Пример 1: Передача объектов в функцию
// C++ программа для расчёта средних оценок двух студентов
#include <iostream>
using namespace std;
class Student {
public:
double marks;
// Конструктор для инициализации оценок
Student(double m) : marks(m) {}
};
// Функция, принимающая объекты Student по значению
void calculateAverage(Student s1, Student s2) {
double average = (s1.marks + s2.marks) / 2.0;
cout << "Average Marks = " << average << endl;
}
int main() {
Student student1(88.0), student2(56.0);
calculateAverage(student1, student2);
return 0;
}
Вывод
Average Marks = 72
Здесь мы передали два объекта Student — student1 и student2 — в функцию calculateAverage() по значению. Передача по значению создаёт копии объектов; если объект большой, лучше использовать передачу по ссылке.

Пример 2: Возврат объекта из функции
#include <iostream>
using namespace std;
class Student {
public:
double marks1, marks2;
};
// Функция, возвращающая объект Student
Student createStudent() {
Student student;
student.marks1 = 96.5;
student.marks2 = 75.0;
cout << "Marks 1 = " << student.marks1 << endl;
cout << "Marks 2 = " << student.marks2 << endl;
return student; // NRVO оптимизирует копирование
}
int main() {
Student student1;
student1 = createStudent();
return 0;
}
Вывод
Marks 1 = 96.5 Marks 2 = 75

Функция createStudent() создаёт экземпляр Student, выводит его значения и возвращает. В main() возвращённый объект присваивается переменной student1. Современные компиляторы используют оптимизацию возвращаемого значения (RVO/NRVO), чтобы избежать лишних копирований.
Ключевые моменты
- Передача по значению — простота, но накладные расходы на копирование больших объектов.
- Передача по константной ссылке (
const Student&) — эффективна для чтения без копирования. - Возврат по значению — безопасен благодаря RVO/NRVO в современных компиляторах (C++17 гарантирует copy elision).
- Перемещение (move semantics) — для классов с ресурсами используйте
std::moveи rvalue-ссылки.
Рекомендации
- Для входных параметров только для чтения используйте
const T&. - Возвращайте объекты по значению — компилятор оптимизирует.
- Если нужно изменить объект вызывающей стороны, передавайте по неконстантной ссылке
T&. - Для больших объектов с динамической памятью реализуйте семантику перемещения.
Язык C
- Три основных этапа 3D-печати: подробное объяснение
- Классы и объекты в C#: Фундаменты надёжного ООП
- Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
- Управление памятью в C++: экспертное использование new и delete
- Публичное, защищённое и приватное наследование в C++: подробный разбор
- Дружественные функции и классы в C++: мастерство контроля доступа
- Передача адресов и указателей в функции в C: практическое руководство
- Функции в C++: подробное объяснение с практическими примерами кода
- Защитите свою цепочку поставок: стратегии против киберпреступности, стихийных бедствий и не только
- Полное руководство по дате и времени в C++