第10章 不動の構え

 前回のプログラム。実はクラスを使ってる部分に const がありませんでした。そして const をつけると...エラーが出ます。今回はクラスにおいての const の扱いについてのお話です。


 では、今回の要点です。


 では、いってみましょう。


 では、前回までのプログラムの一部分を見てみましょう。

CIntArray::CIntArray(CIntArray& rother)
{
    ...略...
}

void Disp(CIntArray array)
{
    ...略...
}

 いつもなら、これらの引数の型には const をつけているところです(const を忘れたという人は第1部第41章第42章を参照)。なぜなら、rother も array も、関数内で何の変更も行われないからです。メンバ変数などに手を加えるようなことはしていません。

 しかし、この const をつけてしまうとエラーが出てきます。

CIntArray::CIntArray(const CIntArray& rother)
{
    ...略...
}

void Disp(const CIntArray array)
{
    ...略...
}

 エラーは次の通りです。

IntArray.cpp(26) : error C2662: 'NumOf' : 'const class CIntArray' から 'class CIntArray &' へ 'this' ポインタを変換できません。
        変換で修飾子が失われます。
IntArray.cpp(34) : error C2662: 'SizeOf' : 'const class CIntArray' から 'class CIntArray &' へ 'this' ポインタを変換できません。
        変換で修飾子が失われます。
Copy1.cpp(16) : error C2662: 'NumOf' : 'const class CIntArray' から 'class CIntArray &' へ 'this' ポインタを変換できません。
        変換で修飾子が失われます。
Copy1.cpp(17) : error C2662: 'Get' : 'const class CIntArray' から 'class CIntArray &' へ 'this' ポインタを変換できません。
        変換で修飾子が失われます。

 どうやら、全てメンバ関数を使っているところでエラーが出ているようです。

 これは、そのメンバ関数がメンバ変数を変更しないかどうかが分からないせいで、こういうエラーが出ているのです。

 分かるようにするには、そのメンバ関数の宣言の後ろに const をつけます

例)
class CIntArray
{
private:
    int m_nNumOf;
public:
    int NumOf() const;
};

inline int NumOf() const
{
    return m_nNumOf;
}

 こうすると、NumOf はメンバ変数を変更しないということがやっと分かるようになります。もちろん、このようなメンバ関数の中でメンバ変数の内容を変えてしまうとエラーになります。

 同じように、const を Get, SizeOf, CheckIndex の後にもつければ、エラーは出なくなります。CheckIndex は Get から呼ばれるメンバ関数なので、これも const 関数でないとエラーになります。あとは Success 関数にもつけるといいでしょう。

 const のついたオブジェクトのことを、const オブジェクトと呼びます。この const オブジェクトからは const メンバ関数しか呼べないのです。たとえメンバ変数を変えていなくても、そのメンバ関数の宣言の後ろに const をつけない限り呼べないのです。


 const オブジェクトは全てのメンバ変数を変更できません。しかし、const オブジェクトであってもどうしても変えたい変数があるときもあるかもしれません。

 そういうときは、メンバ変数の型に mutable(変更可能な)というものを加えれば、const オブジェクトであってもそのメンバ変数の内容を変えることができるようになります。

 普通はあまり使うことはないと思います。内容をずっと残しておきたい作業領域のようなものにしか使うことはないかもしれません。


 短いですが、今回はこれで終わりです。それでは今回の要点です。



 今回まででクラスの一番基本的な部分が終わりました。これまでのことが分かっていれば色々なクラスを作ることができるでしょう。途中から長さを変えることのできる配列も作れるでしょうし、それを発展させて文字列を便利に操作するクラスを作ることもできるでしょう。

 しかし、クラスにはまだとても重要な要素があります。次回からは、そのことについて順を追って話していこうと思います。

 それでは、また。


第9章 コピー | 第11章 子孫

Last update was done on 2000.8.9

この講座の著作権はロベールが保有しています