为什么我在这里调用构造函数和复制构造函数

Why I am getting the Constructor and the copy constructor called here?

本文关键字:构造函数 复制 调用 在这里 为什么      更新时间:2023-10-16

我有很多C#代码必须用C++编写。我在C++方面没有太多经验。

我正在使用Visual Studio 2012进行构建。该项目是C++中的静态库(不在C++/CLI中)。

我有一个类,它有一个带有静态私有成员的静态方法。当我调试时,我可以看到构造函数和复制构造函数都被调用了。我不明白为什么两个都会被打电话,我以为只有一个会。有没有一种方法可以让我只调用一个构造函数?

这是我的代码

MyClass& MyClass::MyInstance()
{       
    static MyClass myLocalVariable = MyClass(/*parameters*/);
    return myLocalVariable ;
}

当方法MyInstance被调用时:

  1. 首先调用MyClass的构造函数
  2. 然后CopyConstructor
  3. 然后是"return myInstance"行

myLocalVariable持有的实例是否可能只是暂时的,以后可能会被销毁?

更新:

由于有些人无法重现我的问题,我在这里添加了更多的代码。我现在有3个具有相同行为的项目(一个是我在单元测试中调用的静态库,另两个是Win32控制台应用程序)

C++主

int _tmain(int argc, _TCHAR* argv[])
{
    MyClass& instance = MyClass::MyInstance();
    return 0;
}

C++MyClass.h

#pragma once
#include <string>
using namespace std;
class MyClass
{
private:
    string name;
public:
    MyClass(void);
    MyClass(string name);
    MyClass(const MyClass&);
    ~MyClass(void);
    static MyClass& MyInstance();   
};

C++MyClass.cpp

#include "MyClass.h"
#include <iostream>
using std::cout;
MyClass::MyClass(void)
{
    cout << "Empty Consn";
}
MyClass::MyClass(string name)
{
    this->name = name;
    cout << "Parameters Consn";
}
MyClass::MyClass(const MyClass& myClass)
{
    name = myClass.name;
    cout << "Copy Consn";
}
MyClass::~MyClass(void)
{
    cout << "Destructorn";
}
MyClass& MyClass::MyInstance()
{       
    cout << "MyInstancen";
    static MyClass myInstance = MyClass("MyClassName");
    return myInstance;
}

我的输出:

Myinstance

参数Cons

复制Cons

自毁

只需将变量写为

static MyClass instance;

如果没有参数或

static MyClass instance(foo, bar);

如果有的话。或者,由于这是MSVC 2012,可能支持统一的初始化语法:

static MyClass instance{/*args here, could be empty*/};

这将原位初始化变量,而不是初始化临时变量并将其复制到目标。(编译器可以省略副本,但在您的情况下显然不会。)

myLocalVariable持有的实例是否可能只是临时

请注意,首先,正确的单词是"临时",其次,myLocalVariable实例,它不包含一个。除非明确使用指针或引用,否则C++对象的行为更像C#结构,而不是类,因为变量不包含引用,它们实际上是对象。

myLocalVariable持有的实例是否可能只是暂时的,以后可能会被销毁?

myLocalVariable是静态的,因此不会被销毁,并且在每次调用MyInstance 时都可用

MyClass& MyClass::MyInstance()
{       
    static MyClass myLocalVariable = MyClass(/*parameters*/);
    return myLocalVariable ;
}

这只会调用1个构造函数,即param构造函数,因为myLocalVariable是通过引用而不是值返回的。