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
です。