p391〜p440まで
バイナリモードとテキストモード
バイナリモードとテキストモードの違いは改行コードの取り扱いについてだけ。 p392:下段
テキストモードでは自動的に改行コードを環境に合わせて変換してくれる。 p392:中段
これは知らなかったかもしれない。バイナリモードとかテキストモードとか昔使ってた気がするけど、多分体感で覚えちゃってて、ちゃんとどういったものかって認識してなかったんだろうな。
N進数
この本はこういう情報数学的な部分も勉強できるから初心者にお勧めですね。
バイナリモードでの読み書き
ちょっと飯。
ここはほぼバイトオーダーの話。これはOK。
基本的にこの章の話はセクションはじめの要点とコードさえ見ときゃいい感じっぽいなぁ。それにほとんど機能の説明だし・・・。
ファイルポインタを操作する関数は読み出し用、書き込み用とあるが、ファイルポインタは実際には一つしかないので、どちらを使っても同じファイルポインタが返ってくる。
ストリーム
iostreamとかの継承関係についてかかれてた。まぁここらへんは必要になったら覚えればいい。
標準エラー出力として、cerrとclogがある。
標準出力と標準エラー出力は両方ともデフォルトでは画面への出力になるが、 リダイレクトすることにより、出力先を変更できる。 なので、できるだけ使い分けたほうがいい。 p422:中段
なるほど、はじめて知りました。いつもどう使うんだろとか思ってたけど、使い分けにはそういう意味があったのね。
ストリームの流れを操作するものをマニピュレータという。endlとかflushがそれ。 マニピュレータを<<や>>に流すことでストリームを操作できる。 p423:中段
マニピュレータを自作すると便利なことが多いらしい。istream&やostream&を引数と戻り値にとる関数を作ればそれが引数なしのマニピュレータとなる。ここはp426の例を見ればOK。
名前空間
今まで適当に使ってきてた名前空間。ここでしっかり身につけたいところ。
基本的には名前空間はやっぱり名前の衝突を避けるためにあるみたい。基本どころは大丈夫として、省略周りから。
usingディレクティブによって、同名関数の名前空間を省略すると、 どちらを呼べばいいのかわからないから、明示的に名前空間を指定しなければならない。 同名関数でなければ問題ない。 p431:中段
usingディレクティブのほかにusing宣言というものもある。例えば、こう使う。 coutやendlだけならstd::を省略したいなどの場合に、using std::cout;みたいに、 個別にusingをする。 p431:下段
関数内でusingを使うことも可能。 p432:下段
名前空間にはエイリアスを与えれる。例えばこんな感じ。 namespace Foo { namespace Bar { namespace Baz { void Hoge(); } } } namespace FBB = Foo::Bar::Baz; p433:下段
usingディレクティブとusing宣言は結構微妙な感じ。個人的にもいつも普通にネストして使ってる。名前空間のエイリアスは結構使えそうだ。
using自体は本当は少し違う役割をもっているらしい。これは後で出てくるということ。
他にも名前空間の注意点として次のようなことがある。
グローバル名前空間内にある名前と衝突した場合、現在の名前空間内の名前が優先される。 しかし、関数定義の順によってはグローバル名前空間内の関数が使われることがある。 基本的には関数プロトタイプ宣言をしていれば問題はない。 p438,439
名前空間内に新しく識別子を追加する場合には、それと同名の、 別の名前空間内で宣言された識別子をusingして利用していないか気をつける必要がある。 p438:中段
また、無名名前空間についても一言。
無名名前空間は関数以外にも適用される内部リンケージになる。 p440:コラム
内部的にはソースファイル毎に名前空間が作られているらしく、そのファイル毎の名前空間を使用するために無名名前空間を指定するといった感じになるようだ。
今日はこんな感じで。ファイル周りはやっぱりCに比べれば楽だなーと思った。あと、名前空間はそんな大したものじゃなかった。多分今度からもusingは特に書かないと思った。
次は宿敵テンプレート!