C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でオブジェクトを返す方法とは?サンプルコードでわかりやすく解説


オブジェクトとは、クラスから生成される実体(インスタンス)のことです。メモリが割り当てられるのはクラスを定義した時ではなく、オブジェクトを実際に生成した時点です。

C++では、関数内でreturnキーワードを使うことで、オブジェクトをそのまま戻り値として返すことができます。以下に、Pointクラスを使った具体的なサンプルコードを示します。

サンプルコード

#include <iostream>
using namespace std;
class Point {
    private:
    int x;
    int y;
    public:
    Point(int x1 = 0, int y1 = 0) {
        x = x1;
        y = y1;
    }
    Point addPoint(Point p) {
        Point temp;
        temp.x = x + p.x;
        temp.y = y + p.y;
        return temp;
    }
    void display() {
        cout<<"x = "<< x <<"\n";
        cout<<"y = "<< y <<"\n";
    }
};
int main() {
    Point p1(5,3);
    Point p2(12,6);
    Point p3;
    cout<<"Point 1\n";
    p1.display();
    cout<<"Point 2\n";
    p2.display();
    p3 = p1.addPoint(p2);
    cout<<"The sum of the two points is:\n";
    p3.display();
    return 0;
}

実行結果

上記プログラムの実行結果は以下の通りです。

Point 1
x = 5
y = 3
Point 2
x = 12
y = 6
The sum of the two points is:
x = 17
y = 9

プログラムの解説

Pointクラスの構造

Pointクラスには、座標を表すint型のデータメンバ(メンバ変数)であるxとyが、privateメンバとして定義されています。さらに、デフォルト引数を持つコンストラクタと、2つのメンバ関数が用意されています。

  • addPoint():引数として受け取ったPointオブジェクトと自分自身の各座標を足し合わせ、その結果を格納したローカルオブジェクトtempをreturn文で返します。
  • display():メンバ変数xとyの値を標準出力に表示します。
class Point {
    private:
    int x;
    int y;
    public:
    Point(int x1 = 0, int y1 = 0) {
        x = x1;
        y = y1;
    }
    Point addPoint(Point p) {
        Point temp;
        temp.x = x + p.x;
        temp.y = y + p.y;
        return temp;
    }
    void display() {
        cout<<"x = "<< x <<"\n";
        cout<<"y = "<< y <<"\n";
    }
};

main()関数の処理の流れ

main()関数内では、Pointクラスのオブジェクトを3つ(p1、p2、p3)生成しています。まずp1とp2の値をdisplay()で表示し、続いてaddPoint()を呼び出して2点の合計を計算し、その結果をp3に格納します。最後にp3の内容を表示しています。

Point p1(5,3);
Point p2(12,6);
Point p3;
cout<<"Point 1\n";
p1.display();
cout<<"Point 2\n";
p2.display();
p3 = p1.addPoint(p2);
cout<<"The sum of the two points is:\n";
p3.display();

オブジェクトを返す際の注意点

オブジェクトを値で返す場合、本来はコピーが発生しますが、近年のコンパイラではRVO(戻り値の最適化)やNRVOといったコピー省略の最適化が行われるため、多くの場面でコピーのコストは抑えられます。

ただし、ローカル変数への参照やポインタを返すのは避けてください。関数の終了とともにローカルオブジェクトは破棄されるため、無効なメモリを参照するダングリング参照の原因となります。オブジェクトを返すときは、このサンプルのように値で返すのが安全で基本的な方法です。

  1. JavaScript関数からオブジェクトを返す方法をわかりやすく解説

    JavaScriptの関数からオブジェクトを返すには、return文を使用します。オブジェクト内のプロパティやメソッドにアクセスする際は、thisキーワードを活用すると便利です。この記事では、実際のコード例を使いながら、JavaScript関数からオブジェクトを返す基本的な方法を解説します。基本的な考え方JavaScriptでは、オブジェクトの中にメソッド(関数)を定義できます。そのメソッド内でreturn文を使えば、処理結果や値を呼び出し元に返すことができます。また、thisキーワードを参照することで、同じオブジェクト内の他のプロパティにアクセス可能です。サンプルコード以下のコードでは、従業

  2. C++で点を別の点を中心として回転させる方法

    原点を中心とした点の回転 点Xを原点を中心として角度θだけ反時計回りに回転させるには、以下の式を使用します。 原点を中心にθだけ反時計回りにXを回転する式: X * polar(1.0, θ) ここで使われている polar 関数は、<complex> ヘッダーファイルで定義されている複素数用の関数で、大きさ(絶対値)と位相角から複素数を生成するために使用されます。polar(mag, angle) を呼び出すと、対応する複素数が返されます。複素数を平面上の点として扱うことで、回転のような幾何学的な操作を簡潔に記述できるのがポイントです。 点Yを中心とした点Xの回転 ある点を別の