繁体   English   中英

C ++构造函数混淆

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM