1. ホーム
  2. c++

[解決済み] C++で::を使用する

2022-03-06 11:15:06

質問

C++を勉強しているのですが、どのような場面で :: . を使用する必要があることは知っています。 std:: の前にある coutcin . の内部は、このような意味なのでしょうか? iostream という名前空間を作成し、このファイルを作成しました。 std という関数があります。 cincout という名前空間に std ? と同じファイルにない新しいクラスを作成したところ main() を追加する必要があります。 :: .

例えば、私が class という A というのは、なぜ A:: は、名前空間に入れていないにもかかわらず、自分が作った関数の前にあるのですか?例えば void A::printStuff(){} . で関数を作ると main なぜ main::printStuf{} ?

私の質問はおそらく混乱していると思いますが、どなたか助けていただけませんか?

どのように解決するのですか?

については、かなり正しいです。 coutcin . これらのオブジェクトは std 名前空間を使用します。以下は、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 クラスがあります。