C++中的"new"关键字有什么问题?

5
我知道这可能听起来像一个愚蠢的问题,但当我尝试使用语句实例化一个新对象时,为什么会出现类似于“

无法将Object*转换为Object

”的错误?

Object obj = new Object();

“?”
“我应该理解‘new’关键字是为指针保留的吗?还是其他什么?”

10
“new”本身没有问题,问题在于你对它的理解。 - user395760
8
没什么问题,C++只是有不同的语义,你需要忘记你认为自己知道的东西。了解C++需要了解对象存储在哪里(堆还是栈)。然后你就会明白为什么new必须返回一个指针了。 - Benoit
4
C++既不是Java也不是C#,它们之间有区别,你已经识别出其中一个区别。 - andand
1
为什么标题说是C++,你的问题也涉及到C++,但你标记它为C? - GManNickG
5
无论如何,如果你想学习C++,你需要获得一本书籍 - GManNickG
显示剩余3条评论
6个回答

39
Object* obj = new Object();

new总是返回指向对象的指针。

如果你只写Object obj,那么它意味着obj将持有对象本身。如果它在函数内以这种方式声明,则内存将在堆栈上分配,并且一旦离开该函数,就会被清除。 new在堆上分配内存,因此指针可以从函数返回。请注意,指针也可以指向本地(堆栈)变量。


1
@Andrey:不是我,但如果是我的话,我想这可能与Object* ob...Object *ob...的表示法有关。我承认我正在考虑这个问题...;) - FrustratedWithFormsDesigner
5
@FrustratedWithFormsDesigner 这只是个人口味问题,如果我不喜欢符号表示法,我不会给它点踩。个人而言,我更喜欢 Object* ob 这种形式,因为它看起来像一个类型。是的,我知道 Object* ob1, ob2 应该写成 Object *ob1, *ob2 - Andrey
@goreSplatter 我不在乎负评,只想知道哪里出了问题。 - Andrey
4
“@FrustratedWithFormsDesigner: that's pretty idiomatic for C++ (as an old C fart the T* p convention annoys me, but the more C++ I do the more I understand why it became the convention). For me, that wouldn't be sufficient reason for a downvote.” 这段话中的“pretty idiomatic for C++” 意思是在C++中语言习惯用法,而“T* p”这个表示方法可能让一些老派C程序员感到不适,但做更多的C++后可以理解为什么它成为了一种约定。对我来说,这并不足以成为downvote的理由。 - John Bode
1
也许是由于堆栈和堆的使用。C++标准只保证存储期,编译器可以将东西存储在任何地方,只要语义不改变即可。 - James Greenhalgh
显示剩余4条评论

8

由于new返回一个指针,你应该使用

Object *obj = new Object();

1
我个人更喜欢使用 Object * obj。 - ThomasMcLeod
5
@Thomas: Object* obj怎么样?;-) (注:该句是一段对话,上下文缺失。意思大概是在讨论编程语言中的变量类型声明) - fredoverflow
@Fred:哈,太容易忽略运算符了... - ThomasMcLeod

6

没错。使用New会在堆上创建一个对象,并返回指向它的指针


6

新的操作符可以创建一个指向对象的指针。

因此,Object *obj = new Object() 应该可以使用。

但是,只有 Object obj() 可以在堆栈空间中构造对象。


Object obj() 可以作为全局变量存在,不会在堆栈上分配。 - Andrey
6
Object obj(); 声明了一个名为 obj 的函数,该函数不带参数并返回一个 Object - fredoverflow

6

只需要使用 Object obj;,就可以创建对象 obj


2
可能那就是他需要的,但我们不能把它视为理所当然。 - Benoit

1

我本来想留下评论的,但显然我需要一定的声望才能这样做。

在Java中,用于存储对象的变量隐式地指向该对象的指针。因此,在C++和Java中,new的工作方式是相同的,但在Java中你并不会意识到它。我猜这就是你困惑的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接