num1の生成にheavy_int_classのコピーコンストラクタが走る。
num1がコピーされたインスタンス。

num2の生成にコピーは発生しない。
num2とp->numは同じインスタンス。同じ型。

num3の生成にコピーは発生しない。
num3とcp->numは同じインスタンス。
前者はconst修飾されていて変更不可、
cpはpointeeがconst修飾されているのでcpから得られるメンバは総じて変更不可。

num4はnum1と同じくコピー。
通常、コピーコンストラクタはconst referenceの仮引数であるので挙動に変化なし。

num5はnum3の理由によりコンパイルエラー。
参照は定義時に使われたインスタンスを指すオブジェクト。

num6はcp->numと同じインスタンス。但し変更されない事を宣言時に明示している。
よって型検査の上では正常。


いずれにせよ、参照は単にポインタの糖衣構文に過ぎずプログラマーが参照は図示を明記しなくても良いというだけ。
cons参照が特殊なのは壊れてないスタックにあるインスタンスをコピーコストなしで見られる点。