gpt4 book ai didi

c++ - 构造函数如何比类中的成员变量更早被调用?

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:43 24 4
gpt4 key购买 nike

考虑以下代码:我知道当你创建 C 类的对象时,首先将构造成员变量,然后构造顺序将是 abc 和解构 CBA 。现在的问题是,是否有一种方法可以比成员变量更快地调用 C 类的构造函数?有 cab 的秩序和解构 BAC

我如何改变顺序,这样首先调用类的构造函数,然后调用成员变量。

#include <iostream>
#include <exception>

class A {
public:
A() {
std::cout << 'a';

}
~A() { std::cout << 'A'; }
};


class B {
public:
B() { std::cout << 'b'; }
~B() { std::cout << 'B'; }

};

class C {
public:
C() {
std::cout << 'c';

}
~C() { std::cout << 'C'; }

A m_a ;
B m_b;
};


void foo() { C c; }

int main() {
try {
foo();
}
catch (std::exception &) {
std::cout << "catch";

}
}

最佳答案

比实际破坏施工顺序(这是不可能的)更多的解决方法。通过智能指针存储成员。

class C {
public:
C() {
std::cout << 'c';
m_a = std::make_unique<A>();
m_b = std::make_unique<B>();
}
~C() {
m_b.reset();
m_a.reset();
std::cout << 'C';
}

std::unique_ptr<A> m_a;
std::unique_ptr<B> m_b;
};

您关心的实际对象的实例现在可以在 C 的构造函数的末尾创建。当然,您需要通过进行动态内存分配来为此付出代价。

另一种解决方案是使用对齐存储和放置新结构:

class C {
public:
C() {
std::cout << 'c';
new(&m_a) A;
new(&m_B) B;
}
~C() {
m_b.~B();
m_a.~A();
std::cout << 'C';
}

std::aligned_storage<sizeof(A), alignof(A)>::type m_a;
std::aligned_storage<sizeof(B), alignof(B)>::type m_b;
};

但无论哪种方式,您都必须非常小心并遵循rule of three/five .

关于c++ - 构造函数如何比类中的成员变量更早被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40907027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com