C ++构造函数混淆

时间:2011-12-09 16:55:33

标签: c++ constructor

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的打印输出值是什么?

6 个答案:

答案 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()