gpt4 book ai didi

c++ - 如何声明一个对象但不运行构造函数?

转载 作者:太空宇宙 更新时间:2023-11-04 15:04:52 25 4
gpt4 key购买 nike

我在 main() 的整个生命周期内都需要一个 MyClass 对象,但前提是某些标志 useMyObject 为真。

  • 我相信声明 MyClass myObject 运行构造函数。真的吗?我无法查找它。
  • 如果是,我怎样才能避免两次调用构造函数?

构造函数获取我只想获取一次且仅在设置标志时获取的资源。这是我的代码:

int main() {
MyClass myObject;
// ...
if ( useMyObject ) {
myObject = MyClass(42);
}
// ...
}

最佳答案

一个简单的方法是使用std::unique_ptr:

std::unique_ptr<MyClass> myObjectPtr;

if(useMyObject)
myObjectPtr.reset(new MyClass(42));

if(myObjectPtr)
myObjectPtr->method();

但请注意,它需要进行堆分配,这实际上可能比“空”构造更昂贵。为避免堆分配成本,您可以使用 boost::optional,它的用法类似于指针,但实际上对象的存储是在堆栈上分配的:

boost::optional<MyClass> myObject;

if(useMyObject)
myObject = MyClass(42);

if(myObject)
myObject->method();

正如您在上述任何情况中看到的那样,代码中会充斥着条件。

如果允许您更改 MyClass,我建议您使用非参数构造函数构造一个“空”对象。您只需要将对象构造成它实际上什么都不做的状态,但如果使用它不应该使应用程序崩溃。那个空的建筑应该很便宜,而且它只是一次性成本。

如果您可以将对象移动到实际使用它的范围内并完全避免未初始化/空对象,那就更好了:

if(useMyObject) {
MyClass myObject(42);
// use the object here and nowhere else.
}

关于c++ - 如何声明一个对象但不运行构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18758892/

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