Effective C++

Effective C++ 原著第3版

Effective C++ 原著第3版が出るみたいですね。これはもう買うしか。 ページ数がやたら増えているのは気のせいですか。勉強しなおしですか。過去にEffective C++を読んだ日記を書いていたので雰囲気を知りたい方はどうぞ。 Effective C++ 原著第3版posted wit…

関数は、ローカルオブジェクトへのリファレンスや関数の中でnewで初期化したポインタの参照先を返してはならない

リファレンスを返すことはあまりないなぁ。

メンバ関数は、自分よりもアクセス制限がきついメンバへの非constポインタや参照を返さないようにしよう 30項

確かになぁ。生ポインタ返したらアクセスし放題だよ。 たまに意図的にこういうことをやってしまうよなぁ。

内部データの「ハンドル」を返すのはやめよう 29項

言いたいことは分かる。 でもちょっとだけうんざりするのはなぜだろう。

グローバルな名前空間は分割しよう

名前空間を積極的に使いましょうという話。 というかこんな機能を知らなかった編↓ void f() { using higepon::monaos; // このスコープでは monaos だけ装飾なしで使用できる }

暗黙のうちに生成される不要なメンバ関数は、明示的に使用を禁止しよう

Arrayというクラステンプレートを書いたときに、配列代入をさせたくない。 しかしC++をだまって、代入演算子を勝手に作ってしまうという問題。 privateでもだいたい防げるが、宣言だけして、定義せず、リンクエラーにするというのが良いとのこと。 そういえ…

潜在的な多義性に対するガードを固めよう 26項

コンパイラが「どちらとも解釈できる」というようなあいまいなコードを書かないようにしようという話。あいまいな例としては 引数の型のあいまいさ 多重継承の場合の同名メンバ関数 などが、挙げられています。

ポインタと数値型とにオーバーロードするのは避けよう 25項

オーバーロードの話 void f(int x); void f(string* message); f(0); この場合どちらのf()が呼ばれるでしょうか?的な話。 (intのほうが呼ばれます。なぜなら0はintだから) では f(NULL) はどうでしょうか? これはNULLの型によって呼び出されるものが違う…

関数のオーバーロードとデフォルト付きパラメータは、慎重に使い分けよう 24項

シチュエーションに応じて、デフォルト付きパラーメータは効率が悪い場合があるとか。 そんな話。

オブジェクトを返さなければいけないときに、リファレンスを返そうとがんばるのはやめよう 23項

値渡し(コピー渡し)とリファレンス渡しについて学ぶと、何でもかんでもリファレンス渡しにしようとしてしまうという罠について。 納得。

値渡しよりも、リファレンス渡しを使おう

C++(C)はデフォルトで値渡しだが、コピーのオーバーヘッドが大きいオブジェクトもあるので、できるだけリファレンス渡しをしましょう。 という話。

使えるときは、必ずconstを使おう 21項

const の整理。 データがconst なのかポインタが const なのか。 Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming seriesにも書いてあるとおり、 *(アスタリスクの)の前にあるconst はデータがconst と覚…

データメンバーをpublicインターフェースに入れるのはやめよう 20項

データメンバーをpublicインターフェースに入れるのはトラブルを招くのでやめましょうという話。 これは基本ですね。 入門書によく書いてありますし、これは習慣化されているので問題なし。 Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリーズ…

メンバ関数、非メンバー関数、friend関数を使い分けよう 19項

割と長めの項だが読みがいがある。 有理数を表すRationalクラスを例に、いろいろ書いてある。 そういえば friend関数使ったことないや。

クラスインターフェースが完全かつ最小限になるまでがんばろう 18項

完全なインターフェース 完全なインターフェースとはクライアントが普通やりたいと思うようなことは、何でもできるようなインターフェースである。つまり、まともなクライアントが行いたいと考えるような仕事であれば、どれをとっても、それを達成するための…

operator=では、自分自身への代入するケースをチェックしよう

自分自身への代入だったら即return すれば良いということで。(いい加減)

operator=では、すべてのデータメンバに代入しよう 16項

継承関係も含めて、データメンバーの代入時に気をつけましょう。 これまた operator = を一度も実装したことがないので実感わかず。 この流れでいくと自動変数で使われることを想定した String を実装してみるというのが一番勉強になると頂いたアドバイスが…

operator = を書くときは、*thisへのリファレンスを返そう 15項

operator = を書いたことがないので実感はないが理解はできた。 代入チェーンと、呼び出し側暗黙型変換のために、*this へのリファレンスを返しましょう。Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming…

基底クラスには仮想デストラクタをもたせよう 14項

今日はとても大事な話なので、結論から 基底クラスとして使うであろうクラスは、デストラクタを必ず virtual とする 基底クラスとして使わない(継承するつもりがない)クラスは、デストラクタをvirtual にしない。 なぜか? 1.について Class BaseHige { pu…

初期化リストのメンバは、宣言した順に並べよう 13項

僕の記憶が正しければ、初期化リストは宣言順にしないと、エラーかワーニングでるようなきがするのでこれはオーケーかな。 今日は短いので一応このEffective C++勉強の意図を説明しておくと。 はてな技術勉強会で担当が日替わりで発表を行い、毎日少しずつ新…

コンストラクタでは、代入よりも初期化を使おう 12項

これよりも Hoge::Hoge(const string& initName) { this->name = initName; }これを使いましょうという話。 Hoge::Hoge(const string& initName) : name(initName) { } 理由は、初期化リストではstringのコピーコンストラクタのみが実行されるのに対して、コ…

メモリを動的に割り当てるクラスではコピーコンストラクタと代入演算子を宣言しよう 11項

コピーコンストラクタってほとんど書いてないので、かなり耳が痛い。 ここでまずい事例として出ているのは class String { String(); ~String(); private: char* data; }; String a("Hello"); String b("Good bye"); a= b;デフォルトの代入演算子だとメンバ…

operator newを書くなら、operator delete も書こう 10項

これはnew/deleteの実装をしたことがある人ならすぐ分かると思う。 newで割り当てられたメモリは、サイズとポインタという情報を持っていなければならず、deleteではその情報を元にメモリを解放する。 newから返るのは、ポインタだけなので、サイズ情報が別…

「普通の」形式のnewを掩蔽しないように注意しよう 9項

"operator new"という名前の関数をクラスの内側で宣言すると、「普通の」形式のnewを掩蔽してしまうという話。 一度もやったことがないので実感なし。 掩蔽は「えんぺい」と読むことを学んだ。 Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリ…

operator newとoperator deleteを書くときは規約を守ろう 8項

operator new を自分で作成するならば、いろいろ約束を守ろうという話。 自分もMonaでなんとなく new をユーザーランド向けに実装しているが以下のルールを一部守っていない気がする。newのお約束 0byteの要求に対しても正規のポインタを返さなければならな…