17.コピーコンストラクタ
オブジェクトはビット単位でそっくりそのままコピーされます
このポインタのアドレスも同じものを指すので、データの整合性が保てなくなります
このとき呼び出されるのがコピーコンストラクタです
これは、初期化ではなく代入なのでコピーコンストラクタは作用されません
関数から呼び出しもとにオブジェクトを値渡しする時にも呼び出されます
メンバ変数 x は動的に割り当てた領域へのポインタとなっている
http://www.hjenglish.com/q/p219960/
16.関数のオーバーロード
ポリモフィズム
オブジェクト指向言語では、手続きが他言語には内重要な概念の一つに「ポリモフィズム」があります
この技術を使えば、ある識別子が指す参照先が複数の動作を状況に合わせて実行します.
それぞれ、まったく異なる関数として実装することができるため
https://dict.hjenglish.com/jp/jc/%E6%9F%94%E8%BB%9F
同じような動作をする関数で、引数の型や数を柔軟に設定することができます
関数名が同じでも、シグネチャが異なる場合はオーバーロードできるという仕組みになっています
こうすれば、C言語のように似たような動作をする関数が引数の違いのために
別の名前で定義されるという面倒な事態を避けることができます
ただし、関数のオーバーロードは引数の型、または受け取る数が異なるというのが条件です
オーバーロードは、数学関数など多くの型に対応したい関数に有効です
コンストラクタのオーバーロード
これは、実用的なクラスには欠かせないもので
また、無意味にオーバーロードせず、必要な限りのオーバーロードにするのがポイントです
曖昧なオーバーロード
オーバーロード関数を作成していれば、誰でも気づくことでしょうが
関数 Kitty() は double 型と float 型のいずれかを受け取ります
14.インライン関数
C言語のマクロ関数は、短い関数で関数のオーバーヘッドを避ける手段の一つでした
もちろん、Cに慣れ親しんでいるのならマクロでもかまわないが
インライン関数は、実際に呼び出すことはなく呼び出しごとにインラインで展開する関数です
マクロとは異なり関数と同様の扱いで仮引数などを指定することが可能です
これによって、関数の呼び出しや仮引数のオーバヘッドタイムを減少させることができます
ただし、inlineを指定すれば必ずインライン関数になるわけではなく
必ずコンパイラの制限に従う必要があります
インライン展開できなかった場合は、通常の関数として扱われます
func() は、呼び出されるごとにインラインで展開されます
必ずしもインライン関数になるわけではありません