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

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

関連記事

ポインタと参照の違いについてサンプルPGを使ってご紹介

  <目次> (1) ポインタと参照の違いについてサンプルPGを使ってご紹介  (1-1) ポインタと参照の概要  (1-2) 両者の違い①:宣言/初期化  (1-3) 両者の違い②:再代入 …

C++の動的メモリ割当と静的メモリ割当の違いについて

  <目次> (1) C++の動的メモリ割当と静的メモリ割当の違いについて  (1-1) 静的メモリ割当てとは?  (1-2) 動的メモリとは?  (1-3) 動的メモリの割当て  (1-4 …

GDBの使い方をC++のプログラムのデバッグを例にご紹介

  <目次> (1) GDBの使い方をC++のプログラムのデバッグを例にご紹介  (1-1) GDBのデバッグのシナリオ概要(例)  (1-2) GDBのデバッグ手順(例)  (1-3) そ …

C++の共用体とは?構造体との違いや使用方法について

  <目次> (1) C++の共用体とは?構造体との違いや使用方法について  (1-1) 共用体とは?構造体との違いは?  (1-2) 共用体の定義方法、変数定義方法、初期化方法  (1-3 …

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

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

  • English (United States)
  • 日本語
Top