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

时间:2013-11-22 12:27:15

标签: c++ visual-studio-2012

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

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

我有一个带有静态私有成员的静态方法的类。 当我调试时,我可以看到正在调用构造函数和复制构造函数。 我不明白为什么两个都被叫,我想只有一个会。 有没有办法让我只能调用一个构造函数?

这是我的代码

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

调用Method MyInstance时:

  1. 首先调用MyClass的构造函数
  2. 然后是CopyConstructor
  3. 然后是“返回myInstance”行。
  4. myLocalVariable持有的实例是否只是暂时的,可能会在以后被销毁?

    更新

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

    C ++ Main

    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 Cons\n";
    }
    
    MyClass::MyClass(string name)
    {
        this->name = name;
        cout << "Parameters Cons\n";
    }
    
    MyClass::MyClass(const MyClass& myClass)
    {
        name = myClass.name;
        cout << "Copy Cons\n";
    }
    
    MyClass::~MyClass(void)
    {
        cout << "Destructor\n";
    }
    
    MyClass& MyClass::MyInstance()
    {       
        cout << "MyInstance\n";
        static MyClass myInstance = MyClass("MyClassName");
        return myInstance;
    }
    

    我的输出:

      

    MYINSTANCE

         

    参数缺点

         

    复制缺点

         

    析构

2 个答案:

答案 0 :(得分:3)

只需将变量写为

即可
static MyClass instance;

如果没有参数,或

static MyClass instance(foo, bar);

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

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

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

  

myLocalVariable持有的实例是否只是暂时的

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

答案 1 :(得分:1)

  

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

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

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

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