在以下简单的两个类
中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
?
答案 0 :(得分:4)
您可以动态创建对象。任何C ++程序都会一直这样做。这些物体被称为临时物品。
你不能拿一个临时的地址。所以&B(5)
是非法的。如果您尝试编译此代码,编译器会告诉您。
答案 1 :(得分:2)
你在做什么编译,但这是错的!除非你在构造函数中复制它,否则会立即创建和销毁该对象,这是一种浪费。
执行此操作的典型方法(in Qt, for instance,请参阅“插入数据”部分),是使用指针(我不鼓励这样做,请参阅下文):
C c = C( new B(5) );
这是安全的,但是很危险,因为你必须自己释放那些记忆。因此,您应该考虑使用unique_ptr
或shared_ptr
。
在Qt中这是正常的原因,是因为Qt以不同的方式管理内存。 C
将是B
对象的父,并在其自身被销毁时将其删除。
答案 2 :(得分:2)
即使你可以,它也会导致未定义的行为。根据不可预测的情况,程序可能会也可能不会起作用。