在C ++中,你可以创建一个对象作为arg来运行吗?

时间:2017-02-20 07:26:20

标签: c++ object

在以下简单的两个类

class B {
  private:
    int i;
  public:
    B( int p_i ) { i = p_i; };
}
class C {
  private:
    B* b;
  public:
    C( B* p_b ) { b = p_b; };
}

B作为C()的参数创建是否合法?

例如,

C c = C( &B(5) );

合法,即时创建B

3 个答案:

答案 0 :(得分:4)

您可以动态创建对象。任何C ++程序都会一直这样做。这些物体被称为临时物品。

你不能拿一个临时的地址。所以&B(5)是非法的。如果您尝试编译此代码,编译器会告诉您。

答案 1 :(得分:2)

你在做什么编译,但这是错的!除非你在构造函数中复制它,否则会立即创建和销毁该对象,这是一种浪费。

执行此操作的典型方法(in Qt, for instance,请参阅“插入数据”部分),是使用指针(我不鼓励这样做,请参阅下文):

C c = C( new B(5) );

这是安全的,但是很危险,因为你必须自己释放那些记忆。因此,您应该考虑使用unique_ptrshared_ptr

在Qt中这是正常的原因,是因为Qt以不同的方式管理内存。 C将是B对象的,并在其自身被销毁时将其删除。

答案 2 :(得分:2)

即使你可以,它也会导致未定义的行为。根据不可预测的情况,程序可能会也可能不会起作用。