MyObject obj = new MyObject(para1);
在Java中,我总是可以在切换到C ++时执行此操作,这会给我一个错误:从“MyObject *”转换为非标量类型的“MyObject”请求。
似乎修复它的方法是MyObject* obj = new MyObject(para1);
。
如果我想要对象本身而不是指向对象的指针怎么办?
MyObject obj(para1);
会成为对我有用的唯一方法吗?
由于我从Java切换到C ++,我也想知道:
MyObject* obj1 = new MyObject(para1);
如果我打印出obj1
的值,那么它就是一个地址。
MyObject obj2(para1);
obj2
的打印输出值是什么?
答案 0 :(得分:4)
MyObject obj(para1);
会成为对我有用的唯一方法吗?
是的,这是正常的方式。
obj2的打印输出值是什么?
如果没有重载正确的运算符,则会出现编译错误。 您使用具有以下签名的函数定义对象的打印方式:
std::ostream & operator<<(std::ostream & os, const MyObject & obj);
答案 1 :(得分:3)
在某些情况下 * ,你也可以这样做:
MyObject obj = MyObject(para1);
与Java不同,对象不从某个基类继承toString
方法。因此,除非您已定义了这样做的机制,否则无法打印出obj2
的值。标准方法是重载operator<<
:
class MyObject
{
public:
int x;
};
std::ostream &operator<<(std::ostream &os, const MyObject &obj)
{
os << obj.x;
return os;
}
...
MyObject obj;
obj.x = 42;
std::cout << obj << "\n";
<小时/> *即,如果该类具有公共拷贝构造函数。
答案 2 :(得分:0)
在C ++中,new运算符返回指向该对象的指针。要获取对象,需要使用*运算符取消引用指针(例如* obj)。
答案 3 :(得分:0)
你已经回答了自己的问题。如果你不想要一个指针,那就不要使用new ..如果你是c ++和内存管理的新手,并且你确实需要使用指针,我强烈建议使用智能指针(例如boost: :shared_ptr)而不是原始指针..
关于第二个问题,这取决于打印出来的意思。您不能只打印出一个对象,但可以调用一个知道如何打印该对象的方法。当然,您必须定义此方法。像这样:
std::ostream& operator<<(std::ostream& os, const MyObject& rhs)
答案 4 :(得分:0)
似乎修复它的方法是MyObject * obj = new MyObject(para1);.
是。 new的结果始终是指向对象的指针 注意在C ++中使用RAW指针是非常罕见的(通常将指针放入智能指针以便正确删除)。
如果我想要对象本身而不是指向对象的指针怎么办?
MyObject obj(para1) // Creates an normal automatic object
// The destructor for this obect is automatically called
// When the object goes out of scope (even when exceptions are thrown)
我也想知道:
MyObject* obj1 = new MyObject(para1);
如果我打印出obj1的值,它将是一个地址。
如果你打印出来:
std::cout << obj1; // print the address (normally).
std::cout << (*obj1); // Will print the object/
// Assuming you have defined the output operator.
MyObject obj2(para1);
std::cout << obj2; // Again prints the object
// Assuming you have defined the output operator.
std::cout << &obj2; // prints the address.
答案 5 :(得分:-1)
考虑指针运算符->
或(*obj).func()