我有很多C#代码,我必须用C ++编写。我在C ++方面没有太多经验。
我正在使用 Visual Studio 2012 进行构建。该项目是 C ++中的静态库(不在C ++ / CLI中)。
我有一个带有静态私有成员的静态方法的类。 当我调试时,我可以看到正在调用构造函数和复制构造函数。 我不明白为什么两个都被叫,我想只有一个会。 有没有办法让我只能调用一个构造函数?
这是我的代码
MyClass& MyClass::MyInstance()
{
static MyClass myLocalVariable = MyClass(/*parameters*/);
return myLocalVariable ;
}
调用Method MyInstance时:
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
参数缺点
复制缺点
析构
答案 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是通过引用而不是按值返回的。