在C++中,你能否创建一个对象作为函数的参数?

3
在下面的两个简单类中:
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 的同时创建 C 对象是否合法?

3
通过编写一些代码,你可以在C ++中使用文本编辑器创建一个类。C ++程序无法创建一个类,它只能创建对象。请了解两者之间的区别并使用正确的术语。 - n. m.
1
在您的情况下,您正在获取一个临时对象的地址,该对象将立即被销毁。因此这是有风险的。 - skypjack
1
我猜这是合法的,但毫无意义(双关语)。 - slawekwin
@n.m. - 对的,已经更正。 - cc young
3个回答

4

你可以动态创建一个对象。任何C++程序都在一直这样做。这些对象被称为临时对象。

然而你不能取得一个临时对象的地址。所以&B(5)是非法的。如果你尝试编译这段代码,你的编译器会告诉你。


2
你所做的编译通过了,但是是错误的!该对象将会被立即创建和销毁,除非你在构造函数中复制它,这是浪费的。
一种典型的方法(例如,在Qt中,参见“插入数据”部分链接1)是使用指针(我不鼓励这样做,请阅读下文):
C c = C( new B(5) );

这是安全的,但也很危险,因为你将不得不自己释放那块内存。因此,你应该考虑使用unique_ptrshared_ptr
这在Qt中是可行的原因是Qt以一种不同的方式管理内存。 C 将是 B 对象的“父对象”,并且当它自己被销毁时会删除它。

使用 new 在堆上创建对象并使用 delete 销毁它们是一种正常的做法,不会带来危险。这在编程中经常发生。你会在每个 C++ 课程中学习如何正确使用它们。 - JHBonarius
@J.H.Bonarius 这是最糟糕的做法。千万不要在面试中说出你在这里所说的话,这是我的建议。再次强调:学习智能指针相关知识。 - The Quantum Physicist
顺便说一下,我注意到你是嵌入式工程师。请注意我们正在谈论的是C++,而不是C。在嵌入式系统中,一切都不同。如果你有C++并且“析构函数”的概念正常工作,那么你就不应该手动删除对象。 - The Quantum Physicist
@J.H.Bonarius 智能指针是一个非常古老的概念,你可以使用析构函数来代替它(请查看2005年出版的《Professional C++》一书)。智能指针的概念在C++中已经存在很长时间了,但它取决于实现。然后出现了auto_ptr,但它在移动对象方面存在一些问题。但现在,C++11有了独特和共享指针的终极解决方案。 - The Quantum Physicist
下次我维护旧代码时,你建议我将所有的new替换为shared_ptr... 我敢打赌这会非常有效。;p - JHBonarius
显示剩余3条评论

2
即使你能这样做,它也会导致未定义的行为。程序可能会根据不可预测的条件工作或不工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接