括弧内は部分点。+ がついてるのはボーナス点。 適当に部分点を与えても良し。 1. const char c1 = '0'; // c2 = '1'; 直後の型を代入禁止にする。 (2) const char* c2 = 0; // *c2 = '1'; 直後の型の(ポインタ|参照)の指す先を代入禁止にする。 (2) char* const c3 = 0; // c3 = &c1; 直後の型の(ポインタ|参照)を代入禁止にする。 (2) class C { int func() const; } クラス C のメンバを代入禁止にする。 (3) ただし、mutable 宣言されているメンバはその限りでない。 (1) 2. int (C::*mp) () const = &C::func; (c.*mp)(); (5+5) 3. ヘッダでなく、ソースにテンプレート(関数|メソッド)を 定義する場合に、その定義本体の頭に付け、 リンクする時の実体を一度だけ作ることをコンパイラに要求する。 (7) ちなみに位置は export template func(C); などのように他の全ての関数修飾より先にくる。 (+1) 大抵のコンパイラでサポートされていない。 (3) 4. protected: とラベルを付けることによって以降のメンバを全て protected 属性にする。 (5) protected属性なメンバとは、 そのクラスとそのクラスを継承したクラスと friendクラスから アクセス可能なメンバのことである。 (+1) 継承時に protected キーワードを継承元クラスの頭に付けることで、 その継承が protected 継承であることを示す。 (5) protected 継承とは、基底クラスの public メンバを protected 属性にする継承である。 (+3) 5. virtual キーワードを関数の頭に付けることによって、 その関数を仮想関数にすることができる。 (5) 仮想関数とは基底クラスの(ポインタ|参照)に 派生クラスオブジェクトが参照されていて、 その(ポインタ|参照)ごしに基底・派生クラスで仮想関数とされている 関数を呼んだ場合に、派生クラス側の関数を呼ぶ機構である。 (+1) 継承時に継承属性(public, protected, private)の前後に virtual キーワードを付けることで、その継承が仮想継承であることを示す。 (5) struct A { virtual void f(); }; struct B : public A {}; struct C : public A {}; struct D : public B, public C {}; int main() { D d; d.f(); } はエラーになるが、これは class D から見ると、 class B, class C のどちらの f を用いるべきかが曖昧であるからである。 この場合 public A の部分を virtual public A に変更すると A::f が呼ばれる正常なコードとなる。 このような継承を virtual 継承と呼ぶ。 (+3) 6. template を template に置きかえることができる。 この二つの文は完全に等価である。 (5) ただし、 template