C++関数でのオブジェクトの渡し方と返し方
C++関数でのオブジェクトの渡し方と返し方
このチュートリアルでは、C++でオブジェクトを関数に渡し、関数からオブジェクトを返す方法を、実践的な例とベストプラクティスとともに解説します。
例1: オブジェクトを関数に渡す
// 2人の学生の平均点を計算するC++プログラム
#include <iostream>
using namespace std;
class Student {
public:
double marks;
// 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
ここでは、2つの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)を用いて不要なコピーを回避します。
ベストプラクティス
- 大きなオブジェクトは参照渡し(const参照)を使用 - 不要なコピーを防止
- 移動セマンティクス(C++11以降) -
std::moveを活用してリソースを効率的に転送 - RVO/NRVOを信頼 - コンパイラの最適化に任せ、明示的な
std::moveは返り値では不要なことが多い
C言語
- サプライチェーンを守る:サイバー犯罪、自然災害などへの対抗戦略
- 3Dプリントの3つの必須ステージ:準備・造形・仕上げ
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++メモリ管理の極意:newとdeleteのエキスパート活用法
- C++ public/protected/private継承の違いを徹底解説
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- C言語: アドレスとポインタを関数に渡す – 実践ガイド
- C++関数を実例で徹底解説:基本から応用まで
- C++日付と時刻の完全ガイド:ctimeライブラリの活用
- C++オーバーロード完全マスター:関数と演算子のオーバーロード