ビジネス WinDbgアプリケーション開発技術 イメージロード(ユーザモードとカーネルモード)


std::coutのcoutの意味

 私たちは20個の基本事項を一つずつ丁寧に検討しています。皆さんの中には、どれもこれもどこかで一度はお目にかかった項目ばかりであり、どことなく新鮮味がない、と感じられている人も結構いらっしゃるはずです。しかし、私たちは、「CからC++への時代の流れ」を丸暗記ではなく、実感として掴みつつあります。本日は、「オブジェクト」や「インスタンス」の用語の意味を理解します。皆さんは、この2つの用語の意味を社内の後輩や開発作業に直接従事しない人々に「分かりやすく」説明する自信がありますか。

 それでは本論です。私たちは現在、次のようなC++ソースコードの意味と背景を考えています。
#include <iostream>

int main()
{
  const std::string ch0 = "Typical: I don't know anything about programming!\n";
  const std::string ch ("Simplified form: I don't know anything about programming!\n");
  const std::string* ch1 =  new std::string ("Pointer form: I don't know anything about programming!\n");

  std::cout << "Popular: I don't know anything about programming!" << std::endl;
  std::printf(ch0.c_str());

  std::cout << ch.data();
  std::cout << ch1->data();
  std::cout << ch.c_str();
  std::cout << ch1->c_str();
 std::cout.write(ch.c_str(), ch.size());
  std::cout.write(ch1->c_str(), ch1->size());

  // 64ビットへの移植を予定しているときには次のコードを使う
  // std::cout.write(ch.c_str(), std::streamsize(ch.size()));
  // std::cout.write(ch1->c_str(), std::streamsize(ch1->size()));

  delete ch1;
  return int(0);
}
 このソースコードは、私たちに次のいずれかの印象を与えます。すでに説明済みの項目は、打ち消されています。

印象1:とにかく難しい!
印象2:Cのソースコードとどこか似ている
印象3:#includeに続くiosteamという意味が分からない
印象4:stdio.hがないにもかかわらず、printf関数が呼び出されていることが不思議だ!
印象5:std::coutのstdの意味が分からない
印象6:std::coutの「::」の意味が分からない

印象7:std::coutのcoutの意味が分からない
印象8:「<<」の意味が分からない
印象9:std::endlのendlの意味が分からない
印象10:「std::string ch」のstringの意味が分からない
印象11:「std::string ch」のchの意味が分からない
印象12:ch.data()の意味が分からない
印象13:ch.c_str()の意味が分からない
印象14:std::cout.writeの意味が分からない
印象15:ch.size()の意味が分からない
印象16:std::string*の「*」の意味が分からない
印象17:std::string* ch1の「ch1」の意味が分からない
印象18:ch1->data()の意味が分からない
印象19:ch1->c_str()の意味が分からない
印象20:ch1->size()の意味が分からない

 今回は、「印象7:std::coutのcoutの意味が分からない」を考えます。先に結論を言ってしまえば、意味が分からないのは当然です。筆者は数冊のプログラミング入門書を書店でめくってみましたが、たいへん残念なことに、いずれの書籍にも、「cout」の意味の説明は載っていませんでした。ここではっきり申し上げておきます。「cout」の説明が載っていない書籍は購入すべきではありません。その著者はC++を知らないことを意味します。C++を知っている人は、「cout」の存在が気になり、"何とか説明しよう!"と(自然に)考えるものです。ただし、その説明は決して生易しいものではありません。幸いなことに、本「IT談話館」は、多数のC++関連連載を持っていますから、皆さんはこの記事を一読後、この連載の関連箇所に目を通してみるとよいと思います。

 「cout」は、「オブジェクト」と言われるものです。オブジェクトの代わりに、「インスタンス」という用語を使用する人もいます。この2つの用語の意味は同じと考えて差し支えありません(論理的にはまったく異なる意味を持っていますが、ここでは無視します)。本連載では、便宜上、オブジェクトと呼ぶことにします。

 オブジェクトとは、具体的な「もの」であり、私たちの五感で具体的に把握できるものです。たとえば、美女という言葉があります。私たちは、その言葉の意味を五感で「具体的に」実感することはできません。しかし、("美女"の「オブジェクト」といえる)韓国出身のBoAさんの姿をテレビなどで見た場合、私たちは、BoAさんが美女であることを実感できます。コンピュータ的には、オブジェクトというのは、メモリを割り当てらた電気・電子的な存在者です。

 「BoAさんは美女である」。これは事実です。それでは、「cout」はなんといえばよいのでしょうか。結論を急げば、「coutはostreamである」、となります。この文をソフトウェア的に表現すれば、「coutはostreamクラスのオブジェクトである」、となります。

 ここまでの説明を読んだ皆さんの中には、かつて読んだオブジェクト指向に関する専門図書の内容が悪夢のようによみがえり、逃げ出したくなる人もいるでしょう。そのような場合、プログラミング言語C++は、私たちの日常生活を尊重していることを思い出しましょう。日常生活を無視するプログラミング言語。それは、オブジェクト指向を名乗る資格などありません。

 「BoAさんは美女である」。このような表現は私たちが日常的に使用する、きわめてありふれたものです。しかし、「coutはostreamクラスのオブジェクトである」という表現はめったに使用するものではありません。これは珍しい表現に出会ったことになりますから、多くの人は驚き、困惑してしまいます。困惑した人は、必然的に、"意味が難しい!"、あるいは、"意味がまったく分からない!"、などと叫ぶことになります。しかし冷静に考えてみれば、私たちは、「BoAさんは美女である」、という表現の意味を熟知しています。なら、「coutはostreamクラスのオブジェクトである」の意味を理解するための十分な基礎を持っていることになります。

 「coutはostreamクラスのオブジェクトである」。すでに触れたように、「coutはオブジェクトです」から、メモリ内に電気・電子的に展開されています。このようにメモリに展開されることを、「実体化される」、あるいは、「実体を持つ」、などと表現する人もいます。簡単に言えば、「coutはメモリ内の特定の位置を指す情報を持っている」ことになります。それでは、ostreamクラスとはなんでしょう。それは、「coutの上位概念であり、メモリを有効活用するための設計図」です。これは、「BoAさんは"美女"という設計図にしたがって創造されている」、のと同じことです。「BoAさんは美女の条件を満たしている(ソフトウェア的には、「美女」型がチェックされる、あるいは、型の安全性が保障されている、などといえます)」、などと日常的には表現しています。この表現も日常的にきわめてありふれたものです。

 「coutはostreamクラスのオブジェクトである」。この意味はなんとなくではあっても、理解できたと思います。しかし、理解した意味がどのようなメリットを私たちに与えてくれるのかはまだ藪の中です。「coutはostreamクラスのオブジェクトである」。この意味の持つメリットについては次回取り上げます。そのメリットはまるで魔法のような威力を持っています。

前へ | 次へ




 WinDbg入門  ホーム


Copyright©豊田孝 2004- 2009
本日は2009-01-06です。