当我想在C ++中实例化一个类时,我通常会这样做
Book bk = new Book();
我的教授最近这样做了
Book &bk = *new Book();
他只告诉我他会使用引用来使用点(例如bk.getTitle();)运算符而不是箭头(例如bk-> getTitle();)。我理解这部分代码但是当你将*运算符与new?
结合使用时会发生什么提前致谢
可以找到完整的示例代码here它是main函数中的arraystack
答案 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;
的其他事情只是坏事,坏事,坏事。