41143


C++初心者で下記コードを読んでみたところ、以下の通りたくさんの疑問点がありました。お手数をおかけしますがご教示頂けますと幸いです。

  1. 3行目： `#ifndef LIST` を使う意味について。
  2. 14行目： `List()` の意味について。とりわけ、`（）`が何を指すのか。
  3. 24行目： `bool empty() const` の意味について。とりわけ、`const`がなぜ`empty()`の後ろにあるのか。
  4. 34行目： `void insert(ElementType item, int pos)` の意味について。とりわけ、なぜ`void`を使うのか。
  5. 67行目： `void display(ostream & out) const` の意味について。とりわけ、`&`が何を示すのか。

* * *
[code]

    #include <iostream>
    
    #ifndef LIST
    #define LIST
    
    const int CAPACITY = 1024;
    typedef int ElementType;
    
    class List
    {
     public:
     /******** Function Members ********/
       /***** Class constructor *****/
       List();
       /*----------------------------------------------------------------------
         Construct a List object.
    
         Precondition:  None
         Postcondition: An empty List object has been constructed;
             mySize is 0.
       -----------------------------------------------------------------------*/
    
       /***** empty operation *****/
       bool empty() const;
       /*----------------------------------------------------------------------
         Check if a list is empty.
    
         Precondition:  None
         Postcondition: true is returned if the list is empty, 
             false if not.
       -----------------------------------------------------------------------*/
    
       /***** insert and erase *****/
       void insert(ElementType item, int pos);
       /*----------------------------------------------------------------------
         Insert a value into the list at a given position.
    
         Precondition:  item is the value to be inserted; there is room in 
             the array (mySize < CAPACITY); and the position satisfies
             0 <= pos <= mySize. 
         Postcondition: item has been inserted into the list at the position
             determined by pos (provided there is room and pos is a legal
             position).
       -----------------------------------------------------------------------*/
    
       void erase(int pos);
       /*----------------------------------------------------------------------
         Remove a value from the list at a given position.
    
         Precondition:  The list is not empty and the position satisfies
             0 <= pos < mySize.
         Postcondition: element at the position determined by pos has been
             removed (provided pos is a legal position).
       ----------------------------------------------------------------------*/
    
       /***** output *****/
       void display(ostream & out) const;
       /*----------------------------------------------------------------------
         Display a list.
    
         Precondition:  out is a reference parameter 
         Postcondition: The list represented by this List object has been
             inserted into ostream out. 
       -----------------------------------------------------------------------*/
    
     private:
     /******** Data Members ********/
       int mySize;                     // current size of list stored in myArray
       ElementType myArray[CAPACITY];  // array to store list elements
    
    }; //--- end of List class
    
    //------ Prototype of output operator
    ostream & operator<< (ostream & out, const List & aList);
    
    #endif 
    
[/code]

出典: Nyhoff, [ADTs, Data Structures and Problem Solving with
C++](http://cms.dt.uh.edu/Faculty/LinH/courses/cs3304/Slides/42444-Nyhoff_5-8ppts/Chapter06/CodeSamplesChapter06.htm),
Second Edition, Figure 6.1A List.h Using Static Array p262~264 © 2005 Pearson
Education, Inc. All rights reserved. 0-13-140909-3


CC BY-SA 3.0
2018-01-23T01:11:48.307
41140
2018-01-23T02:39:07.837
2018-01-23T02:36:36.343
19110
26303
question
c++
静的配列を実装するために書かれた C++ プログラムの意味が知りたい


＞1.3行目： #ifndef LIST を使う意味について。

→多重定義によるビルドエラー発生を防止する為のケアでしょう。

＞2.14行目： List() の意味について。とりわけ、（）が何を指すのか。

→コンストラクタです。  
クラス名生成時に呼ばれる特殊なメソッドです。  
初期化処理等を記述します。  
~List()とあった場合はデストラクタで、クラスのオブジェクトが破棄される際に呼ばれます。  
デストラクタはメモリの開放など、終了処理を記述します。

＞3.24行目： bool empty() const の意味について。とりわけ、constがなぜempty()の後ろにあるのか。

→メソッド名の後ろにつけたconstは、該当メソッド内でのメンバー変数の値の変更を禁止するという意味です。

＞4.34行目： void insert(ElementType item, int pos)の意味について。とりわけ、なぜvoidを使うのか

→このメソッドは戻り値を返却しない事を示しています（return で変数を返却しない）。  
コンストラクタ、デストラクタ等、特殊なメソッド以外、メソッドには必ず戻り値の指定をする必要があり、  
値を返却しない事を明示的にするために上記の様な記述をします。

＞5.67行目： void display(ostream & out) constの意味について。とりわけ、&が何を示すのか。

→引数を"参照渡し"で受け取るという記述です。  
引数は基本的に、値渡し、ポインタ渡し、参照渡しという３つの方法で与える事ができます。  
呼出元で指定した変数を、呼出先のメソッド内のスコープでも扱う事が可能となります。  
"関数のスコープ"で調べてみて下さい。


CC BY-SA 3.0
2018-01-23T02:18:10.703
41142
2018-01-23T02:18:10.703
22484
41140
answer


まず、このファイル "List.h" は、 **ヘッダーファイル** と呼ばれるものです。このファイルは、`List`
クラスにどのようなメソッドがあり、どう使えるのかを示すために書かれています。`List` クラスの実装は与えていないことに注意してください（それは別ファイル
"List.cpp" として与えられています）。

ご質問の数が多いので、それぞれに短い回答を書きます。もし疑問点があれば、個別に新しく質問をご投稿ください。

### 1\. `#ifndef LIST` を使う意味

これは **インクルードガード** と呼ばれているテクニックです。ヘッダーファイルが複数のソースファイルから複数回 `#include` されたとしても
`List` クラスの定義が重複しないようにするための書き方です。詳しくは[「PRE06-C.
ヘッダファイルはインクルードガードで囲む」](https://www.jpcert.or.jp/sc-
rules/c-pre06-c.html)をご覧ください。

### 2\. `List()` の意味について

`List` クラスの **コンストラクタ** の定義です。cppreference.com の ["Constructors and member
initializer
lists"](http://en.cppreference.com/w/cpp/language/initializer_list) をご覧ください。

### 3\. `bool empty() const` の意味

コメントに書いてあるように、`List` オブジェクトが空かどうかを判定するメソッド `empty` の定義です。定義のこの場所に `const`
を書いた場合、`this`、つまり今見ているリスト自身の型が `const List *` になることを意味しています。 **`const`
は書いた位置によって意味が変わる**
ので、詳しくは別の質問[「C++クラスでのconstの定義方法について」](https://ja.stackoverflow.com/q/1861/19110)をご覧ください。

### 4\. `void insert(ElementType item, int pos)` の意味

コメントに書いてあるように、`List` オブジェクトに新しい要素を追加するメソッド `insert` の定義です。つまり、`this`
オブジェクトを書き換えて新しい要素を追加するだけなので、戻り値は必要ありません（`void` 型になります）。(註:
実装の仕方によっては、要素を追加する度に新しい `List` オブジェクトを返すようにすることもできますが、ここではそうしていないということです。)

### 5\. `void display(ostream & out) const` の意味

コメントに書いてあるように、`List` オブジェクトを表示する (`ostream` に出力する) ためのメソッド `display`
の定義です。`ostream & out` の `&` は、 **参照型** を表すための記号です。参照型を短く説明できる自信が無いので、Wikipedia
の ["Reference (C++)"](https://en.wikipedia.org/wiki/Reference_\(C%2B%2B\)) や
Qiita の[「C++ 値渡し、ポインタ渡し、参照渡しを使い分けよう」](https://qiita.com/agate-
pris/items/05948b7d33f3e88b8967)をご覧ください。

### 補足

今回ご質問頂いた部分は、C++
の言語機能の中でも基本となるものが多いです。もし「ヘッダーファイル」「コンストラクタ」「参照渡し」などの言葉に聞き馴染みが無ければ、短いウェブサイトより先に
C++ の入門書を読んで、体系的にまとまった知識を得ることをオススメします。


CC BY-SA 3.0
2018-01-23T02:21:15.120
41143
2018-01-23T02:39:07.837
2018-01-23T02:39:07.837
19110
19110
41140
answer