Arantium Maestum

プログラミング、囲碁、読書の話題

C++

C++のiostreamの<<を導入したのはストラウストラップ

C++

最近@karino2さんのポッドキャスト「プログラム雑談」のバックナンバーをいろいろ聴いている: anchor.fm 二週間ほど前に書いた聴いてるポッドキャストの記事ではまだ「気になっている」という分類だったのだけど、聴き始めたらいい感じにゆるいのと技術的な…

Effective C++勉強メモ: Item 27 キャストはできるだけ避けよう

「C++は基本的に型安全。コンパイルするなら本来unsafeなことはしない」とはじまるこの項目。本当か? 「キャストしなければ・・・」と続くわけだが、それにしたって今まで読んできた中にもどれだけundefined behaviourをうっかり踏みそうな地雷を見てきたと…

Effective C++勉強メモ: Item 26 変数の定義はできるだけ遅らせる

古き良きCの作法だと使う変数はすべて関数の一番最初に宣言しておくものだった。 モダンなCだとその必要はないが、C++だとむしろ強く非推奨になる。 いくつかの理由がある。 一つには、変数宣言はその場でコンストラクタの実行を伴い、またスコープから出る…

Effective C++勉強メモ: Item 25 swap関数あれこれ

C++にはpimplというイディオムがある。 何か大きなデータを持つオブジェクトがある場合、単純にデータメンバとしてしまうと(例えば関数にデータを渡したりする時に)コピーが発生するとコストが高い。 そういう場合には、データを実際に保持するクラスと、…

Effective C++勉強メモ: Item 24 右辺左辺どちらでも型変換が必要な可能性があるオペレータはNon-Member関数

ごくたまに暗黙の型変換が役にたつ時がある。特定の数字を表現するクラスを定義する時などである。 class Rational { private: const int numerator, denominator; public: Rational(int numerator = 0, int denominator = 1); const Rational operator*(con…

Effective C++勉強メモ: Item 23 Non-Member Non-Friend関数をNamespaceで管理しよう

前回の項目でカプセル化の重要性について書いてあったが、そのカプセル化を最大に実現するためには、内部実装に触れることのできる面積を最小化する必要がある。 つまり、メンバ関数、フレンド関数といった「クラス内部のデータメンバに直接アクセスできる関…

Effective C++勉強メモ: Item 22 データメンバは黙って`private`

クラス内のデータはpublicでもprotectedでもなくprivateにしよう。という話。 ポイントは三つ 構文の統一 データアクセスレベルのコントロール カプセル化 構文の統一 オブジェクトのAPIはすべて関数(か演算子)になり、a.somethingだったかa.something()だ…

Effective C++勉強メモ: Item 21 Pass-by-存在しないオブジェクトへのReferenceしてはいけない・・・

前回の項目を理解するとなんでもPass-by-Referenceしたくなるが、ReferenceはそもそもちゃんとReferenceを返した先でも存在し続けるオブジェクトのものでなければならず、その条件が満たせないことも多い。という項目。 例えばAクラスにoperator*を定義して…

Effective C++勉強メモ: Item 20 Pass-by-Const-Reference

Pass-by-valueとpass-by-const-referenceのどちらか迷った時は大抵pass-by-const-referenceを選ぼう、という項目。 void printName(MyObj o) { std::cout << o.name(); } void printName(const MyObj& o) { std::cout << o.name(); } 前者がpass-by-value、…

Effective C++勉強メモ: Item 19 クラス・デザインは型デザイン

新しいクラスを宣言・定義するのは、C++の型システムの拡張に他ならず、型デザインなので本来簡単なことではない。という項目。 以下のことに気をつけるべき: 新しい型のオブジェクトの生成・破棄方法 初期化と代入の関係 Pass-by-valueの意味 型の性質上取…

Effective C++勉強メモ: Item 18 間違った使い方をしにくいインタフェース

リソース管理の部分は少し後回しで、項目をいくつか飛ばして18番目。 いいインタフェースとは、という項目で大きく分けて: 引数をClass/Struct化 インタフェースは統一しよう 戻り値にスマートポインタを使おう 上記三点の話題が挙がっている。 引数をClass…

Effective C++勉強メモ: Item 12 Copyメンバ関数を自分で書く場合は気をつける

オブジェクトのコピー関連のメンバ関数は(C++11より前の場合)Copy ConstructorとCopy Assignmentの二つ。(C++11以降はMove関連のものも・・・) これらはコンストラクタとデストラクタと合わせて、コンパイラがデフォルトで書いてくれる、という話は以前の…

Effective C++勉強メモ: Item 11 自己への代入に気をつけよう

例えばBオブジェクトがprivateデータメンバとしてAオブジェクトへのポインタを保持しているとする: class A {}; class B { private: A* pa; public: B& operator=(const B& rhs) { delete pa; pa = new A(*rhs.pa); return *this; } }; 上記のようなoperato…

Effective C++勉強メモ: Item 10 Assignmentの戻り値

operator=は*thisを返すようにしよう、という話。 x = y = z = 15という構文が可能なのは、右から評価されていくoperator=が左辺のオブジェクトを返しているから。 ただの慣習だが、よっぽどの理由がない限り従うべき慣習である。 個人的にも異論はない。

Effective C++勉強メモ: Item 9 virtual関数をコンストラクタ・デストラクタから呼ぶな

C++のコンストラクタは、まず最下層のベースクラスのものが呼び出されて、順次初期化されていって最終的に実際に作成されるオブジェクトのコンストラクタの処理が走る、という流れになる。 class A { public: A(); virtual void init(); }; A::A() { init();…

Effective C++勉強メモ: Item 8 例外を投げるデストラクタ

例外を投げるデストラクタはUndefined Behaviorになると考えるべき。 デストラクタから例外を投げる可能性のあるオブジェクトを要素に持つvectorが破棄されるときに、同時に複数のExceptionが発生してしまう状況があり得る、というのが非常に納得のいく例。 …

Effective C++勉強メモ: Item 7 Polymorphic Base Classのdestructorはvirtual

なんのこっちゃ。というのはさすがに嘘だが結構頭の中でパースするのが大変な文ではある。 1. Base Classというのは継承を前提としたクラス。 2. Polymorphic Base Classとは、継承した子クラスをベースクラスのインタフェースを通して使用することを前提と…

Effective C++勉強メモ: Item 6 コンパイラのお節介にノーという方法

前回の項目から続いて、コンパイラが勝手に書いてくれるメンバ関数がお節介だったら?という話。 特にcopy assignmentなどはいらない、うっかりどこかでcopy assignするような処理を書いてしまったらちゃんと静的にエラーが検出されてほしい、というような時…

Effective C++勉強メモ: Item 4 オブジェクトはちゃんと初期化しよう

第4項目抜けてた・・・ C++だとオブジェクトが自動的に初期化されないことも多いよ、明示的に初期化しよう、というお話。 初期化されていない変数の値を読もうとするのは未定義な動作を踏むことになる。プラットフォームによってはランタイムエラーなのか?…

Effective C++勉強メモ: Item 5 コンパイラが作成してくれるメンバ関数

ここから第2章。Constructor/Destructor/Assignment関係の話題。 class Empty {}; クラス定義がこれだけでも、Empty型のオブジェクトが初期化されたりコピーされたり代入されたりする記述があれば Constructor Destructor Copy Constructor Copy Assignment…

Effective C++勉強メモ: Item 3 constだ。constを使うんだ

constできるところは全部constで。というお話。 それなら変数全部デフォルトでconstだったらよかったのでは?と一瞬思ったがrust面に落ちかけているな。(どちらかというとC++がダークサイドか) この章の話題は主に二つ。 ポインタやイテレータのconst化に…

Effective C++勉強メモ: Item 2 #defineは(あまり)使わないようにしよう

Effective C++の第2項目 Cの遺産である#defineを使いたくなるようなケースのほとんどでは、const、enum、inlineといったC++機能で代用できるし代用するべきだ、という主張。あるいは「プリプロセッサよりコンパイラに仕事をさせよう」。 そもそも私はCをあま…

Effective C++勉強メモ: Item 1 C++を複数の言語の集まりとして認識しよう

最近本当に「俺はC++を雰囲気で使っている」と実感しているので、Scot MeyersあたりからはじめてHerb SutterやAndrei Alexandrescuの著作などをいろいろ読んでいきたい。ということで備忘録的にメモ。 まず手始めにEffective C++。数章に分かれて、全部で5…