C++11の機能 (関数のdefault・delete宣言, overrideとfinal指定子, 移譲コンストラクタ, 継承コンストラクタ)
C++11の機能を紹介するシリーズ第四弾です。 今回は関数のdefault・delete宣言、overrideとfinal指定子、移譲コンストラクタと継承コンストラクタを紹介していきます。 関数のdefault・delete宣言 コンストラクタや代入演算子などにはユーザーが指定しなくても、必要に応じてコンパイラがそれらを自動的に作ってくれます。 ですが、「デフォルトで作ってほしくないんだよ」とか「コピーはしてほしくない」とか「この関数は呼べないようにしたい」という需要に答えるとなると、privateな部分に宣言だけ書いておくなど、あんまり綺麗でないやり方をするしかありませんでした。 そういうときに使うことができるのがdelete宣言です。delete宣言された関数は暗黙的に実体化されること無く、delete宣言された関数を必要とするコードが存在した場合コンパイルエラーになります。 対して、default宣言は、コンパイラが自動的に生成してくれるコードを明示的に生成させる宣言です。コピーやムーブで特殊な処理を行わない場合などはいちいち書くのは面倒で間違いの元になります。こういったときに使えます。また、virtualやinlineなどの指定子をつけた上でdefault宣言することもできるので、「仮想関数にするけど処理自体はコンパイラのデフォルトの動作で構わない」みたいな場合にも使えます。 struct Klass { Klass() = default; // デフォルトのコンストラクタはコンパイラのデフォルトで生成 Klass(const Klass&) = delete; // コピーコンストラクタは削除 Klass(Klass&&) = default; virtual ~Klass() = default; // 仮想関数としてデストラクタをデフォルト生成 }; overrideとfinal指定子 overrideはあのオーバーライドです。この指定子をつけることでこの関数はオーバーライドしているということを明示することができます。override指定子を付けているにもかからわずオーバーライドできていない場合はコンパイルエラーになります。なので、間違ってオーバー