構造体 - みる会図書館


検索対象: 月刊 C MAGAZINE 1991年9月号
195件見つかりました。

1. 月刊 C MAGAZINE 1991年9月号

ースタートアップ C + クラス ( 1 ) 実力養成講座 第 。前回まで O 言語に対して拡張された機能について解説 してきた。今回より 2 回にわたり , C 十十の機能の中でも っとも特徴的かつ重要な要素である「クラス」について 解説する。クラスも C 言語を拡張した機能のひとっとし 第て捕えることができる。当然 , 」を拡張された機能の中に一、 は , 新しい概念から生まれたものもある。ここでは , C き語の造体と較からクースの 理論編 とつの単位として扱えるということてある。 『 : ク ? スとは また , 参照てきるメンバと , 参照てきない クラスの定義は , 単に型を決定したにす メンバを区別することもてきる。このよう ぎない。構造体て、は , 構造体の定義を行っ にクラスを構造体の概念の拡張とみなすこ たあとに構造体変数や配列を宣言する。同 クラスは , C 言語の構造体 ( 以下構造体 ) と とにより , クラスの使い方は構造体と同様 同様にユーザが定義する型てあり , 構造体 様に , クラスの定義のあとにクラス変数や 概念を拡張した機能を持つ。構造体は種類 に行える。ただし , 拡張部分の取り扱いが 配列の宣言を行う。クラス変数宣言は , 特徴的なものとなる。 定義済みクラス名変数名 の異なった型のデータをひとつの単位とし て扱うことがてきる。クラスとして拡張さ となる。 クラスの定義 れた概念および機能は , データだけてなく , メンバー そのデータヘアクセスを行う関数まてもひ 構造体がユーザ定義の型てあるように クラスもユーザ定義の型てある。つまり , 構造体の概念を拡張したクラスをメンバ コラム というタームを使ってまとめると クラスを使用するためには , クラスの型の C 十十の構造体 ①関数をメンバとすることができる 定義を行う必要がある。構造体ては , キー C + + にも構造体は存在する。ただし , ②スコープによるメンバの区別 ワード struct により型の定義を行い , 型名に クラス型のひとつの種類として存在す 相当するタグ名をユーザ ( プログラマ ) が決 といえる。 るものである。構造体の定義はキーワ 定した。クラスの定義ては , キーワード class 関数をメンバとする場合は , クラス定義 ード class をキーワード st 「 uct に置き換 の中て関数の定義を行うか , プロトタイプ により型の定義を行い , 型名に相当する「ク えたもので , ラベルが別の保護レベル ラス名 ( タグ名 ) 」をユーザが決定する。ク 宣言を行う必要がある。プロトタイプ宣言 を示すまで自動的にバブリックメンバ ラス定義は , を行ったメンバとなる関数は , クラス定義 となる。つまり , 自動的に設定される class クラス名 { とは別に関数を定義する。 Fig. 1 に示すよう 保護レベルが異なる以外は , クラスと に , クラス定義とは別にメンバとする関数 メン / ヾ 同じものである。 を定義する場合は , 関数の型と関数名の間 龍崎昌平 スタートアップ C 十 + 123

2. 月刊 C MAGAZINE 1991年9月号

続・メモリ管理 乗松保智 本ロ 0 五ロ 本連載第 1 1 回 ( ' 91 年 5 月号 ) では , 動的なメモリ管理をするうえでのテクニックにつ いて話しました。今回はそのときに課題として残しておいた点について説明します。 こて、復習しておきましよう。 によって確保していたのては , malloc ーお手紙ありがとう 第 11 回て、は単語の出現回数を数えるプロ が使用するヘッダ情報の大きさと NOD グラムを例にして , malloc によって確保し E 型構造体の大きさの比率から考えて , 読者の方からの手紙が編集部から転送さ たメモリを効率よく使用する方法を説明し メモリを有効利用しているとはいえな れてきました。その手紙は新潟市の鹿内聖 ました。プログラムが使用するデータ構造 和さんからのものて , 次のように始まりま は二分木 (Binary Tree) て、した。この木のノ という問題がありました。そこて、メモリの す。 ード ( 節 ) を表現するのは List 1 の構造体て、 管理を二段構えにして , 「はじめまして , 新潟の鹿内てす。 C マ す。 ③ まとまった数 ( たとえば 1000 個 ) の NOD ガジン 5 月号に乗松先生の C 言語雑学講 ① NODE 型構造体を配列 ( 静的なメモリ ) E 型構造体のメモリプロックを一度に m 座にメモリ管理なるツリー構造の単語 として確保していたのてはシステムの a110C によって確保する。そして NODE 出現回数を数えるプログラム例が載っ メモリ量によって効率が悪くなる 型構造体は自前の割り当て関数によっ ていました。非常に興味をそそられた という点から malloc を使って動的なメモリ て切り出してくる のて読んていたら課題があったのてや を使用することにしました。しかし , という考え方てプログラムを作りました。 ② NODE 型構造体をひとつひとつ malloc しかし , 第 11 回て示したプログラムにはひ ってみることにしました。 鹿内さん , 拙い記事を読んて、くださって ノードの構造体 ありがとうございます。最近ネタが切れて 1 : / * * NODE 型構造体 * * / しまって苦しまぎれに書いている部分が大 2 : 3 : typedef struct node ( きいのてすが ( 苦笑 ) , このようなお手紙を *word; 4 : char いただくとものすごく励みになります。て unsigned int count; 5 : もね , いいんだけどさ , 「先生」ってのはや struct node *left; 6 : struct node *right ; 7 : めてください ( 笑 ) 。私は教師てはなくって 8 : } NODE; 一介のプログラマなのさつ。 それては , 今回は鹿内さんのプログラム をもとにして , 第 11 回の課題を考えてみる ことにしましよう。 List 1 / * 単語を指すポインタ * / / * 出現回数 / * 左の子へのポインタ * / / * 右の子へのポインタ * / みなさんは第 11 回の最後に私が出した課 題を憶えてますか ? 健忘症の方のために , C 言語雑学講座 111

3. 月刊 C MAGAZINE 1991年9月号

c ( 付録ディスク収録 ) を変更したものてす が , node4. h の中には malloc によって確保す るメモリプロックを表現するために使われ る構造体 HEAD が宣言されています。 node 4. c の中て新たに追加された関数は append head, free head, mem free, gethead< す。 まず , このプログラムがどのようなデー タ構造を使っているのかを図解しましよう。 NODE 型構造体は第 11 回て、も出てきていま すから今回は置いといて , HEAD 型構造体 を見てみましよう。 HEAD 型構造体は a110C node が確保する メモリプロックを示します 0Fig. 1 のように なるてしよう。 ヘッダの直後には malloc て寉保した ALL OC UNIT 個のノードのメモリエリアが続き ます olist は free node によって解放されたノ ードのリストを持っています。ノードエリ アのうち , 現在使用されているノードの個 数が freecount に格納されます。そして fron t と next を使ってヘッダの双方向リストを形 成しています。 Roothead が最初に malloc し たヘッダを指していて , Newhead はもっと も新しく malloc したヘッダを指していま す。 各関数て、はこれらをうまく操作して , あ るメモリプロックのノードエリアがすべて 解放されたかどうかを監視します。そして すべてが解放されたときにはヘッダとノー ドエリアを free する , ということてすね。 基本的にはこの考え方て、うまくいくて、し とつの問題がありました。それは , うのが練習問題となったのてす。 よう。しかし , よく見るといくつか問題点 ④ malloc によって確保したプロックの先 ープログラム 頭アドレスを保存していないのて , 使 が見えてきます。 用済みの NODE 型構造体を解放すると まず , HEAD 型構造体のメンバ list の使い きに , そのプロック全体が用済みにな 方をよくみてください olist は append head 鹿内さんのプログラムを見てください ( 付 ったかどうかを判断する方法がない の中て NULL に初期化され , その後 free 録ディスク収録 node4. h , node4. c)o プログ したがって , 一度確保されたプロック node の中て、は解放されたノードのリストを ラムのコメントやスペースの使い方などは は二度とシステムには返却されない 保持するために使われています。このとき 私の趣味にあわせて若干変更している部分 には解放されたノードは Freelist には加えら ということて、した。 があります。また , 今回の説明て、は不要な れていません。 そこて、「 NODE 型構造体を解放するとき 関数 (pri size ) は削除してありますのてご了 しかし使用されていないノードはリスト に , メモリプロック全体を解放することが 承ください て、きるようにプログラムを書き換えよ」とい さて , このプログラムは第 11 回の node3. になっていて , その先頭は Freelist が指して 112 C MAGAZINE 1991 9 Fig. 1 メモリプロックの構造 Roothead N ewhead f 「 ont next ・ f 「 eeco u nt list front next freecou nt list NODE [ 0 ] NODE [ 1 ] 解放された ノードのリスト ド ノ ド ノ 未使用の ノードのリスト Freelist

4. 月刊 C MAGAZINE 1991年9月号

実力養成講座 5 List 3 のようにして , private 部 , public 部 という形てメンバ ( 変数 / 関数 ) へのアクセス 権を外部に公開するかどうかの制御がて、き ます。インタフェイス部 , インプリメンテ ーション部に近い概念て、す。 private: などはいちおう , 文法的には予 約ラベルに分類されますが , default : ラベ ルなどとは違って , ひとつのクラスの中に private ラベルが複数あってもかまいませ public : private . public : struct { ん。つまり , ないクラス ( すべてのメンバを外部に公開す パプリックメンバしか持た のひとつ覚え <class を用いるべきてしょ とはいうものの原則的にクラスにはバカ いてしよう。 CI ass struct だといい切っても問題はな は struct< 宣言したって別にかまいません。 としておいて , いざ内容を記述するときに class FindFiIe , とりあえず予約しておく場合がありますが , 前方参照のために , クラスの名前だけを ぎません。 になっているクラスてある」という違いにす クラスてあり , cla とはデフォルト <private はメンバがデフォルトて、 public になっている 両者の違いは非常に希薄てす。「 struct と ます。 かに class というキーワードも用意されてい 構造体として扱ってきましたが ,struct のほ こまては , クラスを単なる拡張された キーワード c ass よってしばられることはありません。 かまわないのて、 , メンバの並び順がそれに のように入れ替わり立ち替わり出てきても るクラス ) を class { public : のように書くのは , バカバカしく思えます。 struct の 1 語て、済ませることがてきるのてす から。しかし , いくら構造体の仕様が拡張 されたとはいっても , 従来のような単なる 変数のフォルダーとしての構造体の存在意 義が薄れたわけて、はありません。そういう 単純な構造体とクラスとしての構造体とを ごちゃまぜにするのは , 混乱を招くおそれ があります。 ー・、。 St ok クラス クラスにはもうひとつ「使い心地」という 側面があります 0FSTRTOK. H ( 付録ディス ク収録 ) と FSTRTOK ℃ PP ( 付録ディスク収 録 ) を見てください。標準ライプラリ関数 strtok ( ) は , 静的なバッフアを使っていま す。したがって , 同時に複数の文字列を扱 うことはて、きません。つまり , 複数の文字 列から平行してトークンを切り出すような 処理には利用て、きません。ましてや再帰的 に使うなどもってのほかて、す。 その制限をとつばらおうと試みたのがこ の StrTok クラスて、す。たとえば , List 4 の ように , 切り出したトークンをさらに別の 区切り子を用いて切り分けるといった , 入 れ子状の使い方もてきます。原理的には情 報を静的変数に保存するのてはなく構造体 を介して動的に受けわたすようにすればよ いだけの話てす。それこそ findfirst ファミリ にならって , List 5 のような strtok ファミリ スタートアップ C 十十 を築いても同じはずて、す。しかし , 不思議 なことにこれてはちっとも使いやすそうに は見えません。「構造体を使う関数を使う」 のと「クラスのメンバ関数を使う」のとて、は , 実質的な違いはないはずなのに , 「使う」が 1 個少ないぶんだけ抵抗感なく使うことがて きるようて、す。 D e クラス FindFiIe も StrTok も , クラスというもの を「構造体とそれを利用する関数群」をオプ ラートにくるんて、飲み込みやすくする目的 て、利用しています。しかし , 「構造体」が単 体て、存在し得るのと同じように「関数群」だ けをまとめるクラスというものもあり得ま す。たとえば , srand ( ) や rand ( ) をまとめ たく乱数クラス > というのはどうて、しよう。 List 6 の Random にはメンノヾ変数は存在せ ず , 従来の構造体としての性質は完全に抜 け落ちています。仮に Random が , lnit によ って初期化された乱数系列 ( 「乱数表」といっ てもよい ) をメンバ変数として保持するよう なインプリメントになっていれば , 「 Random のインスタンスを複数使って複数の乱数表 を使い分けることがて、きる」といえます。し かし , 相手はなにしろ乱数てす。そんなこ とをしてもメリットがあるか疑問てす。 のようにグローバルな乱数表を利用するイ ンプリメントて十分てしよう。となると , この Random のインスタンスにはどのよう な意味があるのてしよう ? としか答えようがありません。 ない ういったクラスの場合には , 特定の用途に 供する関数群をグループ化していることだ けが意味を持ち , そのクラスの実際のイン List 2 : 3 : 5 : 6 : 7 : char *last; char *tail; 1 : struct stblk { s ok ファミリ int strtok-next(struct stblk *blk) ; int strtok_first(char *s, struct stblk *blk, const char *dlm) : スタートアップ C 十十 129

5. 月刊 C MAGAZINE 1991年9月号

第回一 Quick C, MS-C Ve 「 6 ℃環境で学ぶ。 0 0 。 $ 。可 独学より大学 : ソフトウェア開発のさまざまな分野で標準プログラミンク言語となった c 言語。 Windows3.0 や MS OS / 2 のプログラミングに おいても C 言語は必要不可欠なもので魂セミナーでは Windows3.0 や MS OS / 2 上のアプリケーションを作成したい方、また既 存のプログラムを C 言語で書き換えたい方などを対象に、 c 言語の基礎から応用まで実習中心に学ぶことができます 下記コースも 好評開催中 ・ Windows コース ・フレゼンテーション・マネージャコース ・ LAN マネージャコース ・テノヾイスドライノヾコース ・ OS / 2 コース これから C 言語を始めようとする方を対象に、 C 言語の C 言語の特徴である、関数、制御構造、ポインタ、構造 基本的な文法からわかりやすく解説します。統合環境を 体についてフログラムを作成しながら詳しく解説します。 持つ Quick C を使って理解を深めます。 セミナは、最新の MicrosoftC Ver6.0 を使用して実施 いたします。 ■期間 : 2 日間 ■期間 : 3 日間 ■受講料 : 6 万円 ( 税別 ) ・受講料 : 9 万円 ( 税別 ) ー内容 : C 言語の書式、変数の使い方、画面 ・内容 : 配列、ポインタ、文字列、構造体、 表示方法、キーポード入力、関数、制 PWB の統合開発環境 御文、 Quick C での環境設定等 環境設定、開発手順、デバッグ方法 解ー ・お問い合せは 富士ソフトウェア株式会社 MIJ 教育センター TEL03-3452-7722 ( 直通 ) FAX. 03-3798-0599 。士ソフトウェア株式会社 MIJ 教育センター 〒田 8 東京都港区三田 3 ー 4 ー 3 三田第一長岡ビル 〒田 0 東京都新宿区西新宿 7 ー 5 ー 25 K ビルディング く資料請求番号レ 0 〉

6. 月刊 C MAGAZINE 1991年9月号

実力養成講座 5 イベートなメンバ変数 s によって領域を管理 している。 〃 3 て , 〃 2 によって確保されたクラスの領 域を解放する。解放される直前にディスト ラクタが自動的に呼び出され , プライベー トなメンバ変数 s が管理している領域の解放 を行う。ディストラクタが終了した後て , クラスの領域が解放されることになる。 〃 4 ては , クラス変数 a の有効範囲は終了 こても , し , 変数の領域が解放される。 『 ! された構造体ーークラス いやしくも「スタートアップ C 十十』なる ものの読者ともあろう方は , クラスとはな んぞや , という記事を以前にも読んだことが あるかもしれません。いわく , ユーザ定義 のデータ型てある。いわく , 個々のインス タンスの性質や属性を抽象した概念集合て ある。うんぬん。 そういうご託宣はとりあえず棚上げして , ありていにいってしまえば , C 十十のクラス とは構造体のことてす。 構造体の仕様は拡張されて , 変数だけて なく関数もフィールドに含めることがてき るようになりました。データもコードもま とめあげることのてきる構造体 , それがク ラスと呼ばれる代物てす。合わせて用語も 変更して , フィールドはメンバといい直さ れ , クラス内変数のことをメンバ変数と呼 び , 関数のことをメンバ関数と呼びならわ します。また , このクラス型の変数は ( クラ ス ) オプジェクトまたはインスタンスと呼び ます。 もっとも単純なクラスの例を List 1 に示し ます。用語を整理して List 1 を解説すると , 「メンバ変数 value と , メンバ関数 lnit, Print とを持つクラス A が宣言されており , a はク クラス変数 a の有効範囲の終了直前一 トラクタが呼び出されることになる。 こディス メンバ関数なのか明示しなくてはなりませ 解決演算子 . : を使って , どのクラスの メンバ関数を定義するときは , スコープ ということになります。 ラス A のインスタンス ( オプジェクト ) てある」 実践編 ールの部品化を容易に実現し , 再利用性を 作をひとまとめにすることにより , モジュ 利点としては , データとデータに対する操 抽象化によりデータを保護する。クラスの クラスは , データの抽象化を実現しその ん。 はすてに説明済みの項目てすが , 以前解説したときは , といった形てした。今にして思えば , これ は ( 空 ) : : a て「トップレベルの a 」を表す という特殊な用法 , ということがわかりま す。 メンバ関数は , 普通の関数と同じように オーバロードもてきるし , デフォルト引数 void Print(FlLE * fp void Print( ) ; struct A { ロードして , も使えます。たとえば A : stdin) : : Print をオーバ メンバ関数をインライン関数にすること などというものを設けることもてきます。 fprintf (fp, "%d*n", value) : void A : : Print(FILE * fp) スタートアップ C 十十 高められるということがあげられる。 C 十十プログラミングては , このクラスを どのように用いるかというプログラム設計 段階のクラス設計が重要になるてあろう。 クラスをどのように用いるかは , 本連載後 半て述べる予定てある。 次回はこのクラスの応用的な機能てある フレンド関数 , 演算子の多義化 , 派生クラ スといった機能を解説する。 白倉伸一郎・山本浩文 もてきます。このとき , キーワード inline を つける必要はありません。クラス A のメンバ 関数をインラインにした List 2 を見てもおわ かりのとおり , inline がなくても誰がどう見 たってインライン関数ばく書けるからてす ( もちろんつけてもかまわない ) 。 それはともかく , なんとも味気ないサン プルてす。用語や書式はたしかにカッコい いのてすが , 実際に行っている処理内容は 大したものてはありません。 A : : lnit ( ) が List 単純なクラスの例 pri ntf ("XdYn", value) : 14 : void A::Print() value 9 : void A::Init(int n) void Print(); vo i d i t ( i nt れ ) : int value; 3 : struct A { 1 : #include く stdiO. h> 24 : 23 : 22 : 8 : 6 : 5 : 4 : 2 : return 0 : a. Print(); a.Init(2); 19 : main() スタートアップ C 十十 127

7. 月刊 C MAGAZINE 1991年9月号

境 新環一 最発ポ 高橋良明 ODatabase TooIchest 』 C 言語で柔軟性のあるテータベースシステムを構築するライプラリ 「 C/Database T001chest 」は , コンバクトなテータのティス クスペース , ディスクアクセス速度の向上などを目的に開発された。 る閉鎖的な代物となってしまうのて、ある。 らないということを指す。たとえば社内て、 フィルアクセス これを避けるには「過度のすり合わせ」を データベースを使ったふたつのアプリケー レーチンの重要性 禁止すればよいのて、あるが , 現実的て、はな ションを開発したとしよう。このプログラ い。データベースアクセスルーチンは , 「プ ムは , それぞれのデータファイルと相互に データベースシステムを開発する際にネ ラックポックス」てあるほうが望ましいから ックとなるのが「データベースファイルを管 密接な関係がある場合 , 独立したデータフ 理するファイルアクセスルーチン」の開発て、 だ。これによってファイルをアクセスする ァイルて、なければふたつのソフト間て、のデ ためのルールがきちんと確立されるのて , ある。 ータの共用は図れなくなってしまう。 「ローカルなルール」を排除することがて、き 画面表示やキー操作などのマンマシンイ 開発中のプログラマは , どうしてもチー るのて、ある。もちろんプラックポックスは , ムのほかの人たちとプログラムを「すり合わ ンタフェイスに関しては , 設計者のセンス 各ューザの意見によって高度な性能を有し ( 感覚的センス ) が大きな比重を占めるが , せ」る必要がある。「すり合わせ」を行わない ていなければならない。一般のアプリケー ファイルアクセスルーチンはやや違った意 とインタフェイスミスなどが発生し , バグ ションレベルて、いえば , 「マシンの BIOS や 味のセンス ( 技術的センス ) が要求される。 の原因となる。しかし時として「この場合に ポートをいじってはならない」というルール ノヾソコンレベルて、ファイルアクセスルー 限ってはこうしてほしい」という , いわば「過 に近いものがある ( しかし DOS の機能が低い チンを開発するには , およそ次のような要 度のすり合わせ」を行うと , て、き上がったは ために , やむを得ずいじらなくてはならな 素を考慮して開発しなくてはならない よいが「美しくないその場しのぎのルール」 ・ファイルとインデックス構造 によって作成されたプログラムになる危険 いのが現状だが・・・ 「アクセススピード」は , ファイルやイン ・ファイルの独立性 性がある。 デックスの構造と密接な関係がある。構造 ・アクセススピード これは自分の使う関数が「身近な場所」て、 上 , インデックスの再作成が遅いなどの欠 ・バッファ管理 作成されていることが大きな誘因となって 「ファイルとインデックス構造」は , 現在 点があると , 使いやすいものとはいえない いる。アプリケーションのふたつの開発チ 「バッファ管理」は , ファイルアクセスの 「 B + tree 」形式が一般的て、その優位性カ噬認 ームが同時に , データベースアクセスルー ためのメモリをどのように使うかを決定す されている。この方式はデータを挿入・追 チンの担当者に対して過度のすり合わせを るものてある。処理スピードを上げるため 加・更新した際のデータファイルとインデ 行うとどうなるだろうか。本来データベー ックスの更新が高速て、行えること , 可変長 の重要なポイントて、ある。一度アクセスし スアクセスルーチンは共通てあるはずだが , キーが使用て、きることなどが長所て、ある。 たデータをいかに有効に利用するかによっ 微細な点が異なってきて実際には「似て非な データファイルやインデックスの構造に て , 処理スピードが左右される。しかも , るものがふたっ存在する」ということにな よっては , 更新に要する時間の長いものが バッファ管理はバグが出やすい部分てもあ る。つまりデータベースアクセスルーチン は , アプリケーションプログラムの「傘下」 ある。 る。 「ファイルの独立性」とは , プログラムか となり , データファイルは「専用のデータベ このようにデータベースアクセスルーチ らデータファイルが独立していなければな ースアクセスルーチン」だけがアクセスて、き ンを自前て開発するには , かなりの工程が 136 C MAGAZINE 1991 9

8. 月刊 C MAGAZINE 1991年9月号

実践 MS-DOS プログラミンクス門 SOFT 日 K C 言語による 実践 MS-DOS 1 章 C 言語のシステムコールの方法 2 章 プログラミッ 実行フライをの構造と 0 プロクラミング 3 章 ティスクステムとファイル構造 4 章 入門 S ー DOS のメモリと拡張の方法 5 章 プ p セスの生成と終ア , 6 章 割り込み処理 ( インタラブト ) の概念と プログラミング 秋津彰文著定価 2 , 200 円 ( 税込 ) 「 C MAGAZINE 」の好評連載を単行本化。 C プログラミングを行う上で必須な MS ー DOS の 知識を明快に解説し、 C 言語と MS ー DOS の関係を活かしたサンプルプログラムを多数紹介。 る よ 秋津彰文・第一著・ S 旧朋羆聞闔 本書は MAGAZINE 』の好評連載℃プログラマのための MS ー DOS プログラミング入門」を大幅に加酬彦正し、改題して まとめたものです。 ソフトバンク出版事業部

9. 月刊 C MAGAZINE 1991年9月号

日本語版 MS - BA 7 登場 速報 Microsoft BASIC Version 7.1 Professional Devel 叩 ment System 山崎信行 マイクロソフト社から日本語版 MS - BA C7 か発売された。 MS- 日 AS 旧 7 は , 同社の QujckBASlC Ver. 4 - 5 の上位互換の言語仕様と なっている。両者の関係は , QuickC と MS - C の関係とよく似ており , 手 軽なプログラミングは Quick 日 A 日 C で行いはり高度な機能と質のよい コードを必要とするプログラムには MS - BA C7 で行うという位置づけ と思われる。 MS - BAS に 7 のアウトライン MS-BASIC 7 は , QuickBASIC をベース として拡張が行われた , 構造化 , モジュー ル化された言語仕様を持っています。この ため , 構造化プログラミングが容易に行え ます。 QuickBASIC て、大規模なプログラムを作 成するにはテクニックが必要て、したが , MS -BASIC 7 て、は ,EMS(LIM4.0) を利用する ことにより (EMS オーバレイ機能 ) , 最大 16 M バイトまて、の EXE ファイルをより簡単に 作成 , 実行することがて、きます。この結果 , 従来の BASIC て、は困難て、あった大規模なア MS-BASIC 7 最大の特徴て、す。 模開発に適した言語仕様を採用したことが 構造化 , モジュール化などを用い , 大規 て、きます。 プリケーションの開発を容易に行うことが イマイズされたオプジェクトコードの生成 品質が向上し , コンパクトて、高速なオプテ リンカ ( LINK. EXE ) によって生成コードの る BASIC コンパイラ (BC. EXE) と効率的な また , 高度な最適化アルゴリズムを用い が可能になりました。また OS / 2 上て、動作す る EXE ファイルを生成することがて、き , MS ー DOS 上のソースプログラムを OS / 2 上て、リ コンパイルするだけて、 , ほとんどのプログ ラムを OS / 2 上て、動作させることがて、きま す。さらに , ソースプログラムも供給され , Fig. 1 日本語版 MS ー BAS ℃ 7 バッケージ構成 ユーザーカスタマイズ化可能な T001b0X Library( ユーザインタフェイスツールポッ クス , プレゼンテーショングラフィックツ ールポックス , 行列演算ツールポックスな ど ) の充実などがあげられます。 ー、色当物畩 Micra 、 4 立 c 日本語版 MS ー BAS ℃ 7 登場 23

10. 月刊 C MAGAZINE 1991年9月号

Fig. 2 インライン関数として定義 Fig. 1 メンバとする関数の定義 class クラス名 { 〃メンバ関数の定義 関数の型関数名 ( 引数並び ) 関数本体 〃メンバ関数のプロトタイプ宣言 関数の型関数名 ( 引数並び ) : / / プロトタイプ宣言された関数定義 関数の型クラス名 : : 関数名 ( 引数並び ) 関数本体 class クラス名 { 〃メンバ関数のプロトタイプ宣言 関数の型関数名 ( 引数並び ) : / / プロトタイプ宣言された関数のインライン定義 inline 関数の型クラス名 : : 関数名 ( 引数並び ) 関数本体 に「クラス名 : : 」を記述し , どのクラスの イベートメンバとなり , キーワード public を メンバとなる関数かを指示する。クラスの ラベルとして記述したあとのメンバは , パ メンバとなる関数をメンバ関数と呼ぶ。 プリックメンバとなる。 クラス定義内てメンバ関数が定義された class クラス名 { 場合に , そのメンバ関数はインライン関数 / / プライベートメンバ として扱われる。また , クラス定義とは別 メンバ変数 にメンバ関数が定義された場合は , 関数呼 メンバ関数 び出しとなる。ただし , クラス定義とは別 public . に定義されたメンバ関数をインライン関数 メンバ変数 として定義する場合は , メンバ関数定義の メンバ関数 際に , キーワード in ⅱ ne を関数の型の前に記 述する (Fig. 2 ) 。メンバ関数に対し , データ また , クラス定義時にラベル private : を としてのメンバをメンバ変数と呼び , すべ 己述することて , パプリックメンバ以降に てのメンバ変数とメンバ関数をまとめて呼 プライベートメンバを指定することも可能 ぶ場合は , メンバと呼ぶ。 て、ある。ラベル private : や public : は , 複 もうひとつの拡張された概念て、ある , メ 数混在することが許されている。 ンバのスコープについて解説する。構造体 クラス名 { class のメンバは , 構造体変数が外部変数て、ある / / パプリックメンバ public : ときや関数の引数として指定されると , ど メンバ変数 の関数 ( ューザ関数 ) からもメンバを参照 ( ア メンバ関数 クセス ) てきるが , クラスてはユーザ定義関 / / プライベ ートメンバ 数から参照てきるメンバと , そうて、ないメ メンバ変数 ンバをクラス定義時に指定てきる。 メンバ関数 他の関数から参照てきるメンバをバブリッ public : クメンバ ( 変数 , 関数 ) , メンバ関数とフレ ンド関数以外の関数から参照てきないメン バをプライベートメンバ ( 変数 , 関数 ) と呼 ぶ。これらは , クラス定義時に区別され , キーワード class 以降にあるメンバはラベル が別の保護レベルを示すまて自動的にプラ しは , 構造体て、のメンバの参照と同様て、あ る。クラス変数を宣言することにより , そ の実体が記憶領域上に割り当てられ , 実体 に対しては演算子 ! ク ( ピリオド ) を使い クラス変数名 . メンバ変数名 て、値の参照を行う。 メンバ関数の呼び出しは , クラス変数名 . メンバ関数名 ( 引数 ) て、行われる。実体を指すポインタの際には , 演算子、、一 > 〃を用いる。パプリックメンバに 対しプライベートメンバは , ほかの関数か らは参照が行えない。したがって , プライ Fig. 3 メンバの参照 class クラス名 { メンバ変数 p 「 a 関数の型メンバ関数 p 「 af ( ) / / バブリックメンバ 1 三ロ public : メンバ変数 pub , 関数の型メンバ関数 pubf ( ) メンバ変数 p 「 a 十十 : メンバ関数 p 「 af ( ) : private . main( ) クラス名クラス変数 1 : クラス変数 1 . メンバ変数 pub = 値 , クラス変数 1 メンバ関数 pubf ( ) : クラス名 * クラス変数 2 , クラス変数 2 = & クラス変数 1 : クラス変数 2- > メンバ変数 pub = 値 : クラス変数 2 ー > メンバ関数 pubf ( ) : / / バブリックメンバ メンバの参照 ューザ関数からのパプリックメンバとな るメンバ変数の参照やメンバ関数の呼び出 124 C MAGAZINE 1 1 9