|
書籍転載
文法からはじめるプログラミング言語Microsoft Visual C++入門
C++のクラスをマスターしよう(前編)
―― 第10章 クラス〜オブジェクト指向プログラミング(前編) ――
WINGSプロジェクト 矢吹 太朗(監修 山田 祥寛)
2010/05/19 |
|
本コーナーは、日経BPソフトプレス発行の書籍『文法からはじめるプログラミング言語Microsoft Visual C++入門』の中から、特にInsider.NET読者に有用だと考えられる章や個所をInsider.NET編集部が選び、同社の許可を得て転載したものです。基本的に元の文章をそのまま転載していますが、レイアウト上の理由などで文章の記述を変更している部分(例:「上の図」など)や、図の位置などを本サイトのデザインに合わせている部分が若干ありますので、ご了承ください。『文法からはじめるプログラミング言語Microsoft Visual C++入門』の詳細は「目次情報ページ」もしくは日経BPソフトプレスのサイトをご覧ください。 |
ご注意:本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。 |
この章では、新しい型(ユーザー定義型)を定義し、それを利用する方法を紹介します。プログラムの規模が小さいうちは、ユーザー定義型を作成する必要はあまりありませんが、この章の内容によって、これまであいまいな部分が多かった既存のライブラリの利用方法やしくみへの理解が深まるでしょう。プログラムの規模が大きくなったときには、ユーザー定義型を作成し、それをプログラムの構成要素にする技術が不可欠になります。
■10.1 標準C++のクラス
標準C++でユーザー定義型を作る方法を紹介します。ユーザー定義型とはクラス、つまり第1章で説明したオブジェクト(属性と操作をまとめたもの)のひな形となるものです。
●10.1.1 クラスとは
実際にクラスを作成する前に、なぜクラスの作成方法を学ぶ必要があるのかを説明しましょう。クラスがプログラムの基本的な構成要素であるC#やVisual Basicと異なり、C++においては、クラスを自分で作らなくてもプログラムを書くことができます。実際、第9章までに紹介したC++の機能と標準ライブラリ等を利用すれば、自分でクラスを作成しなくてもかなりのことが簡単にできるはずです。ですから、入門の段階で小さいプログラムを書いているうちは、クラスを自分で作成する必要はほとんどないでしょう。しかし、入門の段階においてもクラスの作成方法について知っておく意義はあります。クラスの作成方法を知ることは、クラスのしくみについてよく知ることにつながり、クラスのしくみについてよく知っていれば、クラスの集合として提供されているC++のライブラリをうまく使えるようになるのです。
先に進む前に、用語の確認をしておきましょう。
属性や操作というのはオブジェクト指向プログラミングにおける一般的な用語で、標準C++ではそれぞれデータメンバ、メンバ関数と呼ばれます。しかし、.NETやC++/CLIにおいてこれらはフィールドとメソッドと呼ばれることが多いので、本書でもフィールドとメソッドに統一します。これらのクラスの構成要素をまとめてメンバと呼びます*1。C++/CLIにおいては、フィールド以外にもプロパティ(10.3.2項)やイベント(12.2.2項)と呼ばれる属性がありますが、これらについては後で説明します。主な用語を表にまとめました。
一般名称 |
標準C++ |
.NET(C++/CLI) |
属性 |
データメンバ |
フィールド
プロパティ
イベント |
操作 |
メンバ関数 |
メソッド |
|
クラスの構成要素 |
*1 C++ のクラスのメンバにはフィールドとメソッドの他に型があります。メンバとしての型の例としては、第9 章で紹介した反復子vector<int>::iterator などがあります。これは、クラスvector<int> が持つ型です。 |
クラスの必要性を最初に感じるのは、複数のデータをひとまとめにして扱いたいときです。例として、複数の人の名前と年齢を管理することを考えましょう。小さいプログラムなら、次のように名前と年齢を別々の配列で管理してもよいでしょう。
string names[]={"Taro","Hanako"};
int ages[]={32,27}; |
名前と年齢だけでなく住所や電話番号等も管理しなければならなくなり、しかもそのためのプログラムが、その場限りのいわゆる書き捨てのものではなく長く使うものだとしたら、個人のデータをすべてまとめて管理する方法を用意したくなるでしょう。そのようなときにクラスを作成します。クラスを基に生成したオブジェクトが個人を表します。クラスとオブジェクトの関係を図示すると図10-1のようになります。クラスは型であり、その実体がオブジェクトです。
|
図10-1 クラスとオブジェクトの関係 |
●10.1.2 クラスの生成
クラスは次のような構文で定義します。最後のセミコロンを忘れないように注意してください。
struct 型名
{
フィールドの型 変数名;
(複数のフィールドを宣言することも可能)
}; |
|
[構文]クラスの定義(構成要素はフィールドのみ) |
例として、名前をstring型のフィールドnameで、年齢をint型のフィールドageで管理するような型Personを定義すると次のようになります。
struct Person
{
string name;
int age;
}; |
|
[サンプル]10-person1.cpp |
このように作成したクラスは型であり、既存の型と同様に利用できます(3.4節を参照)。「型名 変数名;」とすれば、この型のオブジェクトが自動メモリに生成されます。各フィールドにはメンバ演算子「.」を使ってアクセスします。
//自動メモリにPersonオブジェクトを配置
Person taro;
taro.name="Taro";
taro.age=32;
cout<<taro.name<<" ("<<taro.age<<")\n"; //出力値: Taro (32) |
|
[サンプル]10-person1.cpp |
「型名* 変数名=new 型名;」とすれば、この型のオブジェクトがフリーストアに生成され、そのアドレスが変数に格納されます(つまり、ポインタ変数がオブジェクトを指します)。各フィールドには矢印演算子「->」を使ってアクセスします。
//フリーストアにオブジェクトを配置
Person* pHanako=new Person();
pHanako->name="Hanako";
pHanako->age=27;
cout<<pHanako->name<<" ("<<pHanako->age<<")\n"; //出力値: Hanako (27)
delete pHanako; //オブジェクトの削除 |
|
[サンプル]10-person1.cpp |
オブジェクトの配列を作ったり、コンテナに格納することも可能です。
//Personの配列
Person people[5];
//Personのvector
vector<Person> vec;
Person somebody;
vec.push_back(somebody); //要素の追加 |
|
[サンプル]10-person1.cpp |
Insider.NET 記事ランキング
本日
月間