[英]C++ constructor confusion
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
的打印输出值是多少?
MyObject obj(para1);
是对我有效的唯一方法?
是的,那是正常的方式。
obj2的打印输出值是多少?
如果尚未重载正确的运算符,则会出现编译器错误。 您可以使用具有以下签名的函数来定义对象的打印方式:
std::ostream & operator<<(std::ostream & os, const MyObject & obj);
在某些情况下* ,您还可以执行以下操作:
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";
在C ++中,new运算符返回指向该对象的指针。 要获取对象,您需要使用*运算符(例如* obj)来取消引用指针。
您已经回答了您自己的问题。 如果您不希望使用指针,则不要使用new。如果您不熟悉c ++和内存管理,并且确实需要使用指针,则强烈建议您使用智能指针(例如boost: :shared_ptr)而不是原始指针。
至于第二个问题,这取决于您打印输出的意思。 您不仅可以打印出一个对象,还可以调用一个知道如何打印出该对象的方法。 当然,您必须定义此方法。 像这样:
std::ostream& operator<<(std::ostream& os, const MyObject& rhs)
似乎解决该问题的方法是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.
考虑一下Pointer-Operator- ->
或(*obj).func()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.