(如果有的话)有什么区别:
Player player=*(new Player());
和
Player &player=*(new Player());
两者(似乎)都表现得一样,但我肯定会错过一些东西?!?
答案 0 :(得分:4)
不同之处在于第一个创建副本,而第二个创建对new Player()
返回的指针所指向的对象的引用。
Player player=*(new Player());
使用copy-constructor复制初始化player
。
Player &player=*(new Player());
只为*(new Player())
创建一个别名,该别名有效,因为new Player()
不是临时的。因此,Player& player = Player()
将是非法的。
他们是相同的他们都吮吸。
答案 1 :(得分:2)
new Player()
是一个表达式,它在所谓的堆上创建一个对象(未命名)。表达式的结果是指向新创建的对象的指针。现在当你做
Player player = *(new Player())
定义名为player的变量,该变量是新创建的对象的副本。此外,您丢失了堆对象的所有句柄(访问权限),并且永远无法释放它占用的内存。
另一方面,
Player &player=*(new Player());
为新创建的对象创建引用命名播放器。因此,您可以访问该对象。特别是,您可以通过
释放内存并销毁该对象delete &player;