C++ と C# との違いと困惑 | vicのブログ

vicのブログ

ツール系やソフト開発について書こうと思っています。
書き込み大歓迎です。
間違いとかもっといい方法とかあったらご指摘いただけるとありがたいです。
質問をいただいたら、記事をもっとわかりやすく変更します。

C++では、

struct で宣言すると

フィールドは全部グローバル宣言

static は 関数内のみ使用可能、その他いろいろ制限有り。
使いづらい。
クラス内で static変数を用意するとややこしいことになり、
たぶん自分がstaticの使い方をよくわかっていないかもしれない。
関数内で使用する場合、ブロックから出てもずっと消えずに覚えてくれるので便利。


C# での struct は、
意味が変わり、
静的にメモリーを保持、

フィールドは、省略すると private

static は クラス内で使用すると、そのクラスのインスタンスをいくら増殖させても
static で宣言された変数は増殖しない。メモリー上に1つしか存在しない。
それのみになる。

ちなみにC++でもC#の static の同様、メモリー上で1つしか存在しないようにできるが、
少々記述ルールがややこしい。

http://www.geocities.jp/ky_webid/cpp/language/019.html



これらの、static変数をうまく使えば、
クラスのクラスの・・・というややこしさの回避を少しでも減らせられるが、
C++の場合、グローバル変数の宣言みたいのをしないといけないのがややこしい。
static変数はインスタンス化されないという仕様(バグ?)は分からず
はまった。
さすがにC#ではそんなことがないので良かった。さすがC++から18年後に開発された言語だけある。



結論から言うと、C++とC#で
なんかしらの微妙な違いがある可能性があるので、
クラスや構造体関係では
public private など省略しない方が無難かもしれない。


さらにまとめで、

static >>> public で宣言しようが自動的に隠蔽化され privateと同じ扱いに(C#)
         public で宣言できるし、効果がある(C++)

C++ では記述がややこしくなり、スコープがすぐに効かなくなる。しかもインスタンス化されない!別途グローバル変数宣言が必要。

とにかく、static を クラス内に使用する場合、注意が必要


グローバル変数の別の書き方と考えるとしっくりくる

つまり、static の場合、フィールドでの変数名がそのままグローバル変数になる、と考える。