江添亮のC++入門
物理本も買ったけど、PDFを画面に映しながらやったほうが読みやすそうなのでPDF版を読む
第1章 C++の概要
C++の歴史、思想
第2章 C++の実行
CPPのコードのコンパイル方法
コンパイル済ヘッダ
Makefileの使い方、書き方
第3章 C++ヒッチハイクガイド
文法をざっと見てみる回
手続き的な文法とラムダ式・関数定義が取り扱われている
ラムダ式のautoすごい。どういう型推論になってるんだ。generics的な仕組みがあるんだろうか。
第4章 デバッグ:コンパイルエラーメッセージの読み方
かなり丁寧にエラーメッセージの読み方が解説されている
第5章 条件分岐の果てのレストラン
複合文とスコープを説明してからifを解説するのは筋が良いと思う
C++におけるbooleanの取扱が詳しめに説明されている
第 6 章 デバッグ:コンパイル警告メッセージ
コンパイラの警告メッセージについての話
Rubyでもwarningを出すと結構有用な情報が得られるので出していきたいが、gemのwarningも出ちゃうのが難点
第 7 章 最近体重が気になるあなたのための標準入力
この辺の文法機能を詳しく知りたいわけじゃないので飛ばし気味に行く
〜 8まで読んだ
goto からwhile、forが導出されているのはキレイな気がする
再帰の考え方が丁寧に解説されていてすごかった
〜13まで読んだ
一番知りたいのは第41章っぽいので、そこまで飛んで先に読んでしまう
第14章 イテレータ
begin と end でイテレータを表現するのは面白い気がする
始まりを閉区間、終わりを開区間で表現するといろいろ便利という話があって面白かった
まず、どちらかを閉区間、もう片方を開区間、のようにしておくと、 終わり - 始まり がそのイテレータに含まれる要素の個数となり、便利である
始まりを開区間、終わりを閉区間とすると、始まり→終わりの方向に繰り返し処理を回すときに不便である。なぜなら、繰り返し処理に突入する前に「添字」をインクリメントする必要があるからだ。
始まりを閉区間、終わりを開区間とすると、始まり→終わりの方向に繰り返し処理を回すときに便利である。なぜなら、繰り返し処理に突入するときに「添字」のインクリメントが不要であり、繰り返し処理から抜けるときは 添字 < 終わり とか 添字 != 終わりなどの条件で抜けられるからだ。
第15章 lvalueリファレンス と const
Rustの「参照」に似て蝶
違うのは、C++はデフォルトでmutable referenceになるが、Rustはデフォルトでimmutable referenceになるというところ。あとたぶん、C++だと複数のmutable referenceが作れるけど、Rustでは無理。
引数をリファレンスで受ける時、渡す側は普通に値を渡していても、受ける側がリファレンスで受ければ、リファレンスで受けられるっぽい(それはそう)
リファレンス、基本的には非リファレンスの変数と同じように使える(例えば、非リファレンスの変数と比較できる)のがチョットつらい気がする
そういえばリファレンスのリファレンスって作れるんだろうか
→リファレンスのリファレンスはリファレンスになるっぽい。つまり、xのリファレンスのリファレンスは、xのリファレンスとして振る舞うように見える。
第16章 アルゴリズム
引数なしのラムダ式は () を省略できる
[]{ ... }
[=](){ } : ラムダ式を宣言するときに、外側の変数をコピーしてキャプチャする
[&](){ } :ラムダ式を宣言するときに、外側の変数のリファレンスを作ってキャプチャする
あとはなんか、iteratorに付随する諸々の便利関数が出てきた。iteratorの表現がbeginとendの2つ組というのはダルいな。1つの値で表現できてほしい。とはいえ、beginとendを明示的に渡すことによる柔軟性もある気がするので、トレードオフなのかもしれない。
第17章 ラムダ式
ふつうのいわゆるラムダ式
第18章 クラスの基本
struct
メンバ変数とメンバ関数
第19章 より自然に振る舞うクラス
cppのコンストラクタは、代入文で起動する
code:cpp
struct fractional
{
int num ;
int denom ;
// コンストラクター
fractional( int num )
: num(num), denom(1)
{ }
} ;
int main()
{
fractional a = 1 ;
fractional b = 2 ;
}
この書き方ができるのは、引数が1つのコンストラクタだけ
演算子オーバーロード
演算子をオーバーロードするときの関数名は operator operator_name となる
fractional operator -( fractional & l, fractional & r ) { /* ここに引き算の計算処理を書く */ } ;
二項演算子
戻り値の型に制約がない
voidを返してもいい
operator +(x, y) // x + y と同じ
引数が組み込み型のみからなるオーバーロードは実装できない。少なくとも1つの引数がユーザー定義型である必要がある。
TypeName const & variable_name リファレンスで受けるがimmutableな変数
rustの普通の参照と同じっぽい
ただし、デリファレンスしなくても使える
演算子オーバーロードはメンバー関数としても実装できる
Rubyと同じ
第20章 std::array
コンパイル時に長さが決まる「配列」
vectorもarrayも[]範囲外アクセスが発生したときの挙動が未定義
.at(i)は例外が発生する
第22 配列
組み込み配列を使ってMyArrayを実装する
長さがプログラムに決め打ちされている実装
組み込み配列自体はコピーできないのに、クラスのメンバにするとコピーされるようになるのは非常に謎
第23章 テンプレート
ジェネリクス的な何か
型名と値を取れる
値はコンパイル時に決定できるものでなければならない
1 + 1 はコンパイル時に決定できるらしい
関数にも使えるし、クラスにも使える
第24章 arrayをさらに実装
const refを返すメソッドとrefを返すメソッドをオーバーロードするのすごい
第25章 arrayのイテレーター
第41章 分割コンパイル
これを読んでも知りたいこと(アーカイブファイルとは何者か)がわからなかった
アーカイブファイルとは何者か
tl;dr:
オブジェクトファイルを固めたファイル(tar アーカイブ的概念)
ライブラリを提供するときに、オブジェクトファイルを直接提供するのではなく、アーカイブファイルの形式で提供するらしい