C++:ポインタの概要(2)>参照について – 参照仮引数

CやC++において重要なポインタに関連する機能である参照についてのメモ。
ここで言う参照とは、変数とは別の名前で機能する暗黙的なポインタのことで、参照とポインタは別のものなので注意。

参照について(1)

参照には次の3つの用途がある。

参照の3つの用途

  1. 参照は関数に渡すことができる
  2. 関数から参照を返すことができる
  3. 独立した参照(独立参照)を定義することができる(※)

今回は1番目の「参照は関数に渡すことができる」についての説明。
※3つ目の独立した参照に関しては一般的ではないため説明は割愛する。

参照を関数に渡す

以下は関数の引数にポインタと参照を使用した場合のそれぞれのサンプルコード。

引数がポインタの場合
#include <iostream>
using namespace std;

// プロトタイプ宣言
void myfunc(int *n); // 引数はポインタ

int main(int argc, const char * argv[])
{
    int i = 0;
    
    myfunc(&i);
    
    cout << "i = " << i << "\n"; //関数の中で変数の値が書き換わる
    
    return 0;
}

void myfunc(int *n)
{
    // 引数がポインタの場合は 関節演算子 * を使用し値にアクセスする
    *n = 100;
}
[/code]
</dd>

<dt>引数が参照(参照仮引数)の場合</dt>
<dd>
[code]
#include <iostream>
using namespace std;

// プロトタイプ宣言
void myfunc(int &n); // 引数は参照(参照仮引数)

int main(int argc, const char * argv[])
{
    int i = 0;
    
    myfunc(i); // 呼び出し時の引数に & は必要ない
    
    cout << "i = " << i << "\n"; //関数の中で変数の値が書き換わる
    
    return 0;
}

void myfunc(int &n)
{
    // 自動的に変数のアドレスが渡されるため変数の前に & や * は必要ない
    n = 100;
}
[/code]
</dd>
</dl>
</dd>

</dl>


参照はオブジェクトの引渡しにも使用することが出来る。オブジェクトの値渡しと参照による引き渡しのサンプルコードは以下のとおり。
<dl>
<dt>オブジェクトの値による引き渡し</dt>
<dd>
[code]
#include <iostream>
using namespace std;

class Sample {
    int a;
public:
    Sample(int n) {
        a = n;
        cout << "コンストラクタ" << a << "\n";
    }
    ~Sample() {
        cout << "デストラクタ" << a << "\n";
    }
    int ret(){ return a; }
};

// オブジェクトを値で渡す
void myfunc(Sample o)
{
    cout << "値渡し" << o.ret() << "\n";
}

int main(int argc, const char * argv[])
{
    Sample s(10);
    myfunc(s);
    
    return 0;
}
[/code]
</dd>
<dt>結果</dt>
<dd>
[code]
コンストラクタ10
値渡し10
デストラクタ10
デストラクタ10

※デストラクタはmyfunc()終了時の「オブジェクトのコピーが破棄された時」と、「プログラム終了時」の2回呼び出される。

オブジェクトの参照による引渡し
#include <iostream>
using namespace std;

class Sample {
    int a;
public:
    Sample(int n) {
        a = n;
        cout << "コンストラクタ" << a << "\n";
    }
    ~Sample() {
        cout << "デストラクタ" << a << "\n";
    }
    int ret(){ return a; }
};

// オブジェクトを参照で渡す
void myfunc(Sample &o)
{
    cout << "参照渡し" << o.ret() << "\n";
}

int main(int argc, const char * argv[])
{
    Sample s(10);
    myfunc(s);
    
    return 0;
}
[/code]
</dd>
<dt>結果</dt>
<dd>
[code]
コンストラクタ10
参照渡し10
デストラクタ10

※参照(仮参照引数)を使用してオブジェクトを引き渡すと、関数実行時に引渡しのオブジェクトのコピーが作成されないため、デストラクタの呼び出しはプログラムの終了時の1回だけとなる。

まとめ

参照はポインタではないので、メンバにアクセスするときにはドット演算子を使用する。次回は関数から参照を返すサンプルコードと参照を返すことのメリットを執筆予定。

この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。

siro:chro 無料ゲーム SQN をリリースしました

img_sqn_00

sirochro 初の無料ゲームアプリ SQN をリリースしました。
記事:SQN: iOS 無料ゲームアプリ SQN - Sequential Numbers をリリース
ちょっとした時間に楽しめる完全無料のゲームなっていますので、是非ダウンロードして遊んでみてください。

↓SQN のダウンロードはこちらから

Related Contents

Pickup Contents