ショッピングモール  Operating Systems / Microsoft ( Windows ME )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5233

参照変数のスコープ
投稿者---あかま(2006/01/05 17:56:55)


C++なのですが、参照変数のスコープが「ローカル変数を参照したとき」と、「クラスメンバを参照したとき」で変わってしまうようなのです。

次のプログラムを実行すると、

#include <iostream>
using namespace std;

void test(int i){
    int a=1,b=2;
    int &out = a;//ローカル変数を参照

    if(i){
        test(i-1);
    }
    else{
        out = b;
    }
    cout << "out=" << out << endl;//iが真ならaが,偽ならbが出力される

}

int main(){
    test(1);
    return 0;
}


----出力----
out=2
out=1
------------
となります。参照変数outはローカル変数なので、再帰先で変更されても戻ってくればそのままです。
しかしtestにクラスを被せて、変数a,bをクラスメンバとします。

#include <iostream>
using namespace std;
class nazo{
    int a,b;
    public:
    nazo():a(1),b(2){}
    void test(int);
};
void nazo::test(int i){
    //int a=1,b=2;//クラスメンバに変更

    int &out = a;//outはローカルのまま

    if(i){
        test(i-1);
    }
    else{
        out = b;
    }
    cout << "out=" << out << endl;
}

int main(){
    class nazo obj;
    obj.test(1);
    return 0;
}

----出力----
out=2
out=2
------------
すると再帰先で変更されたoutが、再帰元でも変更されてしまうのです。
どうやらスコープがクラスメンバと同じになっている?ようなのですが、なぜこのようなことが起こるのかご存知の方いらっしゃいませんか?
参照について調べてみましたがどうにも見つかりません。
環境はbccとgccで試しましたが両方とも同じ挙動を示しますので、もしかしたら規格がそうなっているのかもしれないのですが。




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:参照変数のスコープ 5234 とおり 2006/01/05 18:27:44
<子記事> Re:参照変数のスコープ 5235 YuO 2006/01/05 18:31:57
<子記事> Re:参照変数のスコープ 5237 nop 2006/01/05 18:33:00


No.5234

Re:参照変数のスコープ
投稿者---とおり(2006/01/05 18:27:44)


>どうやらスコープがクラスメンバと同じになっている?ようなのですが、

参照とは何の関係もない話です。
ローカル変数の場合、再帰呼び出し元と先で異なるローカル変数aを
指しますが、クラスメンバ変数の場合、再帰元でも先でも同じもの
(どちらもmain関数で作られたobj内のa)を指しているというだけです。
同じものならば、変更した値がそのままなのは当然です。


この投稿にコメントする

削除パスワード

No.5236

Re:参照変数のスコープ
投稿者---とおり(2006/01/05 18:32:17)


>参照とは何の関係もない話です。

補足。
参照変数(int& out)自体のスコープとは無関係な話で、outが指す先が
何者かという点だけが重要。


この投稿にコメントする

削除パスワード

No.5235

Re:参照変数のスコープ
投稿者---YuO(2006/01/05 18:31:57)


> すると再帰先で変更されたoutが、再帰元でも変更されてしまうのです。
> どうやらスコープがクラスメンバと同じになっている?ようなのですが、なぜこのようなことが起こるのかご存知の方いらっしゃいませんか?

nazo::aを参照しているのですから当然です。

この場合,nazo::test中にある変数outは,nazo::aの別名と考えてください。
つまり,nazo::testは,
void nazo::test (int i)
{
    if (i) {
        test(i - 1);
    } else {
        a = b;
    }
    cout << "out=" << a << endl;
}

と等価です。



この投稿にコメントする

削除パスワード

No.5237

Re:参照変数のスコープ
投稿者---nop(2006/01/05 18:33:00)


>C++なのですが、参照変数のスコープが「ローカル変数を参照したとき」と、「クラスメンバを参照したとき」で変わってしまうようなのです。

スコープは変わりません。
ローカル変数 out は、関数 test() でのみ使用可能です。
out が示す参照先と、out 自身のスコープは別問題です。


この投稿にコメントする

削除パスワード

No.5238

Re:参照変数のスコープ
投稿者---あかま(2006/01/05 19:58:11)


みなさんありがとうございます。
なにやらものすごい勘違いをしていたようですね。
参照ってポインタで実装してるなーというイメージから、

int *out = &a;
out = &b;

のつもりで

int &out = a;
out = b;//今度はbを指すようになると勘違い

と書いてました。恥ずかしい。
となるといっぺん指した参照先は変えられないんですね。

-------------------
掲示板の主旨からそれちゃいますけどJavaはまた違うのでしょうか?
あまり触ったことないけど、あっちはガリガリ入れ替えてたような。

………

というわけで今触ってみたのですが、Javaは参照先が変わるんですね。
こっちのせいで勘違いしていたと言い訳を…
でもこれだと参照先が変わるだけで値の代入ができない?あれ?



この投稿にコメントする

削除パスワード

No.5239

Re:参照変数のスコープ
投稿者---YuO(2006/01/05 20:20:38)


参照ってポインタで実装してるなーというイメージから、

int *out = &a;
out = &b;

のつもりで

int &out = a;
out = b;//今度はbを指すようになると勘違い

と書いてました。恥ずかしい。
となるといっぺん指した参照先は変えられないんですね。


イメージとしては,
int * const out = &a;

なんですよね。参照先は変更できないので。


というわけで今触ってみたのですが、Javaは参照先が変わるんですね。
こっちのせいで勘違いしていたと言い訳を…


Javaの参照はポインタそのものです。
Javaの.演算子はC++の->演算子です。


でもこれだと参照先が変わるだけで値の代入ができない?あれ?


ポインタそのものなので,代入では参照先が変わるだけになりますね。
値を代入したい場合は,メソッドを定義してやる必要があります。
# AssignFromとかになるのかな。



この投稿にコメントする

削除パスワード

No.5240

Re:参照変数のスコープ
投稿者---あかま(2006/01/05 20:40:33)


>Javaの参照はポインタそのものです。
>Javaの.演算子はC++の->演算子です。

C++ →ただの別名
Java→ポインタ

全然別物なんですね。理解しました。
ありがとうございました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity