18.デフォルト引数

デフォルト引数

引数のデフォルト値を与えるには、関数のプロトタイプ、または定義のいずれか

必ず指定する時は、第一引数からの指定になります

デフォルトの値を持たない引数と、デフォルトの値を持つ引数を混同させることもできます

ただしこの場合デフォルト引数はもっとも右側に定義する必要があります

main() 関数の Kitty("Rena") は、オーバーロードされている Kitty() 関数のうち

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 型のいずれかを受け取ります

15.thisポインタ

thisポインタ

すなわち this->str とは obj[i].str に等しいということです

メンバ関数内からしかアクセスできない、オブジェクトを表すポインタです

thisは、例えば自分自身のオブジェクトをメンバ関数から他の関数へ渡す時に使います

14.インライン関数

C言語のマクロ関数は、短い関数で関数のオーバーヘッドを避ける手段の一つでした

もちろん、Cに慣れ親しんでいるならマクロでもかまわない

インライン関数は、実際に呼び出すことはなく呼び出しごとにインラインで展開する関数です
マクロとは異なり関数と同様の扱いで仮引数などを指定することが可能です

これによって、関数の呼び出しや仮引数のオーバヘッドタイムを減少させることができます

ただし、inlineを指定すれば必ずインライン関数になるわけではなく

必ずコンパイラの制限に従う必要があります

インライン展開できなかった場合は、通常の関数として扱われます

func() は、呼び出されるごとにインラインで展開されます

必ずしもインライン関数になるわけではありません

13.関数と参照

この方法はオブジェクトに限ったものではなく、通常のデータ型の受け渡しにも使えます
ポインタを用いるか参照を用いるかは、プログラマの好みですが

ただし、セキュリティにおいては参照から自由にアクセスできるようになることに注意してください

参照は変数のアドレスを返すものなので、当然ローカル変数は戻り値として渡せません