2017-02-20 41 views
3

在下面简单的两类在C++中,你能创建一个对象作为arg来运行吗?

 
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

您可以通过编写一些代码在C++中用文本编辑器创建一个类。一个C++程序不能创建一个类。它创建**对象**。请了解区别并使用正确的术语。 –

+1

就你而言,你会得到一个即将被破坏的临时对象的地址。因此这将是有风险的。 – skypjack

+1

我想这是合法的,但毫无意义(双关语意) – slawekwin

回答

4

您可以即时创建对象。任何C++程序都会一直这样做。这样的对象被称为临时对象。

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

2

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

做到这一点(in Qt, for instance,请参阅“插入数据”)的典型方法是使用指针(我不鼓励这种,请阅读下文):

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

这是安全的,但是危险的,因为你将不得不自己释放那段记忆。因此,您应该考虑使用unique_ptrshared_ptr

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

+0

这并不危险,但通常使用'new'在堆上创建对象并使用'delete'销毁它们。它始终在代码中发生。您将学习如何在每个C++课程中正确使用它们。 – JHBonarius

+0

@ J.H.Bonarius这是有史以来最糟糕的做法。千万不要在面试中说出你在这里所说的话,这是我对你的建议。再次:了解智能指针。 –

+0

@ J.H.Bonarius Btw,我注意到你是一名嵌入式工程师。请注意,我们正在讨论C++,而不是C。在嵌入式系统中,一切都不一样。如果你有C++,并且你有“析构函数”的概念工作正常,那么你不应该手动删除对象。 –

2

即使可以,它也会导致未定义的行为。程序可能会或可能不会工作,这取决于不可预测的情况。

相关问题