C/C++プログラミング入門 – C++のクラス(1)

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

C/C++プログラミング入門 – C++の構造体ではC++の構造体について説明を行ったが、今回はC++のクラスについて説明を行いたい。とは言っても、今回はクラスにおける概要について説明を行うに止め、少しずつ詳しく説明してく予定だが・・・。

C++ではクラスと構造体はほぼ同一だが・・・

実のところ、C++においては、クラスも構造体も実装上ほぼ同一の存在と言っても過言ではない存在となっている。したがって、実質的にはC/C++プログラミング入門 – C++の構造体で書いたコードについても、structをclassに置き換えて、ちょっとした手直しをしただけで動いてしまう。

実際のところ、以下のコードも問題なく動いてしまう。

[code lang=”cpp”]#include <cstdio>
#include <cstring>
#include <cstdlib>

class book_info {
public:
int identifier;
char name[100];
char author[100];
char publisher[100];
void print_book_information() {
printf("=====Book information=====\n");
printf("Identifier: %d\n", identifier);
printf("Name : %s\n", name);
printf("Author : %s\n", author);
printf("Publisher : %s\n", publisher);
}
};

int main() {
// パターン1
book_info book1;
book1.identifier = 1;
strncpy(book1.name, "Foo", 100);
strncpy(book1.author, "John Smith", 100);
strncpy(book1.publisher, "Foo Books", 100);
book1.print_book_information();

// パターン2
book_info book2 = {2, "Bar", "Jane Smith", "Bar books"};
book2.print_book_information();

return EXIT_SUCCESS;
}[/code]

上記のコードではstructをclassに置き換え、その直後にpublic:を追加しただけのコードである。動作上、このコードは問題なく動いてしまう。

なお、public:を追加したのは、構造体とクラスではデフォルトのアクセス可能範囲が違うということによるものである。構造体では基本的にあらゆる場所からのメンバー変数及びメンバー関数からのアクセスが可能(public)だが、クラスでは自分自身のクラスしかアクセスできない(private)という違いがあるからである。

この通り、C++においては、基本的にクラスと構造体は同一のものとなっている。したがって、クラスでできることのほとんどは構造体でも同様のことが行えることになる。今後の記事で継承や移譲など、C++特有のクラスに関する説明を行うが、これの多くは構造体でも行えるということは覚えておくと良いだろう。

ただし、上記のようなコードは書くべきではない

ただし、これはオブジェクト指向プログラミングの考え方からしてみれば不適切なコードであり、実際のプログラミングではこういう書き方はすべきではない。

オブジェクト指向プログラミングの考え方では、基本的には「オブジェクト」と呼ばれる小さなプログラム同士で送り手が何らかのメッセージを出して、受け手がそれにしたがって処理を行い、必要に応じて結果を出す ((テレビというシステムに例えた場合、まずリモコンと本体があり、リモコンがチャンネルを変えるというメッセージを出した後、本体側でそれに応じて表示するチャンネルを変えるなど)) というメッセージのやり取りの組み合わせから成り立つもので、近年の大規模なシステムでは必ずと言っていいほど使われるものである。

今回挙げたコードでは、オブジェクトのpublic変数に直接アクセスしているという意味で、オジェクト指向の考え方からはかなり逸脱しているコードとなってしまっている。また、データの集まりという状況から、今回の場合はクラスではなく、構造体として扱うのが望ましいと言える。

最後に

今回はC++においてはクラスの説明のうち、それと構造体が実装上同一のものとなっていることについては説明を行った。これはC++におけるダークサイドとも言える存在であるため、とりあえず覚えておくにとどめていた方が良い。

今後、C++のクラスについて詳しく説明を行うことがあるが、これはC++の構造体でも使えることには使えるが、意味合いの違いから使うのは望ましいことではないため、基本的にはクラスに対して使うように心がけた方が良いだろう。

タイトルとURLをコピーしました