不
A a = new A(); // A is a class name
应该在C ++中工作吗?
我得到了:
从'A *'转换为非标量 输入'A'请求
这行代码有什么问题?
这适用于Java,对吗?
另外,在C ++中创建A
类型的新对象的正确方法是什么呢?
答案 0 :(得分:9)
不,不是。新操作返回指向新创建的对象的指针,因此您需要:
A * a = new A();
您还需要在代码中的其他位置管理对象的删除:
delete a;
然而,与Java不同,通常不需要在C ++中动态创建对象,并且只要有可能,您应该避免这样做。而不是上述,你可以简单地说:
A a;
,编译器将为您管理对象的生命周期。
这是非常基本的东西。您使用哪种C ++教科书并不涵盖它?
答案 1 :(得分:2)
new A()
返回指针A*
。你可以写
A a = A();
使用默认构造函数创建一个临时实例,然后为一个甚至更好的方法调用复制构造函数:
A a;
只使用默认构造函数创建一个。或者,如果你想要一个指针,你可以写
A* a = new A();
可以让您更灵活,更有责任感。
答案 2 :(得分:2)
当您想要实例化指向对象的指针时,使用关键字new
:
A* a = new A();
它被分配到堆上..当你没有指针而只是一个真正的对象时,你只需使用
A a;
这声明了对象并将其实例化到堆栈中(因此它将在调用内部处于活动状态)
答案 3 :(得分:1)
您需要A* a= new A();
new A();
创建并构造类型为A
的对象并将其放在堆上。它返回该类型的指针。
换句话说,new
返回对象放在堆上的地址,A*
是一种类型,用于保存A
类型对象的地址
只要您将堆与new
一起使用,就需要在地址上调用关联的delete
。
答案 4 :(得分:1)
new
为您提供指向所创建对象的指针,因此:
A *a = new A();
答案 5 :(得分:1)
首先,new返回一个指针,因此你需要将a的类型声明为'A *'。 其次,与Java不同,在A:
之后不需要括号A * a =新A;