Effective C++
Effective C++ 原著第3版が出るみたいですね。これはもう買うしか。 ページ数がやたら増えているのは気のせいですか。勉強しなおしですか。過去にEffective C++を読んだ日記を書いていたので雰囲気を知りたい方はどうぞ。 Effective C++ 原著第3版posted wit…
リファレンスを返すことはあまりないなぁ。
確かになぁ。生ポインタ返したらアクセスし放題だよ。 たまに意図的にこういうことをやってしまうよなぁ。
言いたいことは分かる。 でもちょっとだけうんざりするのはなぜだろう。
名前空間を積極的に使いましょうという話。 というかこんな機能を知らなかった編↓ void f() { using higepon::monaos; // このスコープでは monaos だけ装飾なしで使用できる }
Arrayというクラステンプレートを書いたときに、配列代入をさせたくない。 しかしC++をだまって、代入演算子を勝手に作ってしまうという問題。 privateでもだいたい防げるが、宣言だけして、定義せず、リンクエラーにするというのが良いとのこと。 そういえ…
コンパイラが「どちらとも解釈できる」というようなあいまいなコードを書かないようにしようという話。あいまいな例としては 引数の型のあいまいさ 多重継承の場合の同名メンバ関数 などが、挙げられています。
オーバーロードの話 void f(int x); void f(string* message); f(0); この場合どちらのf()が呼ばれるでしょうか?的な話。 (intのほうが呼ばれます。なぜなら0はintだから) では f(NULL) はどうでしょうか? これはNULLの型によって呼び出されるものが違う…
シチュエーションに応じて、デフォルト付きパラーメータは効率が悪い場合があるとか。 そんな話。
値渡し(コピー渡し)とリファレンス渡しについて学ぶと、何でもかんでもリファレンス渡しにしようとしてしまうという罠について。 納得。
C++(C)はデフォルトで値渡しだが、コピーのオーバーヘッドが大きいオブジェクトもあるので、できるだけリファレンス渡しをしましょう。 という話。
const の整理。 データがconst なのかポインタが const なのか。 Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming seriesにも書いてあるとおり、 *(アスタリスクの)の前にあるconst はデータがconst と覚…
データメンバーをpublicインターフェースに入れるのはトラブルを招くのでやめましょうという話。 これは基本ですね。 入門書によく書いてありますし、これは習慣化されているので問題なし。 Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリーズ…
割と長めの項だが読みがいがある。 有理数を表すRationalクラスを例に、いろいろ書いてある。 そういえば friend関数使ったことないや。
完全なインターフェース 完全なインターフェースとはクライアントが普通やりたいと思うようなことは、何でもできるようなインターフェースである。つまり、まともなクライアントが行いたいと考えるような仕事であれば、どれをとっても、それを達成するための…
自分自身への代入だったら即return すれば良いということで。(いい加減)
継承関係も含めて、データメンバーの代入時に気をつけましょう。 これまた operator = を一度も実装したことがないので実感わかず。 この流れでいくと自動変数で使われることを想定した String を実装してみるというのが一番勉強になると頂いたアドバイスが…
operator = を書いたことがないので実感はないが理解はできた。 代入チェーンと、呼び出し側暗黙型変換のために、*this へのリファレンスを返しましょう。Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming…
今日はとても大事な話なので、結論から 基底クラスとして使うであろうクラスは、デストラクタを必ず virtual とする 基底クラスとして使わない(継承するつもりがない)クラスは、デストラクタをvirtual にしない。 なぜか? 1.について Class BaseHige { pu…
僕の記憶が正しければ、初期化リストは宣言順にしないと、エラーかワーニングでるようなきがするのでこれはオーケーかな。 今日は短いので一応このEffective C++勉強の意図を説明しておくと。 はてな技術勉強会で担当が日替わりで発表を行い、毎日少しずつ新…
これよりも Hoge::Hoge(const string& initName) { this->name = initName; }これを使いましょうという話。 Hoge::Hoge(const string& initName) : name(initName) { } 理由は、初期化リストではstringのコピーコンストラクタのみが実行されるのに対して、コ…
コピーコンストラクタってほとんど書いてないので、かなり耳が痛い。 ここでまずい事例として出ているのは class String { String(); ~String(); private: char* data; }; String a("Hello"); String b("Good bye"); a= b;デフォルトの代入演算子だとメンバ…
これはnew/deleteの実装をしたことがある人ならすぐ分かると思う。 newで割り当てられたメモリは、サイズとポインタという情報を持っていなければならず、deleteではその情報を元にメモリを解放する。 newから返るのは、ポインタだけなので、サイズ情報が別…
"operator new"という名前の関数をクラスの内側で宣言すると、「普通の」形式のnewを掩蔽してしまうという話。 一度もやったことがないので実感なし。 掩蔽は「えんぺい」と読むことを学んだ。 Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリ…
operator new を自分で作成するならば、いろいろ約束を守ろうという話。 自分もMonaでなんとなく new をユーザーランド向けに実装しているが以下のルールを一部守っていない気がする。newのお約束 0byteの要求に対しても正規のポインタを返さなければならな…