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

C++では式の左辺に関数を書ける?参照を返す関数の仕組みを実例で解説

C言語では、式の左辺(左側)に関数名を置くことはできません。一方、C++ではこれが可能です。その鍵となるのが、「参照(リファレンス)」を返す関数です。

C++の関数は、ポインタを返すのとほぼ同じ要領で参照を返すことができます。関数が参照を返す場合、実際には戻り値への暗黙的なポインタが返されるため、その関数呼び出しを代入文の左辺に置けるのです。

C言語との違い

C言語の関数の戻り値はあくまで「値」であり、式の右側にしか書けません。しかしC++では、関数が参照を返すことで、その呼び出し結果は実体そのものを指し示します。つまり、setValues(1) = 20.23; のように書くと、関数が返した参照先(配列の特定要素)へ直接値を代入できるわけです。配列の特定要素へのアクセスを関数でカプセル化したい場合などに、非常に便利なテクニックです。

サンプルコード

次のシンプルなプログラムで、その動作を確認してみましょう。

#include <iostream>
#include <ctime>
using namespace std;
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
double& setValues( int i ) {
    return vals[i]; // i番目の要素への参照を返す
}
// 上記の関数を呼び出すmain関数
int main () {
    cout << "Value before change" << endl;
    for ( int i = 0; i < 5; i++ ) {
        cout << "vals[" << i << "] = ";
        cout << vals[i] << endl;
    }
    setValues(1) = 20.23; // 2番目の要素を変更
    setValues(3) = 70.8;  // 4番目の要素を変更
    cout << "Value after change" << endl;
    for ( int i = 0; i < 5; i++ ) {
        cout << "vals[" << i << "] = ";
        cout << vals[i] << endl;
    }
    return 0;
}

実行結果

Value before change
vals[0] = 10.1
vals[1] = 12.6
vals[2] = 33.1
vals[3] = 24.1
vals[4] = 50
Value after change
vals[0] = 10.1
vals[1] = 20.23
vals[2] = 33.1
vals[3] = 70.8
vals[4] = 50

実行結果を見ると、setValues(1)setValues(3) を左辺に置いた代入によって、配列 vals の2番目と4番目の要素が直接書き換えられていることが分かります。

注意点:参照先のスコープと寿命

参照を返す際には、参照先のオブジェクトが関数終了後も生存していることを必ず確認してください。ローカル変数は関数の終了とともに破棄されるため、その参照を返すのは不正(未定義動作)です。一方、static 変数はプログラム全体で生存し続けるため、安全に参照を返せます。

int& func() {
    int q;
    //! return q; // ローカル変数への参照返却はコンパイル時に警告・エラーの対象
    static int x;
    return x; // 安全:xはこのスコープの外でも生存している
}

このように、C++の参照返却を活用すれば、関数呼び出しをあたかも変数のように扱え、代入文の左辺にも配置できます。ただし、ダングリング参照(無効な参照)を生まないよう、参照先の寿命には常に注意を払いましょう。

  1. Windows 8/8.1はまだ使える?サポート終了後のリスクとWindows 10/11への移行ガイド

    あらゆるサービスにはいつか終わりが訪れます。Windowsも例外ではありません。Microsoftは一定期間が経過すると、意図的にOSへの更新提供を打ち切ります。現在、大多数のWindowsユーザーはWindows 10や11へ移行済みですが、Windows 8/8.1を使い続けることはできるのでしょうか?そして、そもそも使い続けるべきなのでしょうか? 本記事では、Windows 8および8.1のサポート終了時期と、その後も使用すべきかどうかを解説します。さらに、そろそろ移行を検討したい方のために、Windows 10や最新のWindows 11へのアップグレード方法についてもご紹介します。

  2. ローカルホスト(localhost)とは?仕組みから使い方まで徹底解説

    ローカルホストは「ループバックアドレス」とも呼ばれ、自分自身のコンピュータに対してIP接続や呼び出しを確立するために使用される特別なアドレスです。ネットワークの分野では、コンピュータがIPスタックを検証・テストする際によく活用されています。 ネットワーク技術に興味がある方や、ITエンジニアとしてキャリアを積みたい方にとって、localhostのような基本的な用語を正しく理解することは非常に重要です。本記事では、ローカルホストの概要から仕組み、具体的な活用方法まで、初心者にもわかりやすく解説します。 ローカルホストとは何か? ローカルホストは単なる専門用語ではなく、netflix.comや