7

ここで他の質問を読んでいて、混乱しているものがあります。うまくいけば説明できます。単純なことだと思いますが、それは私をほのめかしています。

したがって、C++ には、クラス内でのみ表示可能なプライベート変数があります。

class MyClass
{
    private:
        int i;
};

しかし、名前のない名前空間を持つこともできます:

namespace
{
    int i;
}

どちらもクラスに対してプライベートであるように見えますが、2 番目のケースでは、ヘッダー ファイルからそれらが存在することを確認できません。他の質問を読むと、クラスオブジェクトを渡すことができないため、関数が異なるようです? しかし、ここで変数の違いが何であるかはわかりません。

プライベート変数を引き続き使用する必要があることを意味する2番目の方法に欠点はありますか?

4

4 に答える 4

15

それらは同じではありません。

i匿名名前空間の整数は、 のすべてのインスタンスで共有されますMyClass

のプライベート整数iMyClass、クラスのインスタンス化ごとに一意になります。

同等の使用は静的privateにすることです:i

//.h
class MyClass
{
    private:
        static int i;
};

iそして、次のように共有される 1 つのシングルをインスタンス化します。

//.cpp
int MyClass::i = 0;
于 2012-08-31T10:56:24.613 に答える
6

どちらもクラス専用のようです...

いいえ、最初のものだけがクラスにプライベートです。これは非静的メンバー変数です。1 つは、クラス タイプのすべてのオブジェクトでインスタンス化されます。

2 番目はクラスにまったく含まれていません。静的ストレージ期間があるため、プログラム全体に対してインスタンス化されます。それにアクセスするものはすべて、それにアクセスする他のものと同じ変数にアクセスしています。名前のない名前空間にあるため、それを定義する翻訳単位 (つまり、ソース ファイル) 内でのみアクセスできます。ただし、特定のクラスだけでなく、そこにある任意のコードからアクセスできます。

プライベート変数を引き続き使用する必要があることを意味する2番目の方法に欠点はありますか?

各クラス オブジェクトに変数のコピーが必要な場合は、それを非静的メンバーにする必要があります。

すべてのオブジェクト間で共有したい場合は、それを静的メンバーにするか、クラスの実装ファイル内の名前空間に配置するかはあなた次第です。クラス定義を単純化するために、後者をよく使用します。欠点は、アクセスがクラスだけに制限されているのではなく、そのファイル内の他のものに制限されていることと、ヘッダーに配置したいコードからアクセスできないことです。

于 2012-08-31T11:56:30.250 に答える
3

名前空間は、オブジェクト/クラスとは無関係です。特に、2 つのオブジェクトがある場合、それぞれにプライベート変数の独自のコピーがあります。

于 2012-08-31T10:56:11.200 に答える
3

それらはまったく異なる概念です。プライベート データ メンバーはクラスにのみ表示され、非静的の場合、各クラス インスタンスはこれらのいずれかを所有します。匿名名前空間を使用すると、コードを同じファイル内の他のコードのみが使用できるようにすることができます。したがって、単一int変数の場合、匿名名前空間と同じ場所で定義されたすべてのコードは、同じ単一変数を参照します。

于 2012-08-31T10:57:57.557 に答える