番茄星人

原理上楼上已经说了。

至于为什么vs在p2 = g(); 会调用拷贝

我只能猜

类之间直接赋值会调用拷贝复制函数(PS:不是拷贝构造),也就是 = 的重载函数,前提是你重载了这个函数

明显你是没有重载的,所以至于这个重载的形态是什么,那应该由编译器来默认决定了。

所以有可能是在cb编译器上,它会帮你生成一个默认的拷贝复制函数

然而VS的编译器采用的策略则是,用你写的拷贝构造来当拷贝复制

以上纯属猜测,编译器那些东西要看手册才知道