71

私はC++を学んでいますが、いつ使用する必要があるかわかりません::。とstd::の前で使用する必要があることを私は知っています。これは、ファイル内でそれを作成した開発者がという名前空間を作成し、関数を入れて、という名前空間に入れたということですか?何らかの理由で同じファイルにない新しいクラスを作成したときは、を追加する必要があります。coutciniostreamstdcincoutstdmain()::

たとえば、class呼び出された関数を作成した場合、名前のエースに入れなかったのに、作成した関数の前Aに置く必要があるのはなぜですか?A::たとえばvoid A::printStuff(){}。で関数を作成する場合main、なぜ入れなくてもよいのmain::printStuf{}ですか?

私の質問はおそらく紛らわしいと思いますが、誰かが私を助けてくれますか?

4

5 に答える 5

99

あなたはとについてほとんど正しいcoutですcinstdこれらは、名前空間内で定義されたオブジェクト(関数ではありません)です。C++標準で定義されている宣言は次のとおりです。

ヘッダー<iostream>の概要

#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>

namespace std {
  extern istream cin;
  extern ostream cout;
  extern ostream cerr;
  extern ostream clog;

  extern wistream wcin;
  extern wostream wcout;
  extern wostream wcerr;
  extern wostream wclog;
}

::スコープ解決演算子として知られています。名前coutcinは、内stdで定義されているため、名前を。で修飾する必要がありstd::ます。

クラスは、クラス内で宣言された名前がクラスに属するという点で、名前空間と少し似ています。例えば:

class foo
{
  public:
    foo();
    void bar();
};

指定されたコンストラクターfooは、という名前のクラスのメンバーfooです。コンストラクターであるため、同じ名前になります。この関数barはのメンバーでもありfooます。

彼らはのメンバーであるためfoo、クラス外からそれらを参照する場合は、名前を修飾する必要があります。結局のところ、彼らはそのクラスに属しています。したがって、コンストラクターを定義しbar、クラスの外部で定義する場合は、次のようにする必要があります。

foo::foo()
{
  // Implement the constructor
}

void foo::bar()
{
  // Implement bar
}

これは、クラス外で定義されているためです。名前に修飾を付けていなかった場合はfoo::、のメンバーとしてではなく、グローバルスコープでいくつかの新しい関数を定義することになりますfoo。たとえば、これは完全に異なりbarます。

void bar()
{
  // Implement different bar
}

fooスコープが異なるため、クラス内の関数と同じ名前を付けることができます。これbarはグローバルスコープにありますが、もう一方はクラスbarに属していました。foo

于 2013-03-27T00:00:36.077 に答える
30

::スコープを逆参照するために使用されます。

const int x = 5;

namespace foo {
  const int x = 0;
}

int bar() {
  int x = 1;
  return x;
}

struct Meh {
  static const int x = 2;
}

int main() {
  std::cout << x; // => 5
  {
    int x = 4;
    std::cout << x; // => 4
    std::cout << ::x; // => 5, this one looks for x outside the current scope
  }
  std::cout << Meh::x; // => 2, use the definition of x inside the scope of Meh
  std::cout << foo::x; // => 0, use the definition of x inside foo
  std::cout << bar(); // => 1, use the definition of x inside bar (returned by bar)
}

無関係:coutとcinは関数ではなく、ストリームオブジェクトのインスタンスです。

KeineLustが提案したように編集 を修正

于 2013-03-27T00:04:13.363 に答える
28

::スコープ解決演算子と呼ばれます。このように使用できます:

:: 識別子
クラス名 :: 識別子
名前空間 :: 識別子

ここでそれについて読むことができます
https://docs.microsoft.com/en-us/cpp/cpp/scope-resolution-operator?view=vs-2017

于 2013-03-26T23:59:56.190 に答える
9

「単項スコープ解決演算子」または「コロンコロン演算子」の1つの使用法は、同一の名前のローカル変数とグローバル変数の選択です。

    #include <iostream>
    using namespace std;
    
    int variable = 20;
    
    int main()
    {
    float variable = 30;
    
    cout << "This is local to the main function: " << variable << endl;
    cout << "This is global to the main function: " << ::variable << endl;
    
    return 0;
    }

結果の出力は次のようになります。

これは主な機能にローカルです:30

これは主な機能に対してグローバルです:20

その他の用途としては、クラスの外部から関数を定義する、クラス内の静的変数にアクセスする、または多重継承を使用するなどがあります。

于 2018-07-05T10:02:46.770 に答える
0

それを見てください[修飾された識別子

修飾されたid-expressionは、スコープ解決演算子::が付加された、修飾されていないid-expressionであり、オプションで、列挙のシーケンス(C ++ 11以降)または名前空間名またはdecltype式(C ++ 11以降)で区切られますスコープ解決演算子による。たとえば、式std :: string :: nposは、名前空間stdのクラス文字列内の静的メンバーnposに名前を付ける式です。式::tolowerは、グローバル名前空間の関数tolowerに名前を付けます。式::std:: coutは、トップレベルの名前空間である名前空間stdのグローバル変数coutに名前を付けます。式boost::signal2 :: connectionは、名前空間boostで宣言されている名前空間signals2で宣言されているタイプ接続に名前を付けます。

キーワードテンプレートは、依存するテンプレート名を明確にするために、必要に応じて修飾識別子で表示される場合があります] 1

于 2018-04-20T08:47:45.670 に答える