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

标签 c++ constructor

我在 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/

相关文章:

java - 在无参数构造函数中绕过最大数组大小

c++ - 如何在STL中调​​用函数指针

c++ - OpenGL 显示列表 block glEnable(GL_COLOR_MATERIAL)

c++ - 命令行参数的元素数量

c++ - 复制构造函数和基类 C++

c++ - 当类A在构造时分配内存时,在类B的构造函数中动态创建vector <class A>

c++ - 模板定义中的条件

c++ - 当我尝试使用异常时,为什么我的代码在 Qt Creator 中使用 -fno-exceptions 进行编译?

javascript - 为什么在这种情况下 `.constructor` 指向 `object` ?

c++ - 在结构的 union 成员中使用 std::string 时无法引用默认构造函数