{magclick}
{magclick}
/*
    KAB-studio.h
        　ＫＡＢ−ｓｔｕｄｉｏで先週更新した内容
        が格納されたヘッダーファイルです（笑）。

    (C)KAB-studio 1999 - 2000 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com

    送信日： 2000/08/07(Mon) No.069
    配信数： 3800（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/
{magclick}

/*          ２０００年８月１４日（月）はお休みします              */

　来週（８月１４日）はまぐまぐがお盆休みなので、お休みします。
　Pubzine 経由での配信もお休みします。ごめんなさい。

/*                ２０００年８月７日（月）の更新                  */
http://www.kab-studio.com/Info/News/

・「金菜さんの憂鬱」リスタート！
　ずっと休んでた金菜さんの憂鬱の連載を再開しました！　金菜さんファン
（いるのか？）の皆様お待たせいたしました。当分は「 const メンバ関数」
について書いていきます。 C++ 文法の基本を知りたいあなたは読むベシ！

・表紙を８月バージョンに。
　毎月恒例、新しい表紙です。出来は……たぶん１週間後には新しい表紙に
なってます（爆）。夏休みは絵をいっぱい描くのですよ。

・Codian ちょっと更新
　Codian のファイルオペレーションをちょっとだけ更新。 
SHFileOperation() の使い方が間違っていたので訂正しました。
[Codian]
http://www.kab-studio.com/Programing/Codian/


/*                        チョー普通な日記                        */
http://www.kab-studio.com/nikki2/

2000/07/30 (Sun)
　夏休みを満喫。かぶヘッダー書いたりモデリングしたり柔軟体操したりテ
レビ見たり。いいねぇ。

2000/07/31 (Mon)
　新宿の京王百貨店でやってる大古書市へ！　でも掘り出し物はなかったで
す。代わりに画材買ったりゲームしたり。音ゲー初プレイ！　こりゃ面白い
わ。

2000/08/01 (Tue)
　８月表紙完成！　しかし、出来は……。一応、作成過程とかしっかり書い
たので参考にしたい方は。そして特撮物必筆の出来「カーレンジャー」につ
いて暑く語る！＜うざそう……。そして先週の{magclick}の謎が今明かされ
る。

2000/08/02 (Wed)
　ぷらとわ書いたりイラスト描いたりゲームしたり。ああっ夏休みって感じ。

2000/08/03 (Thu)
　ゼミ関係に行ってきました。わたしゃビールはダメなのよ（泣）。だから
ってしんるちゅーの水割りがしがし飲むわてもわてだが（汗）。甘い系なら
げしげし飲めるんですよねー、吟醸酒とかワインとかも。

2000/08/04 (Fri)
　何もできない日。って何？　というあなた必読！　そしてアニメの話ばっ
か。むー。

2000/08/05 (Sat)
　夢。眠ってる間に見る方のね。昔は色々と夢日記書いたんですよ。そんだ
けインパクトあるの多かったんだなー。寝ぼけてマジ蹴り放ったりも（爆）。


/*                         鏑矢の憂鬱                             */
http://www.kab-studio.com/Programing/KabuU/

2000/07/30 (Sun)
お便り
const メンバ関数と例外指定について
例外指定については以前書いた
const メンバ関数内では this が const 扱いになる
よってメンバも const 扱いだからメンバ変数を書き換えられない
const からは const しか呼べない
設計段階で非常に苦労する
でも安全性が向上

2000/07/31 (Mon)
お休み

2000/08/01 (Tue)
お休み

2000/08/02 (Wed)
かぶヘッダーが進まない
お便り
SHFileOperation() で表示されるダイアログについて
フックとかを使う？
SHFILEOPSTRUCT::fFlags に FOF_NOCONFIRMATION を立てるとか
「ファイルオペレーション」のコードに間違いが

2000/08/03 (Thu)
お休み

2000/08/04 (Fri)
辞書の単語追加
検索っぽいの多い
図を入れるかどうか
「アライメント」とか図がないと説明大変
単語数が増えて管理も大変
プログラム組む必要あるかも

2000/08/05 (Sat)
引き続き辞書
そして金菜さんの憂鬱
当分は const メンバ関数について
一気に書き貯め


/*             プログラミング辞書・今週の追加単語                 */
http://www.kab-studio.com/Programing/Dictionary/

・追加単語：
ホットキー ホットキーコントロール イメージ スレッドモデル
ドラッグ アライメント 半角カタカナ ファイル操作 ライブラリファイル
WINAPI デーモン DLL の実行時リンク DLL の実行中リンク 
DLL の遅延ロード Winsock アドレス

・今週のごめんなさい
poinnta クラスライブラリ static コレクション DLL 構造体 ラッパー
socket スレッディングモデル WM_SIZE レジストリ パイプ sock
半角 and (カナ or カタカナ) lib バッファ GetProcAddress
イベントログ CDialog 環境変数 S format プロセス マーシャリング
インスタンス メッセージ volatile ライブラリ

・今週の状況：
　今回でとうとう単語数が４００を超えました！！　こんなに増えてどうし
ましょう（汗）。逆に言うと、ウィンドウズプログラミングってこれだけの
知識が必要ってことなのかも。そりゃ大変だわ。


{magclick}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『あ、数字を文字にって、 std::strstream っていうのでできない？』
「できるよ。その辺も教えるからね」
『や、やっと追いついた！！』
　追いついたあなたは購読登録。
http://www.kab-studio.com/Programing/STLiostream/
_______________________________________________________________[KCM]
{magclick}


/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/


　Version 5.04
文字ってなーに

「さて、今回は難敵、文字列ってものについて見ていきます」
『げ、難敵なの？』
「そ。ポインタが難しいって言われる理由は３つ。ひとつはメモリのイメー
ジの仕方」
『ふたつめは配列よね』
「で、みっつめはこの文字列の操作方法。でもこれを乗り越えれば」
『楽勝？』
「うーん」
『むー』
「……で、文字列の前に、まず文字から」

void A_Char()
{
    char ch = 'A';
    TRACE( "%c, %X\n", ch, ch );
    // A, 41
}

『 char って１バイトサイズで、整数入れてるよね。でもなんで文字が入る
の？』
「 A が ' (アポストロフィ)で囲まれてるでしょ」
『あ、ホントだ、ダブルコーテーションじゃない』
「実は、文字って数字なんです」
『はい？？』
「正確に言えば２進数のオンとオフ、ね」
『あ、コンピューター上のものは全部そうなんだもんね』
「文字もそう。もし普通に〈手書きの文字〉をコンピューターに取り込んだ
ら」
『全部ＣＧ？』
「そうなっちゃう。それじゃ大変だから、文字を数字で表すことにしたわけ」
『これ見ると、 A は１６進で 0x41 ってこと？』
「そういうこと。コンピューターは、 A って文字を 0x41 って数字に変換
するわけ」
『変換って、どうやって？』
「変換用の表があるの。えっと、 MSDN 開いて【ASCII コード】ってページ
開いてみて」
『ほいっと』
　【ASCII 文字コード】というページが開く。いくつもの表が並んでおり、
それぞれに記号や数字、文字が書かれている。
『う”、なんかよく分かんない』
「この変換表を【文字コード】って言います。右から２番目の列、上から２
番目を見てみて」
『 A B C ってなってるね。あ、その左の数字が 41 42 43 ってなってる！
もしかしてこれが A が 0x41 ってこと？』
「そういうこと。ちなみに Dec は decimal 、１０進数って意味。 Hex は
hexadecimal で」
『１６進数って意味でしょ』
「そういうこと。で」
『ああっ！！』
「な、なに？」
『もしかして、 TRACE() に使ってた %d って decimal の d なんじゃない？
%X は hexadecimal の X とか』
「うん、たぶんそうだと思うよ」
『はー、なんかここに行き着くのにすごーく時間がかかったよーな』
「確かに……。さて、 A が 0x41 って数字ってことは分かったでしょ。逆
に char 型変数に入ったこの 0x41 って数字を文字に変換するにも」
『さっきの文字コード表ってのを使うんだ』
「そういうこと。 0x41 って数字を〈Ａだ！〉って認識して、文字として表
示してくれるわけ。それが」
『 TRACE() で %c 渡してるとこよね。こう指定したから A って表示されて、
%X って指定したら、数字の 0x41 って表示してくれる』
「そう。前に言ったかもしんないけど、結局、コンピューターのデータって
いうのはメモリ上のオンオフだけ」
『それをどうみなすか、よね。 int の負の整数とかバイトオーダーとかで
散々聞かされてきたもんねー』
「うん、その辺は大事だからね。ちなみに」
『 %c の c はやっぱ char よね』
「そ、そう……あ、そう、で、 char は character の略ね」
『あれ、 char ってただの１バイトサイズの型だと思ってたんだけど、もし
かして文字入れる専用？』
「１バイトサイズだから、普通の整数はまず入らないからねぇ」
『そういえばそうね。なんか、ずっと整数値入れるもんだと思ってたのに、
文字を入るのだったのねー』
「別に int に入れても問題ないけど」
『あ、そういえば』
「それに、なんで１バイトサイズで十分なんだと思う？」
『あ、そういえば。文字コード見ると、１バイトサイズまでしか文字がない
ね』
「 A から Z と a から z 、それに記号あわせても２５５は超えないからね。
だから char で十分」
『あれ、それって unsigned じゃない？』
「ぎく！　そう、文字コードって、数字っていうよりも１６進数のデータと
しての面の方が強いから、 unsigned char の方がいいかもね」
『うん、あたしもそう思う』
「でも面倒だから unsigned 付けられないこと多い……」
『げ、なにそれ』
「この辺にも色々問題があるんだわ。ま、それは今回は置いておくことにし
ましょう」
『もひとつ質問。漢字とかは？　２５５文字に入らないでしょ』
「ふっふっふー、それがまた大変なんだ」
『げげ』
「ま、日本語の話はまたこんど。とりあえず今は、文字は数字で、その変換
は文字コードでできて、文字ひとつの数字は char 型の変数に入る」
『うんうん、その辺ならなんとか分かるかも』
「じゃ、ずーっと昔を振り返ってみましょう」
『ずっと昔？　平安京とか？』
「なぜに平安時代。 Ver 1.0 （ No.003 ）を見て」
『うっわすっげー昔！！』
「どう、読んでみて」
『うっわ、プログラミングができるって知ってうれしがってる、わけー！！』
「って、わざとおじさんっぽく言わないよーに」
『はー、そういえばこのとき、テキストファイルをバイナリーモードって
ゆーので見てるんだね。なんかメモリ見てるのと似てる』
「ほとんど同じだよ。メモリもディスクも同じオンオフの世界だもの」
『あ、そうか。で……』

数字： 61 62 63 64 65 66 67 68 69 を、
文字： a  b  c  d  e  f  g  h  i

『うわ、これって ASCII 文字コードそのままじゃん！！』
「でしょ。つまりファイルの中も同じ、数字が入ってて、それを ASCII 
コードに変換して表示してるってだけ」
『これもみなしねー。あ、こんなかで〈数字と文字〉みたいなのやって
る。そいや ASCII 文字コードで見ると、 1 は 0x31 なんだね』
「さっきの関数で 'A' を '1' にすれば分かるよ」
『なるほど。…… 1 は整数値だから char に入る、 '1' == 0x31 も整数値
だから char に入る……』
「ってことは、 1 って数字を '1' に変換するには？」
『 0x30 を足す！』
「そういうこと。プログラム書いてみ？」

void char2character()
{
    char ch = 1;
    ch += 0x30;
    TRACE( "%c, %X\n", ch, ch );
    // 1, 31
}

『まず char の変数作って 1 入れて、それに 0x30 を足すと '1' になる、
これを %c で表示すれば 1 になる！！　それに……』

    char ch = 2;

『ってすればちゃんと 2 が表示される！！　すごい！　すごいよ水希ちゃ
ん！！』
「そう、整数を文字に変換する基本的な部分は、こういうこと。これで、昨
日の (LPCTSTR) ってキャストが無茶苦茶だってこと、少し分かるでしょ？」
『そっか、文字の時と数字の時、全然中身が違うんだもんね。そーゆー変換
をしなきゃいけないってことなんだ』
「そういうこと」
『でもこーやって変換すればいいんでしょ？　楽勝っぽいけど〜』
「 ch には１文字しか入らないんだから、 100 とかは変換できないでしょ」
『う”』
「そこで出てくるのが文字列、ってもの」

void StringArrayAddress()
{
    char chAry[] = "ABC";
    TRACE( "%X\n", chAry );    // ここにブレークポイント。
}

『えっと、新しいのって配列のとこだけだよね』
「そう、ここ」

    char chAry[] = "ABC";

『配列作ってるんだよね。でも、何個かっていうの指定してないよ？』
「指定してない場合には、必要な分だけ確保されるから。さっき見たように、
char 変数一個につき１文字、だと、 ABC なら変数何個必要？」
『３つ！』
「そう。で、答は４つね」
『……？？』
「まあこれは置いといて、実はこれは文字列だけの特別な方法」
『どゆこと？』
「普通の int の配列とかじゃ、こういうふうに配列に値を入れられないっ
てこと」
『おー』
「こうすると、配列の要素ひとつひとつに文字を入れてくれて、しかも自動
的に必要なサイズになってくれるんです。じゃ」
『ブレークポイントセットしてメモリを見る！』

41 42 43 00 8C F5 64 00 E2 19 40 00 2C F8 64 00 C0 01 52 00  ABC....

『あ、 41 42 43 、なんかバイナリーエディタで見たときと同じ感じ』
「それぞれのマスはどの変数を指してる？」
『えっと、 char は１バイトだから、 chAry[0], chAry[1], chAry[2] だよ
ね。あ、なるほど、 char １個につき１文字ってこーゆーことね』
「そう。実際に見てみると……」

void CharsArray()
{
    char chAry[] = "ABC";
    TRACE( "%c, %c, %c\n", chAry[0], chAry[1], chAry[2] );
    // A, B, C
}

『お”お”、ちゃんと１要素１文字になってる！』
「でしょう、こうやって確認しないとね。ちなみにさっきのメモリので、一
番右の ABC っていうのは、メモリ上のデータを無理矢理 ASCII 文字コード
に変換したもの」
『なんか変な日本語が表示されたりしてる……』
「まあ要するに重要なことは、〈文字列〉でも、原則的には char ひとつに
文字ひとつ、ってこと」
『だから char の配列にするのね。ってことは、 100 を文字列に変換する
ときには、 100 のひとけたずつを char 配列のひとつひとつに変換してい
かなきゃいけないってことなんだ。なんかめんど……』
「その辺はちょっと考えれば簡単に処理できるけど、その前に文字列につい
て触れておきます」
『なんで答は４つなのかとか教えてくれる？』
「もちろん！　というわけで次回に続く！」

/*
    Preview Next Story!
*/
『あ！　バイナリーってどーゆー意味？』
「 binary は２進数って意味」
『でも表示は１６進数じゃん』
「２進数を４つまとめて表示したのが１６進数だからね」
『というわけで次回』
＜ Version 5.05 配列と文字列 ＞
「につづく！」
『〈素のデータ〉っていうのも間違いじゃないかも』
「僕は嘘は言わない！」
『なんか騙されてるよーな気が……』


/*                       金菜さんの憂鬱                           */
http://www.kab-studio.com/Programing/KanaU/

const メンバ関数
#01 const 変数

　皆さんお久しぶり、金菜です。
　No.054 のあとずっと休んでたけど、今日からまた再開します。今回から
のテーマは「 const メンバ関数」。他の所で訊かれたものなんだけど、も
う少しちゃんと解説したいと思って。じゃあ、早速始めたいと思います。
　まず最初は、 const な変数から。

    const int i = 100;

　ってすると、変数 i を 100 って整数値で初期化して、その値が固定され
ます。書き換えることができないってことね。だから、

    i = 200;    // エラー。書き換えられません。

　これはコンパイルエラーになります。それに、後で書き換えられないから
最初の初期化は必ずしないといけません。

    const int i2;    // エラー。初期化していません。

　const な変数は書き換えられないから、安全に使うことができます。ただ、
これだと本当に変えられないから、そういう点で使いにくいよね。そこで、
非 const な変数を、一時だけ const 状態で使うようにします。それには 
const 型への参照やポインタを使うこと。

    int i = 100;
    const int &ri = i;    // const int 型への参照。

　i は非 const 。これはいつでも値を変えられます。これを const 参照の
ri へと入れることで、 ri を通して i を const として使えます。

    ri = 200;    // エラー。書き換えられません。

　非 const な変数を生で使うのは危険。書き換えられる範囲が広がって、
管理するのが大変になるから。そこで、書き換える必要のない部分にはでき
る限り const 参照を使って、書き換えられる範囲をぐっと狭める、そうす
ればプログラムの可読性・安全性・メンテナンス性が向上します。
　この「書き換えられる部分を狭める」ことが、 const を使う上での基本
方針。もしこれにメリットを感じないんだったら……来週から読まなくても
いいかもね。その来週は、 const クラス型について。じゃね。


/*            ２０００年８月１４日（月）の更新予定                */
http://www.kab-studio.com/Info/News/

・KAB-studio.h お休み。
　KAB-studio.hの８月１４日配信分をお休みします。
　理由はまぐまぐのお盆休み。あ、でもＰｕｂｚｉｎｅ経由で配信している
ものもお休みします。１年間は５２週、お盆と正月を休むとちょうど１年間
５０号になるんで（爆）。
 

/*            ２０００年８月１６日（月）の更新予定                */
http://www.kab-studio.com/Info/News/
・STL & iostream 入門お休み。
　 STL & iostream 入門の８月１６日分配信をお休みします。
　理由はまぐまぐのお盆休み。最初から予定していたものなので、配信の遅
れ等はないのでご安心ください。
[ STL & iostream 入門]
http://www.kab-studio.com/Programing/STLiostream/


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
http://www.kab-studio.com/Programing/KabuU/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www.kab-studio.com/Freeware/

/*
    KAB-studio.h
    Weekly Mail Magazine.
    Written by Kaburaya Seiden.

    (C)KAB-studio 1999 - 2000 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/


/*                      See you next week!!                      */
