C++中如何避免创建类实例时调用无参默认构造函数?
C++ 避免调用默认构造函数创建类对象的实现方案
这个需求是可以实现的,而且存在远优于预期写法的实现方案。首先明确C++的基础规则:不存在完全绕开构造函数创建类类型对象的可能,但可以完全满足你不调用A::A()默认构造函数、同时不需要用A t(0, 0);做无意义零初始化再赋值的要求。
最优实现方案
你完全可以直接用最终计算得到的成员值直接构造对象,不需要先创建空对象再赋值,写法如下:
A A::operator+(A const &tmp) { // 直接调用双参构造函数,无多余初始化、赋值操作 return A(this->x + tmp.x, this->y + tmp.y); }
这种写法编译器默认会开启返回值优化(RVO),连临时对象的拷贝开销都会被优化掉,是效率最高的实现方式。
特殊场景的替代方案
如果你确实有延迟构造的需求,需要先分配对象内存、之后再调用构造函数,可以用std::aligned_storage配合定位new实现,示例如下:
#include <type_traits> A A::operator+(A const &tmp) { // 先分配符合A类型对齐要求的原始内存,不调用任何构造函数 std::aligned_storage_t<sizeof(A), alignof(A)> mem_buf; A* t = reinterpret_cast<A*>(&mem_buf); // 手动调用双参构造函数,不需要走默认构造 new (t) A(this->x + tmp.x, this->y + tmp.y); A res = *t; t->~A(); // 手动调用析构函数释放资源 return res; }
注意:该方案属于偏底层的内存操作,容易出现内存泄漏、未定义行为等问题,没有特殊需求不建议使用。
原代码问题说明
你当前示例中注释了默认构造函数的情况下,A t;的写法会直接编译失败,因为编译器无法找到匹配的无参构造函数。
内容的提问来源于stack exchange,提问作者mada
相关产品推荐
相关产品推荐

