8

私が現在働いている会社のコードを見ていると、ファイルがクラスに属している*.cppファイル(たとえば、リスナーのリストを格納するため)に静的グローバル変数の宣言がいくつか(多くはありません)表示されます.h/.cpp。クラス自体によってのみ使用される変数(静的またはその他)の場合、私は常にそれをプライベートとして宣言します。

変数privateを宣言するよりもこれに利点はありますか?これは悪い習慣ですか?または、クラスのみが使用し、他の誰も使用しない静的変数を宣言する場合、これは正常ですか?

編集:私の質問で静的について尋ねましたが、.cppそれがクラスのプライベートメンバーではなく、ファイル内の非静的グローバル変数である場合はどうなりますか?それは悪い習慣ですか、それとも大丈夫だと考えられていますか?この場合の利点はありますか?

4

6 に答える 6

7

文体の観点から、これは大丈夫かもしれないし、そうでないかもしれませんが、スタイルは主観的です。

技術的な観点から、いくつかの違いがあります。

                             +----------------+-------------+
                             | Private Static | File Static |
+----------------------------+----------------+-------------+
|   Visible by includers     |       Yes      |     No      |
+----------------------------+----------------+-------------+
|   Accessible to friend     |       Yes      |     No      |
+----------------------------+----------------+-------------+
|  Accessible to all in TU*  |       No       |     Yes     |
+----------------------------+----------------+-------------+
| Require #include in header |       Yes      |     No      |
+----------------------------+----------------+-------------+

*TU: Translation Unit (roughly put: the source file after include resolution)

したがって、技術的には、staticファイルスコープの変数(または匿名名前空間の変数)は、ソースファイルでそれに続くすべてのコードに表示される(アクセシビリティが多少変更される)ことを除いて、よりプライベートにすることができます。

私は個人的にそれらの客観的な理由でそれらを好みます。クライアントに影響を与えずに変更を加えることがはるかに簡単になるため、ヘッダーをできるだけ空に保つ傾向があります(ほとんどの場合、私はクライアントです!)

注:違いを忘れた場合は、教えて/編集してください

于 2011-03-28T19:15:26.227 に答える
5

この方法の主な利点は、*。hファイル内の「不要な」ものの量を減らすことです。これにより、ファイルや変更時のコンパイル時間や再構築の複雑さがわずかに改善される可能性があり、ヘッダーファイルがわずかに読みやすくなる可能性があります。

(私の意見では、これらの利点は小さいので、通常、クラスに論理的に関連するものをそのクラスのスコープに入れることの明確さを好みます。)

ただし、静的グローバル変数は非推奨であり、C++では不適切な方法です。他に適切なスコープがない場合は、匿名の名前空間を使用する必要があります。

// Instead of this:
static std::list<MyClass*> MyClass_population;

// Do this:
namespace { // anonymous
    std::list<MyClass*> MyClass_population;
}
于 2011-03-28T18:27:15.610 に答える
0

静的は、変数をそのファイルで使用できるようにする場合にのみ意味し、プライベートの場合は、そのクラスでのみ意味します。場合によってはほぼ同じことを行いますが、コンパイル時の変数と実行時の自動変数であるため、最初に静的変数を選択する傾向があります。これはコンパイラの最適化に依存しますが。

于 2011-03-28T18:20:03.930 に答える
0

これは通常、同じファイルにあるクラス間で共有したい関数または変数がある場合に行います。Javaでは、これは(ここで推測しているように)内部クラスを介して達成できると思います。ヘッダーファイルの外部のユーザーに表示されるインターフェイスがそれらに依存しない限り、それは無害だと思います。

于 2011-03-28T18:21:20.713 に答える
0

グローバル変数のようなものはありませstaticん。あなたが見ているのはstaticファイルスコープを持つ変数です。(少なくとも、私のC ++教師はこれらをグローバルとは呼んでいませんでした。標準がこれらを何と呼んでいるかはわかりません。)

ただし、グローバル変数のすべての利点と、1つを除いてグローバルのすべての欠点があります。同じ名前の場合、互いに衝突しません。

たとえば、次のリンクはリンクされません。

// in a.cpp
static int a;
int b;

// in a.cpp
static int a;
int b;

グローバルシンボルbが2回出現するためです。aただし、問題はありません。

staticクラス変数との違いは、それらがヘッダーで発生することです。したがって、それらを変更、削除、または追加するには、すべてのクライアントコードを再コンパイルする必要があります。

于 2011-03-28T18:22:20.317 に答える
0

あなたと同じように、私は通常、ファイル内でグローバルではなくclass static、ファイル内でaを使用することを好みます。.hstatic.cpp

ただし、グローバルを好む場合がありますstatic。これは、ファイルに(変数の型#includeの宣言にアクセスするための)ディレクティブが必要ない場合です。static.h

于 2011-03-28T18:26:54.473 に答える