Q027#
回答:
クリックして回答を表示
BQ029#
回答:
クリックして回答を表示
121説明:
A::foo() は仮想関数であるが、構築および破棄の過程では仮想とは見なされない。
B を構築する前に A を構築する必要があり、A の構築中にはまだ B が構築されていないため、使用してはいけない。A::A() の中の foo() の呼び出しは自然に A::foo() を呼び出す。
オブジェクト b が破棄されるときも同じ問題が発生し、B のデストラクタが呼び出された後に A のデストラクタが呼び出されるため、オブジェクト b の破棄後に B::foo() を使用することはできない。
Q114#
回答:
クリックして回答を表示
AAABBAAB説明:
C *const p1 では、p1 ポインターが const 修飾されているため、s オブジェクトのメンバ変数 p1 を呼び出すときには const バージョンの foo が呼び出される。C const *p2 では、*p(C クラス)オブジェクトが const 修飾されているため、s オブジェクトのメンバ変数 p2 を呼び出すときには const バージョンの foo が呼び出される。
r は s オブジェクトの定数参照であり、const はメンバ v の動作を変更する。std::vector は operator[] をオーバーロードしており、定数オブジェクトの場合は定数参照のバージョンを返すため、foo の呼び出しは const バージョンで行われる。
Q360#
回答:
クリックして回答を表示
0110001説明:
const int * は定数整数へのポインターであり、ポインター自体は定数ではないため、結果は false です。
int *const はポインター定数ですので、ポインター自体は定数ですので、結果は true です。
const int[1] は定数整数の配列ですので、配列の要素は定数ですので、結果は true です。
const int ** は 定数ポインターへのポインター です((const int *) *ptr)。ポインター自体は定数ではないため、結果は false です。
int *const * は ポインター定数へのポインター です((int *const) *ptr)。ポインター自体は定数ではないため、結果は false です。
const int (*)[1] は定数配列へのポインターですが、ポインター自体は定数ではないため、結果は false です。
const int *[1] は 定数ポインターの配列 です(const int *ptr[1])。配列の要素は定数ポインターですので、結果は false です。
const int[1][1] は 2 次元配列で、要素は定数ですので、結果は true です。