13

私が想定する質問に対するお詫びは非常に基本的なものです。

演算子::と。の違いをオンラインで見つけるのに問題があります。C++で

私はC#とJavaで数年の経験があり、を使用するという概念に精通しています。メンバーアクセスの演算子。

これらがいつ使用されるのか、そしてその違いは何かを誰かが説明できますか?

御時間ありがとうございます

4

7 に答える 7

23

違いは、1 つ目はスコープ解決演算子であり、2 つ目はメンバー アクセス構文です。

そのため、::(スコープ解決) を使用して、ネストされたクラスなどの名前空間内のさらに何かにアクセスしたり、静的関数にアクセスしたりできます。ピリオド演算子は、.それを使用しているクラス インスタンスの可視メンバーにアクセスするだけです。

いくつかの例:

class A {
    public:

        class B { };

        static void foo() {}
        void bar() {}
};

//Create instance of nested class B.
A::B myB; 

//Call normal function on instance of A.
A a;
a.bar();

//Call the static function on the class (rather than on an instance of the class). 
A::foo(); 

静的関数またはデータ メンバーは、そのクラスのインスタンスを作成したかどうかに関係なく、クラス自体に属するものであることに注意してください。したがって、クラスに静的変数があり、そのクラスの 1000 個のインスタンスを作成した場合、その静的変数のインスタンスは 1 つしかありません。ただし、クラスのインスタンスごとに 1 つずつ、静的ではない他のメンバーのインスタンスが 1000 あります。

あなたがそれに来るときのためのもう一つの興味深いオプション:) また、見るでしょう:

//Create a pointer to a dynamically allocated A.
A* a = new A();

//Invoke/call bar through the pointer.
a->bar();

//Free the memory!!! 
delete a;

動的記憶についてまだ学んでいない場合は、少し混乱する可能性があるため、詳細には触れません。::{または.または}でメンバーにアクセスできることを知ってもらいたかっただけです->:)

于 2012-07-11T22:14:55.437 に答える
7

C++ では::、スコープ解決演算子です。名前空間と静的メソッドを区別するために使用され、基本的にオブジェクトがない場合に使用されます。Where.は、オブジェクト内のものにアクセスするために使用されます。

C# では、.両方に演算子を使用します。

namespace Foo
{
    public class Bar
    {          
        public void Method()
        {
        }

        public static void Instance()
        {
        }

    }
}

C# では、次のようなコードを記述します。

var blah = new Foo.Bar();
blah.Method();

しかし、同等の C++ コードは次のようになります。

Foo::Bar blah;
blah.Method();

ただし、オブジェクトを参照していないため、スコープ解決演算子を使用して静的メソッドにもアクセスすることに注意してください。

Foo::Bar::Instance();

ここでも、C# コードはドット演算子のみを使用します。

Foo.Bar.Instance();
于 2012-07-11T22:15:09.757 に答える
4

::名前空間と静的メンバー アクセス用です。C# では、代わりに名前空間にドット演算子を使用します。

.非静的メンバー アクセス用です。

網羅的な説明ではありませんが、C# と Java に照らして混乱させる可能性のある関連ビットです。

詳細については、次を参照してください。

IBM - スコープ解決演算子

IBM - ドット演算子

于 2012-07-11T22:14:39.580 に答える
2

::はスコープ解決演算子であるため、名前空間やクラスなどのスコープを解決するときにそれを使用します。メンバー アクセスの場合は、.

于 2012-07-11T22:15:06.103 に答える
1

名前空間やクラスを理解していないと、スコープ演算子::を理解するのが難しい場合があります。名前空間は、コード内のさまざまなものの名前のコンテナーのようなものです。これらは通常、ライブラリ間で共通の名前のあいまいさを解消するために使用されます。両方の名前空間stdと言っexampleて、関数を持っていますfoobar()。したがって、コンパイラは使用する関数を認識しているため、前にまたはのいずれかを追加しstd::foobar()ますexample::foobar()

この::演算子は、クラスまたは構造体で宣言された関数を定義する必要があることをコンパイラに伝えるときにも使用できます。例えば:

class foobar()
{
  public:
  void hello();
  int number; //assume there is a constructor that sets this to 5
}

void foobar::hello()
{
  cout << "Hello, world!" << endl;
}

演算子は、.クラスまたは構造体のメンバーを使用する場合に使用されます。例えば:

foobar foo;
foo.hello();
cout << foo.number << endl;

コンストラクターを記述することによってクラスが完成すると仮定すると、この出力は次のようになると予想されます。

Hello, world!
5
于 2012-07-11T22:29:49.007 に答える
0

C++ では、スコープ::を識別するためのものです。これは、名前空間スコープまたはクラス スコープを意味します。

例えば。

int x;

namespace N {
    int x;

    struct foo {
        static double x;
        double y;    
    };
    struct bar: public foo {
        double y;
    };
}

int main()
{
    int x; // we have a local, hiding the global name
    x = ::x; // explicitly identify the x in global scope
    x += N::x; // explicitly identify the x in namespace N

    N::foo::x = x; // set the static member of foo to our local integer
    N::foo f;
    f.y = f.x; // the static member is implicitly scoped by the object
    f.y += N::foo::x; // or explicitly scoped

    N::bar b;
    assert(b.x == N::foo::x); // this static member is inherited
    b.y = b.x; // we get N::bar::y by default
    b.N::foo::y = b.y; // explicitly request the hidden inherited one
}

// we need to define the storage for that static somewhere too ...
int N::foo::x (0.0);
于 2012-07-11T22:29:16.107 に答える
0

.プログラムで作成されたクラスのメンバーにアクセスするときは、Javaでも同じ演算子を使用します。これ::は多くの場合に使用されます。

特定のクラスの .h/.cpp でメソッドを定義するときは、次のように記述します。

class::methodName()

プロトタイプを作成するため、または実装するため。

また、使用する名前空間を明示的に指定しない場合は、それを使用する必要があります

std::cout << "This is the output";

ただ使うのではなくcout << "This is the output;

もっとあるかもしれませんが、今は覚えていません。私の C++ は少し錆びています。

于 2012-07-11T22:17:39.633 に答える