Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++

C++の「::」の記載の意味について

投稿日:2021年9月16日 更新日:

 

<目次>

(1) C++の「::」の記載の意味について
 (1-1) 「::」の意味は?
 (1-2) サンプル①:スコープ演算子「::」を使ってグローバル変数にアクセス
 (1-3) サンプル②:スコープ演算子「::」を使って関数にアクセス
 (1-4) 補足

(1) C++の「::」の記載の意味について

C++で「XXXXXX::YYYYY()」のような記述を見たことがありますでしょうか?今回はこの「::」の意味についてご紹介します。

(1-1) 「::」の意味は?

「::」は「スコープ解決演算子」と呼ばれ、「::」の後に記述される内容(コンストラクタやメソッド等)がどこの「名前空間」や「クラス」に所属するか?を明示的に記述する際に用いる記号です。内部的にはコンパイル時にコンパイラに対して、どの「クラス/名前空間」を見れば良いか?を教えます。
 
例えば、次の例では「Fruits::」が名前空間を表し、「Banana()」がコンストラクタを表しています。
 
(例)
Fruits::Banana()
 
そして、これらを合わせた「Fruits::Banana()」を併せて「修飾名」と呼びます。
 

(1-2) サンプル①:スコープ演算子「::」を使ってグローバル変数にアクセス

最初のサンプルでは「::」を使って変数にアクセスするサンプルをご紹介します。同じ名前「age」のグローバル変数とローカル変数を用意し、グローバルの方は「::age」でアクセスし、ローカルの方は「age」とアクセスしています。つまり「::」はグローバルスコープを表しているという事が確認できます。
 
(サンプル①)
 
#include <iostream>
#include <string>
using namespace std;

//# グローバルな変数
int age = 21;

int main() {
  //# ローカルな変数
  int age = 18;

  cout << "グローバル変数の値:" << ::age << endl;;
  cout << "ローカル変数の値:" << age << endl;;
  return 0;
}
 
(図121)
 

(1-3) サンプル②:スコープ演算子「::」を使って関数にアクセス

次のサンプルでは「::」を使って関数にアクセスするサンプルをご紹介します。同じ名前の関数「calcPrice」をFruitクラスとAppleクラスにそれぞれ定義し、Fruitの方は「Fruit::calcPrice」とアクセスし、Appleの方は「Apple::calcPrice」とアクセスします。これにより「::」の前で指定したクラスに属する関数にアクセスしている事が確認できます。
 
(サンプル②)
#include 
#include 
using namespace std;

//# 親クラス
class Fruit {

  //# 親クラス内のメソッド
  public:
    static void calcPrice(int amount) {
      cout << "フルーツの値段:" << amount * 100 << endl;
    }
};

//# 親クラスを継承したクラス
class Apple : public Fruit {

  //# 親クラスを継承したクラス内のメソッド
  public:
    static void calcPrice(int amount) {
      cout << "リンゴの値段:" << amount * 200 << endl;
    }
};

int main() {

  Fruit::calcPrice(5);
  Apple::calcPrice(5);
  return 0;
}
(図131)
 

(1-4) 補足

「::」の前に何も指定しない場合は「グローバル名前空間」を参照します。例えば「std::cout」を単に「cout」と書いた場合、coutはグローバル名前空間には定義されていないため、エラーになります。あるいは名前空間の使用を宣言(例:「using namespace std;」と記述すれば「std::」を省略する事ができます。
 

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点

  <目次> (1) C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点  (1-1) localtime関数がスレッドアンセーフである理由  (1-2) loca …

ValgrindのPossibly Lostの意味や実際のサンプルをご紹介

  <目次> (1) ValgrindのPossibly Lostの意味や実際のサンプルをご紹介  (1-1) Valgrindの「Possibly Lost」はどんな状況?  (1-2) …

C++における「>>」の意味について

  <目次> (1) C++における「>>」の意味について  (1-1) 概要  (1-2) サンプルプログラム  (1-3) どんな時に使われる?⇒データ圧縮  (1-4) 備 …

Valgrindで行番号を表示させる方法

  <目次> (1) Valgrindで行番号を表示させる方法  (1-1) 行番号を表示させる方法  (1-2) (参考)「-g」オプションについて (1) Valgrindで行番号を表示 …

Valgrindの使い方や見方について(基礎編)

  <目次> (1) Valgrindの使い方や見方について(基礎編)  (1-1) メモリリークのチェックのやり方  (1-2) 「valgrind」コマンドの基本的な使い方  (1-3) …

  • English (United States)
  • 日本語
Top