假设我有一个类
class A { public: A(int i); ~A(); private: B b; // Want <- this guy to be constructed with i in A's constructor! };我希望 b 在构造函数中构造,其中的特定参数在构造 A 之前是未知的。如果我在 A 的构造函数中执行以下操作:
A::A(int i) { B b(i); // Or even if I try to do b = B::B(i); }
我注意到 b get 在堆栈上分配了两次!啊。
然后我发现在A的构造函数中我可以做的是:
A::A() : b(B::B(7)) { }
并且 b 只在堆栈上分配一次!
但这很笨重。有人有更好的主意吗?请记住,构造函数只能调用一次!
这是使用重要参数非动态分配对象的标准方法吗?如果我们可以将 b 的构造推到那个奇特的参数列表中会怎样!?您被迫在堆栈上动态分配或构造 TWICE!
奖励问题:b 什么时候被释放?是在A的析构函数之后还是之前
最佳答案
很抱歉,你完全错了。
你需要做的是拿起一个good beginner's C++ book .这是该语言的基础部分,如果您不理解这一点,您将在处理重要的 C++ 代码时遇到困难。
也就是说,当一个对象即将被创建时,所有的子对象都会先被创建。如果您需要将参数传递给那些子对象构造函数,则需要创建所谓的初始化列表:
A::A(int i) : b(i) {}
冒号之后和第一个大括号之前的内容是初始化列表。只有构造函数可以拥有它们。这里发生的事情是我们将 i
的值传递给 b
子对象的构造函数。这发生在 A
的构造函数被调用之前!
所以对于你的情况,构造顺序是:
b
子对象A
对象本身
破坏的顺序是完全相反的过程。
关于c++ - 在堆栈上创建 C++ 对象,努力不分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3911491/