实例化时C ++指针和带有new关键字的引用

时间:2012-02-15 00:42:56

标签: c++ class pointers reference

当我想在C ++中实例化一个类时,我通常会这样做

Book bk = new Book();

我的教授最近这样做了

Book &bk = *new Book();

他只告诉我他会使用引用来使用点(例如bk.getTitle();)运算符而不是箭头(例如bk-> getTitle();)。我理解这部分代码但是当你将*运算符与new?

结合使用时会发生什么

提前致谢

可以找到完整的示例代码here它是main函数中的arraystack

2 个答案:

答案 0 :(得分:20)

此:

Book &bk = *new Book();

几乎相当于:

Book *p = new Book();  // Pointer to new book
Book &bk = *p;  // Reference to that book

但是有一个至关重要的区别;在原始代码中,你没有一个指针可以用来delete动态分配的对象,所以你已经有效地创建了内存泄漏。

当然,你可以这样做:

delete &bk;

但那是非常非惯用的C ++,很可能会在以后引起问题。

总之,编写这样的代码绝对没有理由,所以不要这样做。以下任何一种情况都可以:

Book bk;
Book bk = Book();

答案 1 :(得分:0)

我发现了一种让我想到这种语法的情况。考虑一个指向Base类的智能指针,它必须保存一个指向派生类的指针,并且您希望在构造之后访问派生类的一些非虚拟内容。在这种情况下,这样的事情是合法的,也可能不是那么糟糕:

Derived & d = * new Derived();

d.d_method( ..whatever.. );
d.d_member = ..whatever..;
...

std::unique_ptr<Base> p( &d );

最后我仍然喜欢小箭头到奇怪的&符号:

Derived d = new Derived();

d->d_method( ..whatever.. );
d->d_member = ..whatever..;
...

std::unique_ptr<Base> p( d );

但我认为在这种情况下只是一个品味问题,特别是如果你访问一致的方法。

导致泄密或delete &d;的其他事情只是坏事,坏事,坏事。