これをしてはいけない理由はありますか?
はい、これを行うべきではない理由があります。
でメンバー変数を参照することは、次のように名前が非表示になっている場合にのみthis->
厳密に必要です。
class Foo
{
public:
void bang(int val);
int val;
};
void Foo::bang(int val)
{
val = val;
}
int main()
{
Foo foo;
foo.val = 42;
foo.bang(84);
cout << foo.val;
}
このプログラムの出力は42
、ではなく84
、bang
メンバー変数が非表示になっているため、何も実行されval = val
ません。この場合、this->
が必要です。
void Foo::bang(int val)
{
this->val = val;
}
それ以外の場合、使用しthis->
ても効果がないため、必要ありません。
それ自体は、を使用しない理由ではありませんthis->
。ただし、このようなプログラムの保守は、を使用しない理由this->
です。
this->
次の変数がメンバー変数であることを指定するためのドキュメントの手段として使用しています。ただし、ほとんどのプログラマーにとって、それはusignthis->
が実際に文書化するものではありません。this->
ドキュメントの使用とは:
ここに隠されている名前があるので、私はそれを回避するために特別なテクニックを使用しています。
それはあなたが伝えたかったことではないので、あなたのドキュメントは壊れています。
名前がメンバー変数であることを文書化するために使用する代わりにthis->
、メンバー変数とメソッドパラメーターが同じになることのない合理的な命名スキームを一貫して使用してください。
編集 同じアイデアの別の図を考えてみましょう。
私のコードベースで、次のことがわかったとします。
int main()
{
int(*fn)(int) = pingpong;
(fn)(42);
}
非常に珍しい構成ですが、熟練したC ++プログラマーであるため、ここで何が起こっているかがわかります。 fn
は関数へのポインタでありpingpong
、それが何であれ、の値が割り当てられます。そして、が指す関数はpingpong
、単一のint
値で呼び出されます42
。だから、なぜ世界でそのようなギズモが必要なのか疑問に思って、あなたはこれを探しに行きpingpong
、見つけます:
static int(*pingpong)(int) = bangbang;
さて、何bangbang
ですか?
int bangbang(int val)
{
cout << val;
return val+1;
}
「さて、ちょっと待ってください。ここで何が起こっているのですか?関数へのポインタを作成してからそれを呼び出す必要があるのはなぜですか?関数を呼び出すだけではないのですか?これは同じではありませんか?」
int main()
{
bangbang(42);
}
はい、同じです。観察可能な効果は同じです。
それが本当にすべてであるかどうか疑問に思う、あなたは見る:
/* IMPLEMENTATION NOTE
*
* I use pointers-to-function to call free functions
* to document the difference between free functions
* and member functions.
*/
したがって、関数へのポインタを使用している唯一の理由は、呼び出されている関数がメンバー関数ではなくフリー関数であることを示すためです。
それはあなたにとって単なる「スタイルの問題」のように見えますか?それは私には狂気のように見えるからです。