これが機能するかどうか、そしてどのように機能するのか疑問に思います:
class sample
{
int i;
int func1()
{
int i = 0;
i++;
return i;
}
}
私が尋ねる理由は、私には多くのメンバー関数と悪い名前の慣習があるからです。
これが機能するかどうか、そしてどのように機能するのか疑問に思います:
class sample
{
int i;
int func1()
{
int i = 0;
i++;
return i;
}
}
私が尋ねる理由は、私には多くのメンバー関数と悪い名前の慣習があるからです。
クラスメンバーを非表示にint i = 0
するという新しい変数を作成していると言うとき。i
クラスにアクセスしたい場合はi
、を行うことができますthis->i
。しかし、そもそもそのような混乱を引き起こさない方が通常は良いでしょう。
の本文内でfunc1
、ローカルで宣言されたを参照しint i
ます。this
クラスメンバーを参照するには、ポインターを使用して明示的に参照する必要があります。
this->i
this
現在のインスタンスを表すためにクラス内のすべてのメソッドに渡されるconstポインターです。static
もちろんメンバー機能がある場合は渡されません。
ローカルで宣言されたものが最初に使用される理由は、およびとint i
同じスコープ内にあるためです。i++
return i
正常に動作します。関数内での名前の使用はすべて、その関数内で宣言されi
たものを参照します。i
つまり、関数は毎回1を返します。
戻り値は、実際にはi
in で宣言されたを参照しfunc1()
ます。それはすべてスコープに関するものです。
スコープは で始まり、{
で終わり}
ます。スコープ内で宣言されたすべての変数は、スコープ内にいる限り、または別のスコープに入った場合にのみ定義されます。したがって
{ int i = 0; { int i = 1; { int i = 2; }}}
完全に可能です。スコープの 1 つで使用する場合i
は、常にi
同じスコープで を参照します。i
より高いスコープのを参照することは、より困難です。
あなたの例では、i
を使用してトップを参照できますthis->i
。ここthis
で、 は作業中のオブジェクトへのポインターです。詳細はこちら(少し下にスクロール)。
func1() 内の i の意図は何ですか。関数の外側の i または内側の i をインクリメントしますか。外側の i をインクリメントしたい場合、これは機能しません。
スコープで奇妙なことが起こります:
int func1()
{
int i = 0;
i++;
{ //1
int i = 41;
i++;
}
{ //2
int j = i + 1;
cout << j << endl // this prints 2
}
return i;
}
スコープ内で変数を使用するときの規則は、常に最もローカルなスコープを最初に参照し、それを上に移動することです。したがって、あなたの例では、関数内はクラス内i
を参照しません。i